【driver】IIC
总结得最好的文章:
https://blog.csdn.net/weixin_44933419/article/details/114991088
要点:
三种速度的工作模式
标准、快速、高速
三种信号
1、开始信号: SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。
2、结束信号: SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。
3、应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,
表示已收到数据。 CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号, CPU 接
收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为
受控单元出现故障。
这些信号中,起始信号是必需的,结束信号和应答信号, 都可以不要。
寻址
7位:
第一个字节的头7 位组成了从机地址, 最低位(LSB) 是第8 位, 它决定了传输的方向。
第一个字节的第8位是“0” , 表示主机会写信息到被选中的从机;
10位:
1111 0XXX
挂载数目
由IIC地址决定,8位地址,减去1位广播地址,是7位地址,2^7=128,但是地址0x00不用,那就是127个地址, 所以理论上可以挂127个从器件。
但是IIC协议没有规定总线上device最大数目,但是规定了总线电容不能超过400pF。
管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。实际设计中经验值大概是不超过8个器件
IIC的OD(漏极开路)要求外部有电阻上拉,电阻和总线电容产生了一个RC延时效应,电容越大信号的边沿就越缓,有可能带来信号质量风险
传输速度越快,信号的窗口就越小,上升沿下降沿时间要求更短更陡峭,所以RC乘积必须更小。
软硬件区别
软件IIC是程序员使用程序控制SCL,SDA线输出高低电平,模拟i2c协议的时序。一般较硬件IIC稳定,但是程序较为繁琐,但不难。
硬件IIC程序员只要调用IIC的控制函数即可,不用直接的去控制SCL,SDA高低电平的输出。但是有些单片机的硬件IIC不太稳定,调试问题较多。
软件可以用任意管脚,而硬件则只能用固定管脚,但同时可以用DMA,且一般效率高,速度快
总线仲裁
两个主设备同时发数据时,每发一位都会检测自己发出的信号和线上的信号是否一致,只要不一致就会放弃总线控制权
一致则继续发送,所以当有一方拉高,一方为低时,往往是高的那方让出控制权,因为线与,1与0是0,那么拉高的一方会发现自己的1和线上的0不一致,从而放弃总线
debug步骤
1、检查硬件连接问题,注意总线是否连接上拉电阻。2、检查电压,排除由于硬件设计导致读取失败,注意引脚电平一般为3.3V或1.5V。
3、检查IO口配置,在初始化配置IO时一定要注意IO的配置是否正确,是否有复用或重复定义,多检查几遍,尤其是和官方的Datasheet或者例子相对比一下。
4、检查从机设备地址,从机设备地址设置错误导致通信失败,一般读取到的数据为全1。注意函数需要设置的是7bit地址还是8bit地址。
5、频率问题,此类问题一般有2个
一是频率设置错误,可以通过示波器抓取SCL引脚波形判断;
二是2个设备之间的通信频率不匹配,此类问题一般比较难找(如果读取到数据,但是不对,且在连续变动大概率时频率问题),可以在排除以上原因的前提下多设置几次(一般设备都支持100k【标准】,400k【高速】)
总结
IIC中出现的错误大概率是时钟/频率之间的问题,可以灵活使用示波器进行检查。
要对官方文档抱有怀疑态度,尤其是一些小公司生产的芯片一定要注意。
应答位
主机发送应答时,时钟线是低,发完了应答才拉高
主机接受应答的时候,直接拉高SCL
这两点很好理解,低SCL允许改变总线相当于写状态,高SCL相当于读状态
https://blog.csdn.net/qq_53522710/article/details/113577514
根据这个实验↑我们可以发现,硬件IIC如果没有收到应答位,就不会继续发送数据了,相当于关闭了通信
https://blog.csdn.net/sinat_31499981/article/details/78215662
如果是读,那么读完一帧以后,主机发送ACK或者NACK来表明是否需要继续读
如果是写,那么写完一帧以后,从机发送ACK或者NACK来表明通信成功或失败,如果是寻址过程中,没有ACK应答,那么有可能是寻址失败了
ACK=0,NACK=1;
如果是硬件IIC,则根据硬件的要求,假设硬件要求一定有应答位,那么没有应答就会认为是(寻址失败/或者是传输失败)(寻址失败就会结束,传输失败的处理有待探究)
如果是软件IIC,那么软件层面可以自行约定
①master是软件模拟,slave是硬件IIC,那么在master读slave的时候,根据slave是否一定要应答来决定是否发送ACK和NACK
②主从都是软件模拟,那么不一定需要检测ACK,具体看代码怎么写了(有可能只管发或者只管读即可)
浙公网安备 33010602011771号