IIC 及debug方法浅析

IIC 总线本身支持多主控,成为主控的必要条件是能够主动控制数据的传输和时钟频率。

总线空闲时,上拉电阻是SDA和SDL均保持高电平,IIC器件都是集电极开路输出,遵循“线与”逻辑

也就是说,任意器件输出低电平都会拉低信号线。

任何通信都是由master发起,master 发起传输需要先发送开始位,停止传输需要发送停止位。

开始位的定义:当SCL稳定在高电平时,master 拉低SDA, 将产生一个开始位;

停止位的定义:当SCL稳定在高电平时,master 拉高SDA, 将产生一个停止位;

 

因此还可以推断出,SDA传输有效数据的时候,一定是在SCL为低电平的时候;在SCL上升沿读取SDA数据;

 

在选择从设备时,如果从设备采用7bit地址,则主设备在发起传输之前,需要先发送一字节的地址信息,

其中前7bit为设备地址,最后一位为读写标志, 0 写 1读;

之后,每次传输的数据也是1字节,从MSB开始传输

传送完8bit之后还不算完,在第8个SCL下降沿之后,第9个SCL的上升沿到来之前,master释放SDA,

slave要发出一个ACK位,以保证通信的可靠性,第9位是应答位,0是slave 成功应答,1是无应答

 

注意:

  • IIC设备的地址会在器件手册上标明;
  • 有的AP上IIC控制器没有自己的地址,也就是说它只能是master,不支持slave

 

Debug:

  • 看波形
  • 使用busybox 中的几个工具
busybox i2cdetect -l #查看系统I2C总线列表 (ls /dev/i2c* 也可以)
busybox i2cget -y -f 1 0x41 0xaf # 读i2c控制器1, 外设i2c地址0x41, 寄存器地址0xaf
busybox i2cset -y -f 1 0x41 0xaf 0x66# 写i2c控制器1, 外设i2c地址0x41, 寄存器地址0xaf,写入值0x66

 

posted on 2022-04-08 10:36  疾速瓜牛  阅读(362)  评论(0编辑  收藏  举报

导航