I2C通讯协议引脚少,硬件简单,可扩展性强,不需要USART、CAN等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯.
I2C物理层的特点
1.它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个I2C通讯协议中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。
2.一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA),一条串行时钟线(SCL)。数据线用来表示数据,时钟线用于数据收发同步。
3.每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址(七位或者十位,一条总线上的地址位数要一样)进行不同设备之间的访问。
4.总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态(电阻大,可以看做断路,防止设备间短路),当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
5.多个主机同时使用总线时,为了防止数据冲突,会使用仲裁方式决定由哪个设备占用总线。
高阻态表示总线空闲可以与从设备通信,当总线低电平时,表示总线繁忙(被占用),不能与其他从设备通信
6.具有三种传输模式:标准模式传输速率为100kbit/s,快速模式为400kbit/s,(100到400之间即可)高速模式下可达3.4Mbit/s,但目前大多I2C设备不支持高速模式。
7.连接到相同总线的IC数量收到总线的最大电容400pF限制。
I2C的协议层
I2C的协议层定义了通讯的起始信号和停止信号、数据有效性、响应、仲裁、同步时钟和地址广播等环节。
1. I2C基本读写过程
主机写数据到从机:
主机发送起始信号和从机地址以及写信号,相应从机地址接受到信号后发送应答信号,主机接受到应答信号后开始发送一个数据,从机接受到信号后发送应答信号,不断重复,到达指定位数的数据后,从机发送非应答信号,主机接受到信号后发送截止信号通讯结束。
主机由从机中读数据:
读写标志位改变,第一个应答不变,后面应答和数据反向,其余一样。
通讯复合格式:一般用在访问从机特定地址的数据(数据由主机到从机)
主机发送起始信号、从机地址、读写模式(一般是写方向)后,相应从机应答(A),主机继续发送从机地址内的内存地址(data),从机继续应答,主机重复发起起始信号、从机地址、读写模式(一般来说和最开始的信号一致,读写方向变成读方向),从机应答,主机开始发送数据。
2.通讯的起始和停止信号以及信号有效性
1.串行时钟线(SCL)用于产生规则的高低电平,当高电平时,接收来自数据线(SDA)上的信号(起始信号停止信号或者0、1数据),低电平时屏蔽数据线信号(数据线信号此时可以切换电平)。每个时钟周期传输一位数据。
2.数据线(SDA)电平由高到低表示起始信号S,由低到高表示停止信号P。
3.起始信号和停止信号一般由主机产生。
3.地址及数据方向
1.I2C总线上的每个设备都有自己独立的地址,主机发起通讯时,通过SDA信号线发送设备地址(SLAVE_ADDRESS)来查找从机。设备地址可以是7位或者10位。
2.紧跟设备地址的一个数据位R/W用来表示数据传输方向,数据方向为“1”时表示主机由从机读数据,为“0”时表示主机向从机写数据。
3.高位先行,数据从高位到低位一位一位发送。
4.响应
I2C的数据和地址传输都带响应。响应包括“应答(ACK)”和“非应答(NACK)”两种信号。
传输时主机产生时钟,在第9个时钟时,数据发送端会释放SDA的控制权,由数据接收端控制SDA,若SDA为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)。默认为非应答。
STM32的I2C特性及架构
软件模拟协议:使用CPU直接控制通讯引脚的电平,产生符合通讯协议标准的逻辑。
硬件实现协议:由STM32的I2C片上外设专门负责实现I2C通讯协议,只要配置好外设,他就会自动根据协议要求产生通讯协议,只要配置好该外设,他就会自动根据要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理I2C协议的方式减轻了CPU的工作,且使软件设计更加简单。
STM32的I2C外设可用作通讯的主机及从机,支持100kbit/s和400kbit/s的速率,支持7位、10位设备地址,支持DMA传输,并具有数据校验功能。
STM32的I2C架构剖析
数据控制逻辑
I2C的SDA信号主要连接到数据移位寄存器(八位)上,数据移位寄存器的数据来源及目标是数据寄存器(DR)、地址寄存器(OAR)、PEC寄存器以及SDA数据线。
当向外发送数据的时候,数据移位寄存器以“数据寄存器”为数据源,把数据一位一位地通过SDA信号线发送出去;
当从外部接收数据的时候,数据移位寄存器把SDA信号线采样到的数据一位一位地存储到“数据寄存器”中。
比较器:用于比较主机发送的地址与从机地址是否一样,决定是否响应通讯请求(监听主机的广播)。从机地址可以写入地址寄存器也可以写入双地址寄存器。
整体控制逻辑
控制寄存器(I2C_CR)
第十位应答使能,0表示无应答,1表示在接收到一个字节后返回一个应答(匹配到地址或者数据)
第九位:停止条件产生stop
第八位:起始条件产生start
状态寄存器(I2C_SR)
判断是否有应答,数据寄存器是否为空、地址是否被发送,总线是否被占用等。
STM32的I2C通讯过程
在使用I2C外设通讯时,在通讯的不同阶段它会对“状态寄存器(SR1及SR2)”的不同数据位写入参数,通过读取这些寄存器标志来了解通讯状态。
1.主发送器
1.控制产生起始信号(S),当发生起始信号后,它产生事件“EV5”,并会对SR1寄存器的“SB”位置1,表示起始信号已经发送;
2.发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”及“EV8”,这时SR1寄存器的“ADDR”位及“TXE”位被置1,ADDR 为1表示地址已经发送,TXE为1表示数据寄存器为空;
3.往I2C的“数据寄存器DR”写入要发送的数据,这时TXE位会被重置0,表示数据寄存器非空,I2C外设通过SDA信号线一位位把数据发送出去后,又会产生“EV8”事件,即TXE位被置1,重复这个过程,可以发送多个字节数据;
4.发送数据完成后,控制I2C设备产生一个停止信号§,这个时候会产生EV2事件,SR1的TXE位及BTF位都被置1,表示通讯结束。
2.主接收器
1.起始信号(S)是由主机端产生的,控制发生起始信号后,它产生事件“EV5”,并会对SR1寄存器的“SB”位置1,表示起始信号已经发送;
2.发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”这时SR1寄存器的“ADDR”位被置1,表示地址已经发送。
3.从机端接收到地址后,开始向主机端发送数据。当主机接收到这些数据后,会产生“EV7”事件,SR1寄存器的RXNE被置1,表示接收数据寄存器非空,读取该寄存器后,可对数据寄存器清空,以便接收下一次数据。此时可以控制I2C发送应答信号(ACK)或非应答信号(NACK),若应答,则重复以上步骤接收数据,若非应答,则停止传输;
4.发送非应答信号后,产生停止信号§,结束传输。