代码运行中遇到了一点问题,调了两天才算大体解决,在这里和大家分享一下。
1月份开始学习I2C,手边的板子是MSP430FR5969lachpad。TI提供的是中断方式的I2C,不过一向觉得查询方式的用起来更容易理解一些,所以就开始参考各方资料。不知道为什么大家都喜欢用软件模拟的方式,不过我还是喜欢用硬件提供的I2C,感觉这样正式一点。找到的比较准确的代码就是楼主分享的代码(>> [TI首届低功耗设计大赛]+FR5969硬件IIC驱动MPL3115气压传感器),就此借鉴了一下。可惜的是还是遇到了一些问题,曾经一度想要放弃,不过幸好**了下来,终于找到了问题所在。为了感谢楼主的分享,也把自己的问题写出来,希望提供借鉴。
问题出在这段代码:
while(!(UCB0IFG & UCTXIFG)) // 等待UCTXIFG=1 与UCTXSTT=0 同时变化 等待一个标志位即可
{
if( UCB0IFG & UCNACKIFG ) // 若无应答 UCNACKIFG=1
{
return 1; //发送失败
}
}
我在写代码的时候觉得有无应答的判断并不重要,MSP430应该会自动进行有无ACK的判断,如果没有应答软件应该无法运行下去。所以将这一段省略为:
while(!(UCB0IFG & UCTXIFG)); //而且IAR 提供的库函数中也是这样写的,所以就没有多想。
当然结果肯定是不正常的,虽然软件能够正常运行,但是读出的数据总是0xFF。实际上数据既没有写进去,也没有读出来。
最后的分析是:在发送一个字节后一定要做一下判断if(UCB0IFG & UCNACKIFG),这样才能保证代码的正确运行。
|