如何从软硬件层面,理解I2C总线的工作原理
内容提要
I2C总线是一种广泛应用且功能强大的总线,用于主机与从设备通信。它使用开漏输出控制器,在单根数据线上实现双向数据流传输。物理接口由串行时钟线(SCL)和串行数据线(SDA)组成。主机通过发送START标志初始化通讯,发送STOP标志结束通讯。数据位伴随着SCL上的每一个时钟脉冲传输。每一字节后总是伴随着来自接收方的1位ACK位。数据可以写入/读自从机,通过读写从设备内部的寄存器完成。
延伸解读
开漏输出如何避免总线冲突
I2C总线采用开漏输出,设备只能拉低总线或释放总线,不能主动输出高电平。这样,当多个设备同时通信时,不会出现一个设备输出高而另一个输出低导致的电源短路。上拉电阻负责在总线释放时将电平拉高。这种设计支持双向通信,并允许在多主机环境中通过仲裁避免冲突。
START与STOP标志的电气定义
START和STOP标志是I2C通信的边界条件。当SCL为高电平时,SDA上的下降沿表示START,上升沿表示STOP。总线在STOP后SDA和SCL均为高电平时视为空闲。重复START标志用于在不释放总线的情况下开始新的传输,防止多主机环境下丢失控制权。
ACK与NACK的机制与作用
每个字节后接收方必须发送一位ACK或NACK。ACK通过在第9个时钟周期拉低SDA表示,NACK则保持SDA高。NACK可能表示接收方忙、收到无法识别的数据、缓冲区满,或主机完成读取后通知从机停止发送。ACK/NACK机制确保数据传输的可靠性。
读写操作中的寄存器寻址
I2C从机通常有多个内部寄存器,主机通过寄存器地址进行读写。写操作时,主机发送从机地址(写位)和寄存器地址,然后写入数据。读操作时,主机先以写模式发送要读的寄存器地址,然后重复START并以读模式发送从机地址,之后从机发送数据。对于单寄存器设备,可以跳过寄存器地址直接读写。
Q&A
I2C总线为什么只需要两根线就能连接多个设备?
I2C总线使用串行时钟线(SCL)和串行数据线(SDA)两根线,所有设备都连接到这两根线上,每个设备有唯一的设备地址,主机通过地址与从机通信,因此多个外设可以共享总线。
I2C总线如何实现双向数据传输?
I2C总线使用开漏输出控制器,设备只能将总线拉低或释放总线,释放时由上拉电阻将总线拉高。这样多个设备可以共享同一根数据线而不会发生短路,从而实现双向数据传输。
I2C通信中START和STOP标志是如何定义的?
当SCL为高电平时,SDA上的下降沿表示START标志,上升沿表示STOP标志。START标志用于初始化通信,STOP标志用于结束通信。
I2C总线上的数据是如何传输和确认的?
数据位在SCL的每个时钟脉冲下传输,每个字节由8位组成,采用大端在前(MSB)方式。每个字节后跟随一个ACK位,接收方通过拉低SDA表示成功接收。
主机如何向I2C从机写入数据?
主机发送START标志和从机地址(读写位为0表示写),从机应答后,主机发送寄存器地址,从机再次应答,然后主机发送数据到寄存器,最后发送STOP标志结束。
从I2C从机读取数据的步骤是什么?
主机先发送START和从机地址(写)及要读的寄存器地址,从机应答后,主机再次发送START和从机地址(读),从机应答并发送数据,主机接收后发送NACK和STOP结束。
什么情况下I2C从机会发送NACK?
从机发送NACK的情况包括:从机正在执行实时功能无法通信、收到无法识别的数据或指令、缓冲区已满无法接收更多数据,或者主机作为接收方完成读取时发送NACK通知从机。