该系列为笔者在学习STM32过程(主线是江科大的视频)中的记录与发散思考。
初学难免有所纰漏、错误,还望大家不吝指正,感谢~
1. I2C通信简介
I2C(Inter-Integrated Circuit)是一种常见的串行通信协议,广泛应用于低速设备之间的通信。I2C协议通过两条信号线(SDA和SCL)实现数据传输,支持多主机和多从机通信。I2C协议的独特之处在于,它采用了数据应答机制来保证数据传输的可靠性。
1. 带数据应答(ACK/NACK)
在I2C通信中,每传输完一个字节,接收方需要发送应答信号,表示成功接收到数据。如果接收方不发送应答信号,表示接收失败或停止数据传输,发送方会根据无应答信号采取相应的处理。
- ACK(应答):接收方成功接收数据,并准备继续接收下一个字节。
- NACK(无应答):接收方未成功接收数据,或不准备继续接收数据(如结束通信)。
(数据0表示应答,数据1表示无应答)。
2. I2C的特点
- 双线制通信:I2C协议只需要两条线:SDA(数据线)和SCL(时钟线)。
- 多主机/多从机支持:I2C总线支持多个主设备和多个从设备。
- 地址机制:每个设备通过唯一的地址标识,确保数据发送到正确的设备。
2. 硬件电路
I2C通信的硬件架构通常为“一主多从”。即系统中有一个主设备(如cpu)和多个从设备。所有的设备共享同一条SDA(数据线)和SCL(时钟线)。
- 主设备:负责生成时钟信号(SCL)并控制数据的发送和接收。主设备也负责启动和终止通信。
- 从设备:根据主设备的指令进行数据的发送或接收,每个从设备有一个唯一的地址。
- SDA(数据线):双向数据传输线,由主设备和从设备共同使用。
- SCL(时钟线):同步时钟信号线,由主设备提供。
- 上拉电阻:SDA和SCL线都需要通过上拉电阻(通常为4.7kΩ或10kΩ)连接到电源,以确保信号的稳定性。
在I2C总线上,主设备通过控制SCL线来同步通信,而所有从设备共享SDA线。通过主设备指定从设备的地址,可以实现与不同设备的通信。
设备地址
每个I2C设备都有一个唯一的地址。主设备通过发送设备地址来选择从设备并与之通信。设备地址通常是7位或10位,I2C协议使用7位地址。(相同设备低位可以由引脚灵活切换。)
3. I2C时序基本单元
I2C的时序由SCL时钟信号控制,每个时钟周期包含多个数据传输。I2C的时序基本单元包括以下几个部分:
3.1 起始条件
起始条件由主设备生成。当SCL为高电平时,主设备将SDA从高电平拉低,表示通信的开始。
3.2 终止条件
终止条件由主设备生成。当SCL为高电平时,主设备将SDA从低电平拉高,表示通信的结束。
3.3 发送一个字节
每次发送数据时,数据在SDA线上按位传输(高位先行),此时要释放SCL(允许主设备控制SCL),在SLC高电平时读。在传输完8位数据后,从机需返回ACK信号表示数据接收成功。
3.4 接收一个字节
在接收数据时,主机根据SCL时钟信号采样SDA线上的数据。每接收到一个字节后,主机需要发送ACK信号告知发送方数据已接收。
3.5 发送应答
每次数据传输后,主机会通过SDA线发送一个(N)ACK信号,表示数据是否接收。(N)ACK是由主机在数据字节传输后的第九个时钟周期内拉低/拉高SDA来发送(数据0表应答,数据1表非应答)。
3.6 接收应答
数据传输后,主机接收一位数据,判断从机是否应答。(接收前释放SDA)
4. I2C时序
I2C的时序结构非常重要,正确的时序保证数据的有效传输。I2C的时序操作包括以下几种:
4.1 指定地址写
在I2C通信中,主设备通过指定从设备的地址来进行写操作。具体步骤如下:
- 起始条件:主设备生成起始信号。
- 设备地址:主设备发送目标设备的地址,并将R/W位设置为0,表示写操作,从设备返回ACK。
- 内部地址:主设备发送指定地址,从设备返回ACK。
- 数据传输:主设备发送数据字节,从设备接收数据并返回ACK。
- 停止条件:主设备发送停止信号,结束通信。
4.2 当前地址读
I2C的当前地址读操作用于从设备读取数据。主设备首先向从设备发送地址和读命令,然后从当前地址读取数据。具体步骤如下:
- 起始条件:主设备生成起始信号。
- 设备地址:主设备发送目标设备的地址,并将R/W位设置为1,表示读操作(下一个字节转为读的时序,无法指定寄存器地址)。
- 数据接收:从设备将数据通过SDA线发送给主设备,并返回ACK。
- 停止条件:主设备发送停止信号,结束通信。
(从设备内地址指针有一个默认值,指向内部一个寄存器,在读完当前地址的数据后,地址指针递增。)
4.3 指定地址读
在指定地址读操作中,主设备首先发送从设备的地址,并选择从设备的读取地址,完成地址定位后,开始读取数据。具体步骤如下:
- 起始条件:主设备生成起始信号。
- 设备地址:主设备发送目标设备的地址,并将R/W位设置为0,表示写操作(定位地址)。
- 指定地址:主设备发送指定寄存器地址,更新地址指针。
- 改变读/写操作:读写标志位只能是跟着起始条件的第一个字节,改变读写操作需要重新发送起始条件。
- 指定地址读:此时,主设备再发送目标设备地址,并将R/W位设置为1,即可进行指定地址读操作。
- 数据接收:从设备将数据通过SDA线发送给主设备,并返回ACK。
- 停止条件:主设备发送停止信号,结束通信。
代码部分在下一篇MPU6050中一起给出(近两天就会更新( •̀ ω •́ )✧)
感谢阅读
跟着光