《STM32从零开始学习历程》@EnzoReventon
I2C理论部分——物理层
相关链接:
I2C协议层介绍
I2C固件库介绍
STM32的I2C特性及架构介绍
参考资料:
[野火EmbedFire]《STM32库开发实战指南——基于野火霸天虎开发板》
[正点原子]STM32F4开发指南-库函数版本_V1.2
[ST]《STM32F4xx中文参考手册》
I2C协议简介
I2C 通讯协议(Inter - Integrated Circuit) 是由Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC) 间的通讯。
I2C物理层
I2C的物理层是一个支持多设备的总线。
“总线”是指多个设备公用的信号线。
- 在一个I2C通讯总线中,可以连接多个I2C通讯设备,支持多个通讯主机及通讯从机。
下图为I2C的通讯网络:
-
SCL与SDA总线:
SCL总线: 串行时钟线。用来数据收发同步。
SDA总线: 双向串行数据线。用来表示数据。 -
每个连接到总线上的设备都有一个独立的地址,主机利用这个地址对不同的设备进行访问。
-
总线通过上拉电阻连接到电源。当I2C设备空闲时,会输出高阻态;当所有设备都空闲时,都输出高阻态时,由上拉电阻把总线拉成高阻态。
GPIO的三种状态:
(1)高电平:输出逻辑1-----》3.3V
(2)低电平:输出逻辑0-----》0V
(3)高阻态:输出逻辑1-----》电阻无穷大;输出逻辑0-----》0V
I2C的所有设备的GPIO都要配置成开漏输出模式。
-
多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
关于通讯优先级与GPIO设置为高阻态:
主机与从机1尽进行通讯,从机2又想与主机通讯,此时就会出现总线占用的问题,如果主机想把总线电压拉低至0V,从机2想把电压提升至3.3V,那么这个时候总线上既有0V又有3.3V的请求,就会出现问题,到底是0还是3.3?因此为了避免这个问题出现,如果设备想要输出3.3V时,不要直接输出3.3V,而是输出一个高阻态,当其他设备空闲不占用总线时就可以实现总线电压为3.3V;如果说总线电压不为3.3V,那么说明改总线正在被别的设备所占用,该设备只好等待,因此可以通过这种方式避免总线的占用。此外,由此可见,0V的优先级较高。 -
具有三种传输模式:标准模式传输速率为100kbit/s ,快速模式为400kbit/s ,高速模式下可达3.4Mbit/s,但目前大多I2C 设备尚不支持高速模式。
-
连接到相同总线的IC 数量受到总线的最大电容400pF 限制。
转载:https://blog.csdn.net/qq_33693310/article/details/115361947