MPU6050 6 轴 无人机 平衡车
激光测距
音频编解码芯片 播放器 录音机 8388-TB140038
IIC,是一种流行的串行通信协议,在嵌入式系统中被不同的传感器和模块广泛使用。
IIC总线是一种同步、串行、半双工通信总线,由两根通信线组成,SDA用于数据传输,SCL用于时钟传输。
总线是传输数据通道,而协议就是传输数据的规则。
① 总线支持挂载多设备(一主多从、多主多从)
② 所有IIC设备的SCL连在一起,SDA连在一起
③ SCL和SDA配置成开漏输出模式,并外部接上拉电阻,确保总线空闲状态为高电平
④ 总线上从机设备都会有一个唯一的地址
⑤ 数据传输速率:标准模式100k bit/s 快速模式400k bit/s 高速模式3.4Mbit/s
为什么SCL和SDA要设置成开漏输出模式?
开漏输出主要是为了保护器件和防止干扰。
多器件共享同一条数据线和时钟线,采用推挽输出模式,若不合理安排,多个器件输出叠加在数据线上,造成信号干扰,严重时损坏器件或通信错误。
而采用开漏输出模式时,则各个器件的输出只有拉低数据线的部分,不会干扰彼此,从而提高总线的可靠性和抗干扰能力。
IIC总线线与功能:有一个节点发送低电平时,总线上就表现为低电平。
注意:上拉电阻的阻值通常是4.7K,通信距离也不要过长,一般限制在1~2米内。
2
IIC通信协议时序 - 起始信号 & 停止信号
SCL线的信号由主机控制
SDA线的信号由通信双方共同参与控制
空闲状态:高电平
开始IIC通信:起始信号(S)
- 当SCL为高电平时,SDA从高电平变为低电平
结束IIC通信:停止信号§
- 当SCL为高电平时,SDA从低电平变为高电平
- 当SCL为高电平时,SDA从低电平变为高电平
IIC通信协议时序 - 数据有效性
- 数据准备阶段:SCL为低电平期间,SDA的数据(高电平或低电平)才能改变
- 数据读取阶段:SCL为高电平期间,SDA的数据(电平状态)必须稳定
数据以字节(8bit)传输
数据先发送高位
发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL(高电平),从机将在SCL高电平期间读取数据位,循环8次,即可实现主机发送一个字节。
接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL(高电平),主机将在SCL高电平期间读取数据位,循环8次,即可实现主机接收一个字节。
3
IIC通信协议时序 - 应答信号
主机发送1字节数据到从机场景
主机发送完一个字节数据后,在下一个SCL时钟高电平时接收一位数据,判断从机是否应答,0表示应答,1表示非应答
注意:主机在接收前,需释放SDA
主机从从机接收1字节数据场景
主机在接收完一个字节数据后,在下一个SCL时钟高电平时发送一位数据,0表示应答,1表示非应答
数据以字节传输
数据在SCL高电平稳定
数据先发送高位
注意:释放SDA (向下的箭头)
IIC时序
时序图拆解(从左到右,按时间顺序)
- S (起始信号):主机拉低 SDA,同时 SCL 为高电平,宣布通信开始。
- SLAVE ADDRESS (7bit):主机发送目标从机的 7 位设备地址,相当于在总线上喊:“我要找这个地址的设备”。
- R/W (1bit):读写标志位。图中标注了‘0’ (write),即该位设为低电平(0),代表写操作。
- A (应答位):主机发完地址后释放 SDA,对应的从机拉低 SDA 作为回应(ACK),表示:“我收到呼叫了”。
- DATA (第1个数据):这是关键点!第一个数据字节,是主机发给从机的寄存器地址(Reg Address)。告诉从机:“我要操作你内部的这个位置”。
- A (应答位):从机接收完寄存器地址后,再次拉低 SDA 回应(ACK),表示:“我找到那个寄存器了,准备好接收数据了”。
- DATA (第2个数据):主机发送真正想要写入该寄存器的数据(Data)。
- A/(\overline{A}) (应答位):从机接收完数据后,回应应答(ACK)。表示:“数据已安全保存”。(注:在写操作中,最后一个字节通常也是从机回复 ACK,图中的 A/(\overline{A}) 表示可能被主机或从机应答,但在标准写操作中,最后一个字节也是从机 ACK)。
- P (停止信号):主机在 SCL 高电平期间,将 SDA 由低拉高,宣布通信结束,释放总线。
- data transferred (n bytes + acknowledge):图中展示的是写入 1 个寄存器地址 + 1 个数据字节。实际上,如果你要连续向相邻的寄存器写入多个数据,在第一个数据(Reg Address)之后,你可以继续发送多个数据字节(Data1, Data2, Data3…),每发送一个字节,从机都会回复一个应答(ACK)。这就叫连续写(页写)。
这种读操作不需要先发送要读取的寄存器地址(Reg Address)。从机内部有一个“地址指针”,它会记住上一次被访问的寄存器位置。当你直接发起读操作时,从机会从那个指针当前指向的位置开始把数据发给你。
数据在 SDA 线上的完整传输过程:
- S (起始信号):主机拉低 SDA,同时 SCL 为高电平,告诉所有设备“通信开始”。
- SLAVE ADDRESS (7bit):主机发送目标从机的 7 位地址,相当于在喊“我要找那个地址为 XXX 的设备”。
- R/W (1bit):读写位。图中标明了
1,代表Read(读)。如果是0则是写。 - A (应答位):主机发送完地址和读命令后释放 SDA,被选中的从机拉低 SDA 作为回应(ACK),表示“我在,准备好了”。
- DATA (第1个数据):从机开始把数据放到 SDA 线上。主机在 SCL 高电平期间读取这 8 位(1字节)数据。
- A (应答位):主机读完 1 字节后,如果还想继续读,就发出应答(ACK,通常拉低 SDA),告诉从机“收到了,继续发下一个”。
- DATA (第2个数据):从机发送下一个字节的数据。
- (\overline{A}) (非应答位 NACK):关键点!当主机读到最后一个字节,不想再读下去了,主机就会不拉低 SDA(保持高电平),发出非应答信号(NACK)。从机收到 NACK 后,就会知道:“哦,他读完了,我该释放 SDA 并停止发送了。”
- P (停止信号):主机在 SCL 高电平时,将 SDA 由低拉高,表示通信结束,释放总线。
当前地址读的流程:发地址+读指令 ➔ 收数据 ➔ 回ACK继续收 ➔ 不想收了回NACK ➔ 发停止信号。
IIC(I2C)通信协议中相对复杂但最实用的一种时序:“指定地址读”(也叫随机读)。
因为 IIC 总线是半双工的,主机不能直接大喊一声“我要读你某个寄存器”就完事。它必须先“写”入要读的寄存器地址,然后再“读”出数据。这个过程需要用到**“重复起始信号(Sr)”**。
时序图拆解(从左到右)
第一阶段:假写(设定要读取的寄存器地址)
- S (起始信号):主机拉低 SDA,开始通信。
- SLAVE ADDRESS (7bit):主机发送从机设备地址。
- R/W:注意!这里必须是写(0)。下方的标注写着 “read or write”,但在指定地址读的第一步,这里发的一定是写指令。
- A (应答位):从机回复 ACK,表示收到。
- DATA (指定地址):主机发送想要读取的寄存器地址(Reg Address)。
- A/(\overline{A}) (应答位):从机回复 ACK,表示“地址我记下了”。
中间阶段:关键转折
- Sr (重复起始信号):这是整张图最核心的地方!主机在发送完寄存器地址后,不发停止信号,而是再次发起一个起始信号(Sr = repeated START condition)。
- 为什么要这样?因为如果不发 Sr,直接发 P(停止信号),从机就会结束本次通信,把刚才记下的地址忘掉。发 Sr 可以在不释放总线控制权的情况下,强行切换通信方向。
第二阶段:真读(读取数据)
- SLAVE ADDRESS (7bit):主机再次发送从机设备地址。
- R/W:这次必须是读(1)。下方的英文
direction of transfer may change at this point说明了,在重复起始信号之后,数据的方向发生了改变(从写变读)。 - A (应答位):从机回复 ACK,表示“明白,准备发数据了”。
- DATA (地址数据):此时,从机开始把刚才那个寄存器里的数据发送给主机。
- A/(\overline{A}) (应答位):
- 如果主机还想读下一个字节,就给 ACK。
- 如果主机只读 1 个字节,读完后主机给NACK(非应答 (\overline{A})),告诉从机“我读完了,别再发了”。
- P (停止信号):主机发送停止信号,释放总线。
- Sr = repeated START condition:重复起始信号,时序上的转折点。
- (n bytes + ack.)*:表示数据可以连续读取 (n) 个字节,每读一个字节,主机要给从机一个应答(ACK)。
- direction of transfer may change at this point:在此时(Sr 之后),传输方向可能发生改变(由写变为读)。