I2C总线初级使用
I2C总线是一种PCB板上的片上总线,其传输距离仅有两米,用于板子上各芯片模块间的通信,其能作为片上总线的原因是I2C总线是同步通信,能够保证各模块间的时序一致,不易出错,另一个很重要原因是它仅需要两根线即可完成数据的发送与接收,即半双工通信,大大减少了板子上的布线数量,降低布线难度。
I2C介绍:
I2C总线可用于多点通信,但是它具有主从模式之分,只有主设备才可发起通信,从设备可接收或者返回数据,同一时刻只能有一个主设备,并且主设备与主设备之间不可通信。
I2C总线有两根线,分别是时钟线(I2C_SCL)和数据线(I2C_SDA),两根线需要连接最大阻值为2K的上拉电阻,所有设备均需要连接同一个地线,时钟线是主设备发送时序时钟的线,并且只能由主设备发送,它为总线提供通信时钟,实现同步通信。数据线是设备间发送数据的线,可来自主设备或从设备。
I2C使用:
I2C总线中接入的每一个设备都有自己独有的器件地址,其次在器件中还有各种功能寄存器和数据寄存器,这些寄存器也有地址,被称为子地址;当要读取或操作寄存器时,主机需发送器件地址与子地址,然后接收由从设备发送的数据。
读写数据流程如下(省略清除标志位等待):
发送N个字节的数据
- 等待I2C总线退出忙碌状态
- 起始信号
- 发送器件地址
- 发送寄存器地址
- 循环发送N个数据
- 终止信号
读取N个字节数据
- 起始信号
- 发送器件地址,目标为发送方向
- 发送寄存器地址(可作为起始地址,读取之后的N个字节地址的数据)
- 重复起始信号
- 发送器件地址,目标为接收方向
- 循环接收N个数据
- 接收最后一个数据时,关闭ACK应答,使能终止信号,并接收信息
- 开启ACK应答
I2C总线协议
7位地址格式:
在发送数据时,首先是一个起始信号(SCL高电平时,SDA由高电平转向低电平),接着发送一个字节数据,此字节包括7位器件地址和1位读/写请求(1:读信息,2:写信息),然后是
ACK响应:
由接收器产生响应脉冲,响应脉冲期间,发送器会释放SDA线电平,此时为高电平,接收器会输出低电平,在时钟线SCL为高电平期间,使SDA保持稳定的低电平。
未完待续:
同步
仲裁
下一步学习目标: 自定义I2C协议。