打印

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

[复制链接]
3871|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alenthj|  楼主 | 2009-3-24 23:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
移植了一个硬件I2C读写24C01的程序,单独跑这一个程序没有问题,已经来回读写几千次了,没出错。

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

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

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

我翻看了论坛的所有I2C讨论,有人提出过这个中断干扰问题,但都没有人说怎么解决。 有言论者,快出招吧。
沙发
香水城| | 2009-3-25 08:40 | 只看该作者

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

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

最好把你的测试程序发上来,我们测试一下。

使用特权

评论回复
板凳
lut1lut| | 2009-3-25 09:47 | 只看该作者

usart中断影响的那个case

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

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

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

使用特权

评论回复
地板
lut1lut| | 2009-3-25 09:54 | 只看该作者

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

为了不受中断干扰:

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

就是置顶帖子中2楼更新好的。

使用特权

评论回复
5
香水城| | 2009-3-25 09:56 | 只看该作者

3楼的程序并不包含中断

楼主说有中断才会出问题,你是否能把所有程序贴出来?看看4楼的回答,很可能与你的中断部分有关。

使用特权

评论回复
6
alenthj|  楼主 | 2009-3-25 12:05 | 只看该作者

已阅你的程序

NVIC_SETPRIMASR()是关总中断吗? 

另,systick被占用了。虽然有变通方法,比如在systick里面用累加器。但我能否用普通的delay延时来代替,可能不会太准,但影响应该不大吧。因为做模拟I2C的时候都是这样延时的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

221

帖子

0

粉丝