过家家项目写的模拟I2C的不足
学单片机时候不可避免通过控制IO写过模拟I2C程序。
当时基本就是关注START、STOP信号长啥样?什么是ACK?什么是NACK?协议是个低放高取。了解了这些信息就开始哐哧哐哧去写代码控制IO口,最后跟I2C设备通讯上了,或者两个单片机,一个做master一个做slave,能通讯上了,就出师了,开启下一外设学习。
然而这样的代码用在过家家的项目上,还能凑合玩玩,直接拷贝用在实际工程中,有两个致命问题,需要改进:
1.如果SDA线上出现了异常,长期为低,master在idle时候不检查,最终master所有发送的数据slave都收不到,但master总能收到ACK;master所有读取的数据都是0,ACK全符合预期。
2.master遇上有clock stretching特性的slave,自己规规矩矩delayus然后翻转SCL,没有考虑过SCL在释放时,是不是真的上拉回去了高电平,时序GG。
这学东西吧,有的东西可以不做,但还是得知道有
参考:
浙公网安备 33010602011771号