楼主,硬件和软件都不错,IIC写的中规中矩,思路清晰,赞一个
缺芯币啊。。。怎么才能弄到芯币。。想下载下来看看呢。
代码运行中遇到了一点问题,调了两天才算大体解决,在这里和大家分享一下。
1月份开始学习I2C,手边的板子是MSP430FR5969lachpad。TI提供的是中断方式的I2C,不过一向觉得查询方式的用起来更容易理解一些,所以就开始参考各方资料。不知道为什么大家都喜欢用软件模拟的方式,不过我还是喜欢用硬件提供的I2C,感觉这样正式一点。找到的比较准确的代码就是楼主分享的代码,就此借鉴了一下。可惜的是还是遇到了一些问题,曾经一度想要放弃,不过幸好坚持了下来,终于找到了问题所在。为了感谢楼主的分享,也把自己的问题写出来,希望提供借鉴。
问题出在这段代码:
while(!(UCB0IFG & UCTXIFG)) // 等待UCTXIFG=1 与UCTXSTT=0 同时变化 等待一个标志位即可
{
if( UCB0IFG & UCNACKIFG ) // 若无应答 UCNACKIFG=1
{
return 1; //发送失败
}
}
我在写代码的时候觉得有无应答的判断并不重要,MSP430应该会自动进行有无ACK的判断,如果没有应答软件应该无法运行下去。所以将这一段省略为:
while(!(UCB0IFG & UCTXIFG)); //而且IAR 提供的库函数中也是这样写的,所以就没有多想。
当然结果肯定是不正常的,虽然软件能够正常运行,但是读出的数据总是0xFF。实际上数据既没有写进去,也没有读出来。
最后的分析是:在发送一个字节后一定要做一下判断if(UCB0IFG & UCNACKIFG),这样才能保证代码的正确运行。
有人用IO口模拟IIC与 mpl3115通信的程序吗?
很棒,谢谢分享,正好有用,为什么不用TI的库来写呢?
回复的时候字数总是不够,所以就没有积分,我的积分少得可怜,为啥论坛有这个规定呢?
字数得要超过多少才有积分的啊?这不是让我水多点嘛,我很能水的,别酱紫。。。。