I2C
I2C通讯协议(Inter-Integrated Cricuit).
1.物理层
I2C物理层
它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。
一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA),
一条串行时钟线(SCL)。数据线即用来表示数据(传输数据),时钟线用于数据收发同步。(原理:时钟线需要按相应的波频进行扫描检测电压,如高电代表逻辑1,低电平代表逻辑0,扫描到高低电平得出相应数据)
所有通讯都是由主机开始到从机的,因此时钟信号线也是从主机开始到从机的。通讯时,首先由主机产生方波到从机,进行数据同步,从机通过SCL线同步得知高电平和低电平出现的频率,根据此频率对SDA线进行数据采样。
与串口通讯不同,串口通信直接用数据线连接两个设备,且连接时不能连接其他的设备以免产生设备通讯干扰。而I2C协议通过总线通讯,只要连接总线根据相应设备的地址(每个设备的编号都是不同的)就可进行通信,只要两根总线就可控制多个外设,不存在上述问题。
注:地址一般用一个二进制七位数据来表示,最多128个设备。
总线通过上拉电阻连接到(3.3V)电源。总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
高阻态:配置GPIO时,若使用推挽输出模式,逻辑1为3.3V,逻辑0为0V;而使用高阻态时,不能使用推挽输出而应该使用开漏输出模式,逻辑1为电阻无穷大状态,逻辑0为0V。
2.协议层
I2C协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。
(1)I2C基本读写过程
主机写数据到从机:S(传输开始信号)+从机地址+R/W(置0代表写)+应答/非应答+数据+应答/非应答+数据+应答/非应答+P(传输停止信号)。(除应答/非应答,数据都是主机向从机传输,其他为数据从从机传输到主机)。
主机从从机读数据:基本同上,但R/W位置1代表读,数据传输为从机到主机。
上文提到的取地址即是广播,取地址只有主机才能对从机使用,从机不能对主机进行取址;应答/非应答是确认数据地址确实有对应从机,即需要从机发送信号确认,才会开始传输。
(2)通讯的起始和停止信号:
起始信号图
当SCL线是高电平时SDA线从高电平向低电平切换,这个情况表示通讯的起始。
当SCL是高电平时SDA线由低电平向高电平切换,表示通讯的停止。
起始和停止信号一般由主机产生。
(3)数据有效性
I2C使用SDA信号线来传输数据,使用SCL信号线进行数据同步,SDA数据线在SCL的每个时钟周期传输一位数据。
SCL为高电平的时候SDA表示的数据有效,即此时的SDA为高电平时表示数据“1”,为低电平时表示数据“0”。
当SCL为低电平时,SDA的数据无效,一般在这个时候SDA进行电平切换,为下一次表示数据做好准备。
(4)地址及数据方向
I2C总线上的每个设备都有自己的独立地址,主机发起通讯时,通过SDA信号线发送设备地址(SLAVE_ADDRESS)来查找从机。设备地址可以是7位或10位。(一般都是7位)
紧跟设备地址的一个数据位R/W用来表示数据传输方向,数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据。
(5)响应
I2C的数据和地址传输都带响应。响应包括“应答(ACK)”和“非应答(NACK)”两种信号。
传输时主机产生时钟,在第9个时钟时,数据发送端会释放SDA的控制权,由数据接收端控制SDA,若SDA为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)。
3.STM32 的I2C外设
软件模拟协议:使用CPU直接控制通讯引脚的电平,产生出符合通讯协议标准的逻辑。
硬件实现协议:由STM32的I2C片上外设专门负责实现l2C通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理l2C协议的方式减轻了CPU的工作,且使软件设计更加简单。
(1)通信引脚:
I2C框图:
(2)时钟控制逻辑
SCL线的时钟信号,由I2C接口根据时钟控制寄存器(CCR)控制,控制的参数主要为时钟频率;可选择I2C通讯的“标准/快速”模式,这两个模式分别I2C对应100/400Kbit/s的通讯速率;在快速模式下可选择SCL时钟的占空比,可选T(low)/T(high)=2或T(low)/T(high)=16/9模式;CCR寄存器中12位的配置因子CCR,它与I2C外设的输入时钟源共同作用,产生SCL时钟。STM32的I2C外设输入时钟源为PCLK1。
I2C的时钟控制寄存器CCR模式
快速模式下进一步模式控制
另
注:SMBus——
系统管理总线(SMBus)是一个两线接口。通过它,各设备之间以及设备与系统的其他部分之间可以互相通信。它基于I2C操作原理。SMBus为系统和电源管理相关的任务提供一条控制总线。一个系统利用SMBus可以和多个设备互传信息,而不需使用独立的控制线路。
系统管理总线(SMBus)标准涉及三类设备。从设备,接收或响应命令的设备。主设备,用来发布命令,产生时钟和终止发送的设备。主机,是一种专用的主设备,它提供与系统CPU的主接口。主机必须具有主-从机功能,并且必须支持SMBus通报协议。在一个系统里只允许有一个主机。
SMBus与I2C区别
如何使用SMBus模式的接口
为了从I2C模式切换到SMBus模式,应该执行下列步骤:
设置I2C_CR1寄存器中的SMBus位
按应用要求配置I2C_CR1寄存器中的SMBTYPE和ENARP位。
如果你想把设备配置成主设备,产生起始条件的步骤见15.4.2 I2C主模式。否则,参见15.4.1I2C从模式。
软件程序必须处理多种SMBus协议。
如果ENARP=1且SMBTYPE=0,使用SMB设备默认地址。
如果ENARP=1且SMBTYPE=1,使用SMB主设备头字段。
如果SMBALERT=1,使用SMB提醒响应地址。
(3)数据控制逻辑
I2C的SDA信号主要连接到数据移位寄存器上,数据移位寄存器的数据
来源及目标是数据寄存器(DR)、地址寄存器(OAR)、PEC寄存器以及SDA数据线。
当向外发送数据的时候,数据移位寄存器以“数据寄存器”为数据源,把数据
一位一位地通过SDA信号线发送出去;当从外部接收数据的时候,数据移位寄存器把SDA信号线采样到的数据一位一位地存储到“数据寄存器”中。
DR[7:0] 8 位数据寄存器
接收的字节或者要发送到总线的字节。
发送模式:在 DR寄存器中写入第一个字节时自动开始发送字节。如果在启动传送 (TxE=1) 后立即将下一个要传送的数据置于 DR 中,则可以保持连续的传送流
接收模式:将接收到的字节复制到 DR 中 (RxNE=1)。如果在接收下一个数据字节 (RxNE=1) 之前读取DR,则可保持连续的传送流。
注意:
(1)在从模式下,地址并不会复制到 DR 中。
(2)硬件不对写冲突进行管理(TxE=0 时也可对DR 写操作)。
(3)如果发出 ACK 脉冲时出现 ARLO 事件,则不会将接收到的字节复制到 DR 寄存器,因而也无法读取字节。
STM32的I2C通讯过程
使用I2C外设通讯时,在通讯的不同阶段它会对“状态寄存器(SR及SR2)”的不同数据位写入参数,通过读取这些寄存器标志来了解通讯状态。
(1)主发送器
主发送器通讯过程
控制产生起始信号(S),当发生起始信号后,它产生事件“EV5”,并会对SR1寄存器的“SB”位置1,表示起始信号已经发送;
发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”及“EV8”,这时SR1寄存器的“ADDR”位及“TXE”位被置1,ADDR为1
SB位
ADDR位
(2)主接收器
主接收器通信过程
从机端接收到地址后,开始向主机端发送数据。当主机接收到这些数据后,会产生“EV7”事件,SR1寄存器的RXNE被置1,表示接收数据寄存器非空,读取该寄存器后,可对数据寄存器清空,以便接收下一次数据。此时可以控制I2C发送应答信号(ACK)或非应答信号(NACK),若应答,则重复以上步骤接收数据,若非应答,则停止传输;
发送非应答信号后,产生停止信号§,结束传输。