STM32 学习笔记(九)I2C通信协议

该系列为笔者在学习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通信中,主设备通过指定从设备的地址来进行写操作。具体步骤如下:

  1. 起始条件:主设备生成起始信号。
  2. 设备地址:主设备发送目标设备的地址,并将R/W位设置为0,表示写操作,从设备返回ACK。
  3. 内部地址:主设备发送指定地址,从设备返回ACK。
  4. 数据传输:主设备发送数据字节,从设备接收数据并返回ACK。
  5. 停止条件:主设备发送停止信号,结束通信。

4.2 当前地址读

I2C的当前地址读操作用于从设备读取数据。主设备首先向从设备发送地址和读命令,然后从当前地址读取数据。具体步骤如下:

  1. 起始条件:主设备生成起始信号。
  2. 设备地址:主设备发送目标设备的地址,并将R/W位设置为1,表示读操作(下一个字节转为读的时序,无法指定寄存器地址)。
  3. 数据接收:从设备将数据通过SDA线发送给主设备,并返回ACK。
  4. 停止条件:主设备发送停止信号,结束通信。

(从设备内地址指针有一个默认值,指向内部一个寄存器,在读完当前地址的数据后,地址指针递增。)

4.3 指定地址读

在指定地址读操作中,主设备首先发送从设备的地址,并选择从设备的读取地址,完成地址定位后,开始读取数据。具体步骤如下:

  1. 起始条件:主设备生成起始信号。
  2. 设备地址:主设备发送目标设备的地址,并将R/W位设置为0,表示写操作(定位地址)。
  3. 指定地址:主设备发送指定寄存器地址,更新地址指针。
  4. 改变读/写操作:读写标志位只能是跟着起始条件的第一个字节,改变读写操作需要重新发送起始条件。
  5. 指定地址读:此时,主设备再发送目标设备地址,并将R/W位设置为1,即可进行指定地址读操作。
  6. 数据接收:从设备将数据通过SDA线发送给主设备,并返回ACK。
  7. 停止条件:主设备发送停止信号,结束通信。

代码部分在下一篇MPU6050中一起给出(近两天就会更新( •̀ ω •́ )✧)


感谢阅读

跟着光

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值