还是关于I2C的问题,如果处理中断的干扰?

xia_23   2009-3-24 23:23 楼主
移植了一个硬件I2C读写24C01的程序,单独跑这一个程序没有问题,已经来回读写几千次了,没出错。

但是一旦加入中断就不行,具体原因就是死在某个while循环里面。我想是由于I2C的一些寄存器突然被打扰,导致一些关联寄存器位改变。      

我也试着将仿真中的I2C停止,然后在继续,马上也就死在某个while循环上,应该也是寄存器被打扰而出错。

那么应该如何正确的使用I2C? 我之前曾打算读写I2C的时候关闭中断,可是我又开启了WWDG,WWDG的中断只要打开就是不可关闭的(除非复位),那么这就干扰了I2C。

我翻看了论坛的所有I2C讨论,有人提出过这个中断干扰问题,但都没有人说怎么解决。 有言论者,快出招吧。

回复评论 (7)

请说明开了什么中断,哪些寄存器被打扰?

死在某个while循环里面,哪一个?每次都这样吗?

最好把你的测试程序发上来,我们测试一下。
点赞  2009-3-25 08:40

usart中断影响的那个case

“里面有人提到被usart等中断干扰而出问题,却没人回答,我也想知道答案”

如果lz是指置顶那个帖子中48楼说的那个:
“多种中断情况下,还是不能正常读写 
在万理199板子上,如果只是单一的I2C读写E2PROM,都能正常的工作。现在的问题是程序中存在多种中断,USART,TIM,SYSTICK等等。就不能对E2PROM正常的读写,就会死在循环中。给I2C设了最高级的中断也不能通过。

这个case我跟过,最后发现是用户自己代码越界,修改了Slave address这个变量的值,从而造成I2C通信失败,即发送设备地址没有应答的错误。
点赞  2009-3-25 09:47

置顶帖子里查询方式的可以不受中断干扰

为了不受中断干扰:

1.普通的读/写都改成对BTF进行查询;
2.特殊的情况用了特殊的处理流程
 1)读取1个字节
 2)读取2个字节
都由NVIC_SETPRIMASR()和NVIC_RESETPRIMASK()来保证时间相关的操作不受中断影响。

就是置顶帖子中2楼更新好的。
点赞  2009-3-25 09:54

3楼的程序并不包含中断

                                 楼主说有中断才会出问题,你是否能把所有程序贴出来?看看4楼的回答,很可能与你的中断部分有关。
点赞  2009-3-25 09:56

已阅你的程序

NVIC_SETPRIMASR()是关总中断吗? 

另,systick被占用了。虽然有变通方法,比如在systick里面用累加器。但我能否用普通的delay延时来代替,可能不会太准,但影响应该不大吧。因为做模拟I2C的时候都是这样延时的。
点赞  2009-3-25 12:05
我想请问楼主,我最近在用stm8l的I2C也遇到类似的问题,加入外部中断观后程序就跑死在一个莫名其妙的循环里,有点像影响了I2C的时序一样,不知道怎么解决?
点赞  2015-6-14 23:21
引用: shisanyue 发表于 2015-6-14 23:21
我想请问楼主,我最近在用stm8l的I2C也遇到类似的问题,加入外部中断观后程序就跑死在一个莫名其妙的循环里,有点像影响了I2C的时序一样,不知道怎么解决?

这是09年的帖子了,发帖者估计很久不关注了,单独发帖吧,也许能快速得到帮助。
加油!在电子行业默默贡献自己的力量!:)
点赞  2015-6-15 09:24
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复