我使用的是str710,在I2C上只带了一个时钟芯片:PCF8563,每秒读一次,短至几分钟,长至2天会出现死机,后来经过检查跟楼主主贴描述的情况完全一致:在发送完地址后,无法等到ENDAD。我100%肯定这个问题跟上电过程无关。
我认为这是CPU 没有检测到ACK造成的,开始我想有可能是外设因为某种原因没有发出ACK,或者ACK被干扰了,但既然这个问题在楼主的设备里也出现了,应该基本可以断言是CPU本身的bug。
至于变长参数,是标准C语言必须支持的,我不认为IAR的编译器会有问题。 当然,我没有分析相关汇编代码,只是觉得不太可能!
从实用的角度,程序员处理I2C的ACK异常是必须的,其实是手册中给出的通信流程误导了用户,好像每次通信都应该是正常的,好像可以死等ENDAD。只要明白I2C通信是会失败的,软件应该处理偶发的通信失败,那么这个问题实际上就不算什么严重的问题。 |