STM32总结之I2C协议

一、I2C物理层

STM32总结之I2C协议

   I2C总线有如下特点:

   1.在一个I2C总线中,可以连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。

   2.一个I2C总线只使用2条总线线路,一条为双向串行数据线SDA,一条串行时钟线SCL。

数据线用来传输数据,时钟线用于数据同步。

   3.每个连接到总线上的设备都有一个独立的地址,通讯主机可以用这个地址进行不同

设备之间的访问。

   4.总线通过上拉电阻连接到电源。当I2C设备空闲时,会输出高阻态(意思是既不输出

高电平,也不输出低电平),而当所有设备都空闲时,都输出高阻态,由上拉电阻把总线

拉成高电平。   

   5.多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定哪个设备占用总线。

   6.具有三种传输模式:标准模式,传输速率为100Kbit/s

                                      快速模式,传输速率为400Kbit/s

                                      高速模式,传输速率为3.4Mbit/s(目前大多数I2C设备尚不支持)

   7.连接到相同总线的IC数量受到总线的最大电容400pF限制。

二、I2C协议层

   I2C总线协议如下:

   1.只有在总线空闲时,才允许启动数据传送。

   2.在数据传送过程中,当时钟线为高电平时,数据线须保持稳定状态,不允许随意跳变。

时钟线为高电平时,数据线任何电平的跳变都被看做总线的起始或停止信号。

   起始信号:时钟线保持高电平,数据线电平由高到低的跳变作为I2C总线的起始信号。

   停止信号:时钟线保持高电平,数据线电平由低到高的跳变作为I2C总线的停止信号。   

   应答信号ACK和非应答信号NACK:传输时主机产生时钟,在传输完一个字节的数据后,

数据发送端将SDA的电平置高后释放SDA的控制权,在第9个时钟时,由数据接收端控制SDA。

若此时接收端将SDA电平置高,表示非应答信号NACK,若此时接收端将SDA电平置低,

则表示应答信号ACK。

   数据有效性:I2C使用SDA信号线来传输数据,使用SCL信号线进行数据同步。SDA信号线

在SCL的每个时钟周期传输一位数据。传输时,SCL为高电平时SDA数据有效,即:此时SDA

为高电平表示数据“1”,SDA为低电平,表示数据“0”’。当SCL为低电平时,数据接收方不对SDA

上的电平进行采集,在这个时候,发送方可以进行SDA电平的切换,为下一比特数据的传输做好

准备。

STM32总结之I2C协议

   地址及数据方向:I2C协议规定, 设备地址可以是7位或10位(一般7位就够了)。紧跟

设备地址的一个数据位用来表示数据传输方向,它是数据方向位,第8位或第11位。数据

方向位为1时表示主机由从机读数据,为0时表示主机向从机写数据。

STM32总结之I2C协议

响应:响应包括应答信号ACK和非应答信号NACK。作为数据接收端,无论主机从机,接收

到一个字节的数据后,若希望对方继续发送数据,则需要向对方发送ACK信号。发送方在

收到接收方发送的ACK信号后,才继续发送下一个字节的数据。若接收方希望结束数据传输,

则向发送方发送NACK信号,发送方接收到该信号后,先发送一个停止信号,然后结束这次数据传输。

停止数据传输时,主机必须向从机发送一个停止信号,不论是主机收到ACK后还是收到NACK后,

只要是结束数据传输,主机必须向从机发送一个停止信号。

STM32总结之I2C协议

    如果我们直接控制STM32的2个GPIO引脚,分别用作SCL和SDA,按照上述信号

的时序要求,输出时像控制LED灯那样,输入时则读取SDA电平,就可以实现I2C

的通讯。由于直接控制GPIO引脚电平产生I2C通信时序,需要由CPU控制每个时刻

的引脚状态,所这种软件模拟协议的方式,也称为“模拟I2C”。

   相对的,还有硬件控制的方式。STM32的I2C片上外设专门负责实现I2C通信协议。