文章内容根据野火学习教程进行整理,仅仅是学习记录。
开发板: 野火STM32F429-挑战者V2
官方固件库版本: STM32F4xx_DSP_StdPeriph_Lib_V1.8.0
一、物理层
- I2C由两条总线线路组成。SDA为双向串行数据线,通过高低电平按bit进行传输数据。SCL串行时钟线,用于数据收发同步。
- 在一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。
- 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
- 总线通过上拉电阻(上拉电阻大多数情况是4.7K)接到电源。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
- 由于空闲时要输出高阻态,所以在GPIO配置时要使用开漏输出。
- 主机可以向从机发送读/写命令及数据,多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
- 从机只能接收主机的读写命令然后接收主机数据或者反馈数据,不能主动联系主机。
- 具有三种传输模式:标准模式传输速率为100kbit/s ,快速模式为400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多I2C设备尚不支持高速模式。
- 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 。
二、协议层
1、I2C的读写过程
(1)主机和从机的数据读写
- S 是传输开始信号,P 是传输停止信号,都由主机发送。
- SLAVE_ADDRESS为从机地址,由主机发送,用于指定要对哪个设备进行读写操作。
- R/W为读写标志位,0表示主机要向从机写数据,1表示主机要向从机读数据。
- A为应答信号(ACK/NACK)。从机向主机发送数据主机会应答,主机向从机发送数据从机会应答。
- DATA为传输的数据。
(2)读写复合格式
- 复合格式用在对同一个从机设备需要改变读写方向时用到。
- 当主机需要改变对从机的读写方向时,就从新发起起始信号、从机地址、读写方向。
- 这种做法相比发送停止指令P后再重新发起起始信号的做法效率更高一些。
2、起始和停止信号
- 起始信号(S):当SCL为高电平时,SDA由高电平变为低电平。
- 停止信号(P):当SCL为高电平时,SDA由低电平变为高电平。
- 起始信号和停止信号一般由主机发起。
3、数据有效性
- SDA传输数据信号,通过高低电平表示0和1。高电平(1)、低电平(0)。
- SCL传输同步时钟信号,通过高低电平表示当前SDA上的点评是否有效。高电平时SDA数据有效,低电平时SDA数据无效。
4、从机地址及读写方向
- I2C上的设备都有自己的设备地址,由7位或10位组成。
- 紧随着设备地址发送的一个位为读写位。0表示写,1表示读。
- 一般在定义的时候会把读写位和设备地址位组合定义成一个8bit的变量。
举例:
有个设备地址为1010111(0x57)。
那么在文档和代码中可能会直接把读写标志位与设备地址组合成该设备的读地址和写地址。
读地址为:1010111 1,即0xAF。
写地址为:1010111 0,即0xAE。
5、响应
- 响应分为两种:应答(ACK)、非应答(NACK)。
- 从起始信号之后,SCL第九个高电平为等待应答信号的时间节点。也就是SCL的第1到8个高电平时SDA发的是数据,SCL的第9个高电平时SDA发的是应答信号。
- 在第9个时钟信号时,发送端会放弃总线控制权(高电平),接收端会反馈应答信号(高电平为非应答、低电平为应答)。