一、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电平的切换,为下一比特数据的传输做好
准备。
地址及数据方向:I2C协议规定, 设备地址可以是7位或10位(一般7位就够了)。紧跟
设备地址的一个数据位用来表示数据传输方向,它是数据方向位,第8位或第11位。数据
方向位为1时表示主机由从机读数据,为0时表示主机向从机写数据。
响应:响应包括应答信号ACK和非应答信号NACK。作为数据接收端,无论主机从机,接收
到一个字节的数据后,若希望对方继续发送数据,则需要向对方发送ACK信号。发送方在
收到接收方发送的ACK信号后,才继续发送下一个字节的数据。若接收方希望结束数据传输,
则向发送方发送NACK信号,发送方接收到该信号后,先发送一个停止信号,然后结束这次数据传输。
停止数据传输时,主机必须向从机发送一个停止信号,不论是主机收到ACK后还是收到NACK后,
只要是结束数据传输,主机必须向从机发送一个停止信号。
如果我们直接控制STM32的2个GPIO引脚,分别用作SCL和SDA,按照上述信号
的时序要求,输出时像控制LED灯那样,输入时则读取SDA电平,就可以实现I2C
的通讯。由于直接控制GPIO引脚电平产生I2C通信时序,需要由CPU控制每个时刻
的引脚状态,所这种软件模拟协议的方式,也称为“模拟I2C”。
相对的,还有硬件控制的方式。STM32的I2C片上外设专门负责实现I2C通信协议。