【STM32学习笔记】I2C协议

1.物理层

I2C物理层

1.SCL 串行时钟线

2.SDA 双向串行数据线

3.每个设备有独立的地址

4.每个设备在空闲状态时都会输出高阻态,所有都为空闲状态时,则总线被上拉为高电平

5.SDA 设备用高阻态表示高电平(1),接地表示低电平(0)

6.三种传输模式:标准传输速率为100kbit/s,快速模式为400kbits/s,高速模式为3.4Mbit/s(大多数设备不支持)

2.协议层

1.I2C基本读写过程

I2C的协议层

1. 数据和时钟线都为高时总线处于空闲状态

2. 当SCL为高电平时SDA的下降沿为起始条件(S)

3. 当SCL为高电平时SDA的上升沿为停止条件(P)

4. 当SCL为高电平时,SDA的数据有效,否则无效

2.地址及数据方向

数据方向

前七位为从机地址,最后一位为读写方向位

从高位开始传输

3.响应

I2C通信规则

当数据端释放SDA控制权后,若接收端控制SDA为低电平时(在第9个时钟),则产生了应答信号(ACK),若为高电平,即无动作,则产生非应答信号(NACK)

3.STM32的I2C架构

1.通讯引脚

STM32 I2Cx(x=1,2)引脚


I2C1

默认复用

SCL:PB5 SDA:PB6
重定义
SCL:PB8 SDA:PB9

I2C2

默认复用

SCL:PB10 SDA:PB11

2.时钟控制逻辑

时钟控制逻辑

时钟控制寄存器 I2C_CCR

CCR寄存器位

1.I2C模块的时钟频率必须是10MHz整数倍
2.PE为0时才能配置CCR寄存器
3.标准模式下(100kbit/s) Thigh = Tlow(注:T = Thigh + Tlow,这里的100kHz的周期应当是二者相加)
4.DUTY 位标准模式没关系,是用来设置快速模式的占空比(2:1 16:9)
5.CCR根据自己配置的I2C模式自行计算
若PCLK = 8MHz (FREQ寄存器控制)
100kbit/s 对应的 CCR = 0x28 = 40
400kbit/s 对应的 CCR = 0x0A = 10

3.数据控制逻辑

I2C_DR

数据控制逻辑


4.整体控制逻辑

I2C_CR1

I2C_CR2

I2C_SR1

I2C_SR2

I2C配置由CR1 和 CR2 寄存器配置

工作时的状态由SR1 和 SR2 寄存器显示

4.STM32 I2C 通讯过程

1.主发送器模式

7位发送模式

7位主发送模式过程:

  1. Start 信号产生。

  2. EV5事件产生,SB = 1 ,即开始条件发送完成位置1,读SR1 寄存器,并写入DR寄存器能清除该事件。

  3. 把地址写入DR寄存器。

  4. 接收到ACK信号。

  5. 产生EV6事件,ADDR(地址已被发送位) = 1 ,当收到地址的ACK后该位被置1,读SR1 和 SR2 会清除该位。

  6. 产生EV8_1事件, TXE(数据寄存器为空位) = 1 ,移位寄存器和数据寄存器都为空,写入DR寄存器可以清除该标志位。

  7. 写入DR寄存器。

  8. 产生EV8事件,TXE(数据寄存器为空位) = 1 ,数据寄存器为空,移位寄存器不为空,写入DR寄存器可以清除该位。

  9. 接收到ACK应答信号。

  10. 写入DR寄存器(第二次发送数据)。

  11. 产生EV8事件,TXE(数据寄存器为空位) = 1 ,数据寄存器为空,移位寄存器不为空,写入DR寄存器可以清除该位。

  12. 所有数据发送完成后产生EV8_2事件,此时BTF 和 TXE = 1 。

  13. 发送停止信号

10位主发送模式过程同理

2.主接收器模式

7位主接受

7位主接收模式过程:

1. Start 信号产生。
2. EV5事件产生,SB = 1 ,即开始条件发送完成位置1,读SR1 寄存器,并写入DR寄存器能清除该事件。
3. 把地址写入DR寄存器。
4. 接收到ACK信号。
5. 产生EV6事件,ADDR(地址已被发送位) = 1 ,当收到地址的ACK后该位被置1,读SR1 和 SR2 会清除该位。
6. 产生EV6_1事件,用于接收1个字节,需要清除响应(ACK)和停止条件(STOP)的产生位。
7. 主机产生ACK应答信号。
8. 产生EV7事件,RXNE = 1 ,此时DR寄存器不为空,需要读DR寄存器来清除该事件。
9. 主机产生ACK应答信号。
10. 产生EV7_1事件,RXNE = 1 ,此时DR寄存器不为空,需要读DR寄存器来清除该事件。并且需要设置ACK = 0 ,STOP = 1。
11. 主机产生NACK非应答信号。
12. 主机产生STOP信号。
13. 产生EV7事件。

10位主接收模式过程同理

5. STM32 IIC 库函数

1.I2C 初始化结构体

I2C 初始化结构体

1.I2C_ClockSpeed

I2C ClockSpeed

注:I2C的标准和快速模式已经在这里配置完成,根据输入的时钟值来确定,小于等于100k为标准,否则为快速

2.I2C_Mode

I2C Mode

3.I2C_DutyCycle

I2C_DutyCycle

4.I2C_OwnAddress1

I2C_OwnAddress1

5.I2C_Ack

I2C_Ack

6.I2C_AcknowledgedAddress

I2C_AcknowledgedAddress