在上一篇关于IIC协议的文章当中我们讲解了关于IIC协议的几个知识点,但是仅仅局限于理论层面,我们最终应通过代码的形式来实现IIC协议。所以这篇是为了手写IIC协议所用的,基本上掌握了以下所列举的几个知识点,手写IIC协议应该不成问题。并且在接下来的IIC文章中我会专门分别写出库函数版本的和寄存器版本的关于IIC协议的文章,而且会详细注释,敬请期待!!!
需要掌握的几个知识点(特别容易踩的坑)SCL(时钟线)在整个IIC传输过程中始终处于输出状态,电平状态时而拉高,时而拉低。
SDA(数据线)在接收应答信号时处于输入状态,在其他状态处于输出状态。
初始化状态完成后,SDA(数据线)和SCL(时钟线)置为低电平。
开启传输后,一般IIC的延时时间是比较短的,是us级别的,一般设置5us以内即可。
在上一篇文章中可以知道,我们提到了IIC传输过程中,一次只能传输1位,也就是传输一个字节的话需要传输8次。这里需要注意的是我们在传输数据的时候往往先传送最高位。但是这里需要进行移位操作,将最高位移位7次,此时最高位即是最低位了,在接下来的程序中即 “>>7” ,然后再进行 " &0x01 "这个操作相当于将最高位去掉,只要最低位。
例:
假如我们要通过IIC协议传输11001101这8位数据。
在第五个知识点之后只是传输完一位,但是我们需传输8次,所以为了传输方便,再进行次高位传输时,我们需要进行一个特殊操作,将次高位的数据左移一位,相当于次高位的数据现在处于最高位,然后再与第5点所示图一样,进行同样的操作,在程序编写中需特别注意。
在SDA(数据线)等待应答阶段,为了清晰识别到SDA(数据线)为低电平,所以先将SDA(数据线)设置为高电平,上拉输入模式。如果此时一直没有收到SDA(数据线)的低电平信号,则直接退出等待,并且返回传输失败信号。