【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
I2C协议简介
I2C通信协议(Inter-Integrated Circuit)是由Phiilps公司开发的,它引脚少,硬件实现简单,可扩展性强,不需要USART、CAN等通信协议的外部收发设备,被广泛的应用在系统内多个集成电路(IC)间通讯。
它是一个多设备总线,即总线可以挂载多个I2C通信设备,支持多个通讯主机及多个通信从机。I2C总线只使用两条总线线路,一条双向串行数据线(SDA),一条串行时钟线(SCL)。
每条连接到总线的设备都有一个独立的地址(7位地址或者10位地址),主机可以利用这个地址进行不相同设备之间的访问。
I2C物理层
在电路中有三种状态
①高电平表示逻辑 1
②低电平表示逻辑 0
③高阻态
当通讯设备为高阻态时,即电阻很大,就像和总线断开一样
当通讯设备想表达逻辑1的时候或者空闲时,都要设置高阻态
所以当配置I2C引脚时不能配置成推挽输出,而是要配置成开漏输出(一般用在总线上输出高阻态)
总线数目受到电容限制
I2C协议层
主机写数据到从机
主机先广播从机的地址,在地址后面的这一位表示读写位,0表示写,当有这个地址的从机时,从机会回复一个应答位(ACK),然后主机向从机写数据,每发一个字节的数据,从机会回复一个应答位,当从机无法接收数据时,会回复给主机一个非应答信号,主机会发送一个停止位
主机由从机读数据
由从机读数据与写数据到从机略有不同,首先读写位不同,因为是读数据所以读写位为1,然后从机向主机发送数据,主机来回复应答信号,当主机不在接收数据时,主机会回复一个非应答信号,并发送一个停止信号,注意这里的停止信号也是主机发送的。
复合格式
是由写后读复合而成
写方向(设备地址)---写入数据(存储器的内部地址或寄存器)即先选择由从机哪个地址开始,再来读和写
通讯的起始和停止信号
起始和停止信号都是由主机产生的
数据有效性
地址及数据方向
1个字节(8位)
7位的设备地址+1个读写位
举例:
0x78 + 1 =8位设备的读地址 = 0xF1
0x78 + 0 =8位设备的写地址 = 0xF0
响应
当主机向从机写数据时,主机的数据位会在应答位时主动释放数据线SDA的控制权 ,来接收从机数据线SDA的应答信号
STM32的I2C特性及框架
在业界都了解,STM32片上外设的硬件协议会出现一些BUG,但对于初学者并没有什么影响
STM32的I2C硬件框架刨析
SMBA总线用的比较少
时钟控制逻辑
由时钟控制寄存器(I2C_CCR)控制
第15位控制I2C速度模式
0:标准模式I2C 100kbit/s
1:快速模式I2C 400kbit/s
在I2C标准模式或SMBus模式下:
Thigh = CCR ×TPCLK1(高电平时间), TPCLK1为AHB1时钟, CCR的值由我们自己写上去
Tlow = CCR ×TPCLK1(低电平时间) TPCLK1为AHB1时钟 同上
当想设置快速模式时,应该设置DUTY位设置占空比
0:低电平的时间是高电平的时间的2倍
1:低电平的时间是高电平的时间的16/9倍
数据控制逻辑
地址及数据方向
I2C为高位先行的
STM32的I2C通信过程
1、做为主发送器
2、做为主接收器
来源:oschina
链接:https://my.oschina.net/u/4306685/blog/3154170