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