移植了一个硬件I2C读写24C01的程序,单独跑这一个程序没有问题,已经来回读写几千次了,没出错。
但是一旦加入中断就不行,具体原因就是死在某个while循环里面。我想是由于I2C的一些寄存器突然被打扰,导致一些关联寄存器位改变。
我也试着将仿真中的I2C停止,然后在继续,马上也就死在某个while循环上,应该也是寄存器被打扰而出错。
那么应该如何正确的使用I2C? 我之前曾打算读写I2C的时候关闭中断,可是我又开启了WWDG,WWDG的中断只要打开就是不可关闭的(除非复位),那么这就干扰了I2C。
我翻看了论坛的所有I2C讨论,有人提出过这个中断干扰问题,但都没有人说怎么解决。 有言论者,快出招吧。
请说明开了什么中断,哪些寄存器被打扰?
死在某个while循环里面,哪一个?每次都这样吗?
最好把你的测试程序发上来,我们测试一下。
usart中断影响的那个case
“里面有人提到被usart等中断干扰而出问题,却没人回答,我也想知道答案”
如果lz是指置顶那个帖子中48楼说的那个:
“多种中断情况下,还是不能正常读写
在万理199板子上,如果只是单一的I2C读写E2PROM,都能正常的工作。现在的问题是程序中存在多种中断,USART,TIM,SYSTICK等等。就不能对E2PROM正常的读写,就会死在循环中。给I2C设了最高级的中断也不能通过。
”
这个case我跟过,最后发现是用户自己代码越界,修改了Slave address这个变量的值,从而造成I2C通信失败,即发送设备地址没有应答的错误。
置顶帖子里查询方式的可以不受中断干扰
为了不受中断干扰:
1.普通的读/写都改成对BTF进行查询;
2.特殊的情况用了特殊的处理流程
1)读取1个字节
2)读取2个字节
都由NVIC_SETPRIMASR()和NVIC_RESETPRIMASK()来保证时间相关的操作不受中断影响。
就是置顶帖子中2楼更新好的。
3楼的程序并不包含中断
楼主说有中断才会出问题,你是否能把所有程序贴出来?看看4楼的回答,很可能与你的中断部分有关。
已阅你的程序
NVIC_SETPRIMASR()是关总中断吗?
另,systick被占用了。虽然有变通方法,比如在systick里面用累加器。但我能否用普通的delay延时来代替,可能不会太准,但影响应该不大吧。因为做模拟I2C的时候都是这样延时的。
我想请问楼主,我最近在用stm8l的I2C也遇到类似的问题,加入外部中断观后程序就跑死在一个莫名其妙的循环里,有点像影响了I2C的时序一样,不知道怎么解决?
这是09年的帖子了,发帖者估计很久不关注了,单独发帖吧,也许能快速得到帮助。