能直接用合泰的iic引脚写smbus协议吗

2 叙述IIC传输协议和IIC传输的全过程

    IIC總线是各种总线中使用信号线最少。一根线是同步时钟线SCL另一根线是传输数据线SDA。 IIC总线上可以连接多个MCU主机每个MCU都可以选择作为主模式( Master)或从模式( Slave)工作。 挂在IIC总线上的设备都可以通过编程设置地址 设备收到数据后要应答。提高数据传输的可靠性 因为IIC采用开漏输出(1.3物理層特点介绍为什么使用开漏输出),设备带电接入撤出不会影响IIC总线上的数据传输对硬件的修改很方便。

使用I2C总线设计计算机系统十分方便灵活体积也小,因而在各类实际应用中得到广泛应用

串行通信的几个标准对比如下表:

  1. IIC总线上的设备必须接共同的GND。
  2. I2C总线只使用两條总线线路SDA、 SCL。
    各器件的SDA及SCL都是线与关系:连到总线上的任一器件输出的低电平都将使总线的信号变低。
  3. 当总线空闲时两根线均为高電平
    由IIC总线系统结构图可知I2C总线通过上拉电阻接正电源。
  4. IIC设备最好设置成开漏输出IIC设备空闲时,输出高阻态

    假设挂在IIC上的设备A设置为推挽输出,设备A空闲时输出低电平(输出接GND)。于是总线因此也被迫接GND电平就会被拉低,变成低电平这将会影响到IIC的数据传输。


    若設备A设置为开漏输出空闲时输出高阻态,高阻态相当于断路这将不会影响IIC的数据传送。
  5. 仲裁方式决定占用总线设备
    多个主机同时使用總线时为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线
  6. 主模式:就是主CPU作为主机,向从机(挂载器件)发送接收数据
    從模式:就是主CPU作为从机,接收和发送主机(挂载器件)数据
    任一时刻IIC总线上只允许一个微控制器工作在主模式下,作为主控器;而另一個微控制器必须工作在从模式下作为被控器。 具有三种传输模式:标准模式传输速率为100kbit/s 快速模式为400kbit/s ,高速模式下可达3. 4Mbit/s 但目前大多I2C设备尚不支持高速模式。

通俗易懂的IIC讲解:

  1. I2C总线通过上拉电阻接正电源当总线空闲时,两根线均为高电平

  2. SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号起始信号产生后,总线处于被占用的状态

  3. ■ 数据传送时先传送最高位
    SCL为高电平的时,SDA表示的数据有效即此时的SDA为高电平时表示数据“1”,为低电平时表示数据“0”
    当SCL为低电平时,SDA的数据无效一般在这个时候SDA进行电平切换,为下一次表示數据做好准备
    ■ 传输的第一个数据 为8bit的寻址字节,寻址字节后面发送的是传输的数据
    寻址字节:D7~D1位组成从机的地址。D0位是读写位為“0”时表示主机向从机写数据,为“1”时表示主机由从机读数据被寻的从机会响应一个有效应答信号。
    最后是主机与从机之间传输数據(8bit)数据接收方接到数据会响应一个有效应答信号ACK 。
    有效应答信号ACK 为 低电平0

  4. 在数据传输完成后,总是由主控器发出停止信号但是,若主机希望继续占用总线进行新的数据传送则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址
    SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号终止信号产生后,总线处于空闲的状态

更加具体的协议图解如下:

1.5 常见的数据传输方式

灰色部分昰主机向从机传送的数据;白色部分是从机向主机传送的数据。

    主机向从机发送数据数据传送方向在整个传送过程中不变。
  1. 主机直接读取从机数据
    主机在发送第一个表示从机地址及读取操作的字节后,立即读取从机数据
  2. 主机指定位置读取从机数据
    在这个过程中当需要改变传送方向时,起始信号和从机地址都被重复产生一次但两次读/写方向位正好反相。

主机指定位置读取从机数据的过程:如下例孓
简述通过I2C接口读取设备X的寄存器Y的值的过程
发送起始信号——发送设备X地址+读写位0——读取ACK——发送寄存器地址Y——读取ACK——重复起始信号——发送设备X地址+读写位1——读取ACK——读取数据——发送NACK——发送停止信号

简述通过I2C接口读取设备X的寄存器Y的值的过程

发送起始信号——发送设备X地址+读写位0——读取ACK——发送寄存器地址Y——读取ACK——重复起始信号——发送设备X地址+读写位1——读取ACK——读取数据——发送NACK——发送停止信号

    使用CPU直接控制通讯引脚的电平产生出符合通讯协议标准的逻辑。 由STM32的IIC片上外设专门负责实现I2C通讯协议只要配置好該外设,它就会自动根据协议要求产生通讯信号收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器就能完成数据收发。這种由硬件外设处理IIC协议的方式减轻了CPU的工作且使软件设计更加简单。
  1. SDA、SCL连接到相应的引脚
    SMBA是用来做实现SMBA协议很少使用。

  2. SCL线的时钟信號由I2C接口根据时钟控制寄存器(CCR)控制,控制的参数主要为时钟频率
    ■ 可选择I2C通讯的“标准/快速”模式,这两个模式分别I2C对应100/400Kbit/s的通讯速率
    ■ CCR寄存器中12位的配置因子CCR,它与12C外设的输入时钟源共同作用产生SCL时钟。STM32的I2C外设输入时钟源为PCLK1

  3. I2C的SDA信号主要连接到数据移位寄存器上,數据移位寄存器的数据来源是数据寄存器(DR)、目标时是目标地址寄存器(OAR) PEC寄存器以及SDA数据线
    当向外发送数据的时候,数据移位寄存器以“数據寄存器”为数据源把数据一位一位地通过SDA信号线发送出去;
    当从外部接收数据的时候,数据移位寄存器把SDA信号线采样到的数据一位一位哋存储到“数据寄存器”中

  4. 整体控制逻辑负责协调整个I2C外设,控制逻辑的工作模式根据我们配置的“控制寄存器(CR1/CR2)”的参数而改变
    在外設工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR1和SR2)”只要读取这些寄存器相关的寄存器位,就可以了解I2C的工作状态常使鼡到SR2中的BUSY标志位来判断是由正在传输数据

使用12C外设通讯时在通讯的不同阶段它会对“状态寄存器(SR1及SR2)”的不同数据位写入参数,通过读取这些寄存器标志来了解通讯状态

  • 控制产生起始信号(S),当发生起始信号START后它产生事件“EV5”,并会对SR1寄存器的“SB”位置1表示起始信号巳经发送;

  • 发送设备地址(从地址通过内部移位寄存器被送到SDA线上)并等待应答信号,若有从机应答则产生事件“EV6”及“EV8”,这时SR1寄存器嘚“ADDR”位及“TXE”位被置1ADDR为1表示地址已经发送,TXE为1表示数据寄存器为空;

  • 往I2C的“数据寄存器DR”写入要发送的数据这时TXE位会被重置0,表示数據寄存器非空I2C外设通过SDA信号线一位位把数据发送出去后, 又会产生“EV8”事件即TXE位被置1,重复这个过程可以发送多个字节数据;

  • 发送数據完成后,控制I2C设备产生一一个停止信号 ( P )这个时候会产生EV2 事件,SR1的TXE位及BTF位都被置1,表示通讯结束



  • 起始信号(S)是由主机端产生的,控制发生起始信号后它产生事件“EV5”,并会对SR1寄存器的“SB”位置1表示起始信号已经发送;
  • 发送设备地址并等待应答信号,若有从机应答则产生倳件“EV6”这时SR1寄存器的“ADDR”位被置1,表示地址已经发送。
  • 从机端接收到地址后 开始向主机端发送数据。当主机接收到这些数据后会产生“EV7"事件,SR1寄存器的RXNE被置1表示接收数据寄存器非空,读取该寄存器后可对数据寄存器清空,以便接收下一次数据此时可以控制I2C发送应答信号(ACK)或非应答信号(NACK),若应答则重复以上步骤接收数据,若非应答则停止传输;
  • 发送非应答信号后,产生停止信号( P ),结束传输
    设置I2C的传輸速率,在调用初始化函数时函数会根据我们输入的数值经过运算后把时钟因子写入到I2C的时钟控制寄存器CCR。而我们写入的这个参数值不嘚高于400KHz
    库函数会根据I2C_ClockSpeed的值自动配置为快速模式或者是标准模式。 其实这两个模式的比例差别并不大一般要求都不会如此严格,这里随便选就可以了 配置STM32的I2C设备自己的地址,每个连接到I2C总线上的设备都要有一个自己的地址作为主机也不例外。地址可设置为7位或10位(受下媔I2C_AcknowledgeAddress成员决定)只要该地址是I2C总线上唯一的即可。
    STM32的I2C外设可同时使用两个地址即同时对两个地址作出响应,这个结构成员I2C_OwnAddress1配 置的是默认的、OAR1寄存器存储的地址若需要设置第二个地址寄存器OAR2,可使用I2C_OwnAddress2Config函 数来配置OAR2不支持10位地址。 配置2C应答是否使能设置为使能则可以发送响應信号。一般配置为允许应答(I2C Ack/Enable) 这是绝大多数遵循I2C标准的设备的通讯要求,改为禁止应答(12C_Ack_Disable)往往 会导致通讯错误 选择I2C的寻址模式是7位还是10位地址。这需要根据实际连接到I2C总线上设备的地址进行选择这个成员的配置也影响到l2C_OwnAddress1成员, 只有这里设置成10位模式时l2C_OwnAddress1才支持10位地址。

產生起始、停止信号函数

    标志位库函数已经宏定义好了这些标志位,如下
    可以由7-bit外设地址加上任意的最后一位构成。

 
 

 
 

 
 
 
    通过此来选择是否产生应答信号可以选择 ENABLEDISABLE。在通讯计数是设置为 DISABLE 结束通讯。

开发板上的EEPROM连接电路图:

  1. 然后通过字节写入的方法写入1 byte的数据到eeprom
    我们偠模拟时序先后产生起始信号、写入设备信号、写入数据内存地址信号、写入数据信号、结束信号来实现写数据。
  2. 最后通过指定地址的方法再读取出写入的数据
    这里我们要模拟时序先后产生起始信号、写入设备信号、写入数据内存地址信号、起始信号、读取设备信号、接收内存数据、产生结束信号。

仿真调试通过逻辑分析仪查看到的波形图。
最终实验现象可以通过串口助手观察到写入数据和读取数据一致可以通过改变写入的数据值txd来验证这是否是偶然的成功。经验证不是偶然结果

遇到的问题(应该都是关于有小电平持续时间的问题):

    起始信号的三个延时是必须的。
    第一个延时使SDA=1、SCL=1持续一段时间这个时间要大于有效的起始条件建立时间。(起始条件建立时间最小昰4700ns)
    第二个延时使SDA=0持续一段时间这个时间要大于有效的起始条件保持时间。(起始条件保持时间最小是4000ns)
    第二个延时使SCL=0持续一段时间這个时间要大于时钟低电平时间。(时钟低电平时间最小是4700ns)
 
  • 写入内存地址没有接收到响应信号问题
    想要接收写入内存地址的ack首先要拉高SCL、SDA两根线。否则无法接受到Ack原因尚不清。
    注意:在接受完ack后要把SCL置0。否则回导致后面传送数据不成功原因尚不清。
 
    在写入数据时回应ack为0,显然回应成功了但是在读取数据的时候,数据没有变化
    查找bug最后发现在模拟停止信号时序时,先把IIC_SCL置1后把IIC_SDA置0,这样导致寫入失败原因尚不清。所以在模拟结束信号时注意一定要SDA=0在前SCL=1在后,否则写入不能成功
 

课程分为:J2SE 基础阶段中级阶段,阶段; 课间会讲解一些小程序的开发:如:猜拳游戏,模拟银行柜员机程序退休金结算程序等.

我要回帖

更多关于 和泰租赁 的文章

 

随机推荐