MEGA8和MEGA16的中文资料是这样说的: 发送START 之后软件必须清零TWSTA。 MEGA16的英文资料是这样说的: TWSTA is cleared by the TWI hardware when the START condition has been transmitted. MEGA32的英文资料是这样说的: TWSTA must be cleared by software when the START condition has been transmitted. 都说中文资料是由英文资料翻译过来的,英文资料更权威,更准确。但是这次两种英文资料相矛盾了,估计是MEGA16的英文资料错了。 百度上查找参考源程序,不见有软件清零的过程。 实际上如果不用软件清零,程序将再成功发送一byte数据或地址后,重发START信号,总线重新启动。TWINT能置位,程序不会陷入死循环。但是状态会出错。查看TWSR发现处于重复START信号已发送状态。 如果软件清零TWSTA,则成功发送一个byte数据或地址后,再继续发送将是TWINT无法置位,程序陷入死循环。 从机为高度集成,功能完善的芯片,无需人为干预。且更换过多个芯片,均有同样的现象。 可以排除有由从机错误引起的整体出错。 程序卡住后断开时钟线,从机的时钟线和数据线都为高电平,基本上可以排除由线与引起的时钟线被从机拉低而使时钟无法继续的情况。 主机能够成功发出START信号和一byte数据或地址,并能够成功接收到来自从机的应答。基本上可以排除外围器件的硬件连接错误。 暂时可以做出的解释为: 在置位TWSTA发出START信号,在此之后发送一byte的数据或地址,这一byte的数据或地址,无论清零TWSTA与否都能成功发送,并接到正确的答复。在这之后如果马上清零TWSTA或者在发送完START信号之后就马上清零TWSTA,都会在清零TWSTA后再成功发送一byte数据或地址,并得到正确的答复,然后继续发送数据或地址将会导致TWINT无法置位,程序被卡死——陷入死循环。如果此时在死循环到来前依然使TWSTA置位,将会在程序卡死之前重启总线,从而防止程序卡死,但是程序会因为错误的总线重启而进入错误的状态。 暂时无法解决的事情: 1.无法找到错误的具体位置 2.TWSTA到底要不要由软件清零 3.为什么TWSTA不清零不会马上重启总线,清零也不会马上导致TWINT不能置位而使程序陷入死循环,而是在成功发送一byte数据或地址后才出问题。 目的: 当日记写写,记录最近做的事情 自己确实难得找到原因了,有高手的话,帮忙分析,解释一下
|