查看: 7565|回复: 9

[求助] I.MX28上频繁操作I2C导致的中断异常和复位现象的探讨

[复制链接]

该用户从未签到

1

主题

6

帖子

0

新手上路

Rank: 1

积分
15
最后登录
1970-1-1
发表于 2012-7-31 16:46:24 | 显示全部楼层 |阅读模式
     28平台通过I2C总线连接收音机模块,正常情况下系统运行的好好的,如果通过压力测试,就是不断的通过I2C去读写收音机模块,持续时间5~10分钟。偶尔就会产生中断异常现象。I2C使用的是PIO queue mode。I2C中中断子程序的代码如下:
#define I2C_IRQ_MASK 0x000000FF
static irqreturn_t mxs_i2c_isr(int this_irq, void *dev_id)
{
 struct mxs_i2c_dev *mxs_i2c = dev_id;
 u32 stat;
 u32 done_mask =
     BM_I2C_CTRL1_DATA_ENGINE_CMPLT_IRQ | BM_I2C_CTRL1_BUS_FREE_IRQ;
  
 stat = __raw_readl(mxs_i2c->regbase + HW_I2C_CTRL1) & I2C_IRQ_MASK;
 if (!stat)
  return IRQ_NONE;
 if (stat & BM_I2C_CTRL1_NO_SLAVE_ACK_IRQ) {
  mxs_i2c->cmd_err = -EREMOTEIO;
  __raw_writel(BM_I2C_CTRL1_CLR_GOT_A_NAK,
        mxs_i2c->regbase + HW_I2C_CTRL1_SET);
  hw_i2c_dmachan_reset(mxs_i2c);
  mxs_reset_block((void __iomem *)mxs_i2c->regbase, 0);
  /* Will catch all error (IRQ mask) */
  __raw_writel(0x0000FF00, mxs_i2c->regbase + HW_I2C_CTRL1_SET);
  if (mxs_i2c->flags & MXS_I2C_PIOQUEUE_MODE)
   __raw_writel(0x04, mxs_i2c->regbase + HW_I2C_QUEUECTRL_SET);

  complete(&mxs_i2c->cmd_complete);
  goto done;
 }
 /* Don't care about BM_I2C_CTRL1_OVERSIZE_XFER_TERM_IRQ */
 if (stat & (BM_I2C_CTRL1_EARLY_TERM_IRQ |
      BM_I2C_CTRL1_MASTER_LOSS_IRQ |
      BM_I2C_CTRL1_SLAVE_STOP_IRQ | BM_I2C_CTRL1_SLAVE_IRQ)) {
  mxs_i2c->cmd_err = -EIO;
  complete(&mxs_i2c->cmd_complete);
  goto done;
 }
 if ((stat & done_mask) == done_mask)
  complete(&mxs_i2c->cmd_complete);
done:
 __raw_writel(stat, mxs_i2c->regbase + HW_I2C_CTRL1_CLR);
 return IRQ_HANDLED;}
正常情况下完成一个读写送出的中断应该是 BM_I2C_CTRL1_DATA_ENGINE_CMPLT_IRQ | BM_I2C_CTRL1_BUS_FREE_IRQ;
偶尔只出现 BM_I2C_CTRL1_DATA_ENGINE_CMPLT_IRQ 中断,而没有后面的那个中断,不知道为什么。
这种情况在cpu繁忙的时候频率明显提高。如果继续运行,最多达到6小时后系统就会复位,这个复位是看门狗复位的。如果把看门狗关掉,系统就挂在那边,串口没有响应,系统也没有响应,通过测试发现系统时钟中断也已无法产生。各位大侠分析下是什么原因导致的。
有必要说明下I2C总线的上拉电阻本来是10K,后来改成5K,感觉出现的概率加大了。但是datasheet里面建议2K。感觉太低。
同样挂在I2C上面的RTC时钟,频繁操作12个小时不会产生问题
我知道答案 目前已有5人回答
回复

使用道具 举报

该用户从未签到

1

主题

6

帖子

0

新手上路

Rank: 1

积分
15
最后登录
1970-1-1
 楼主| 发表于 2012-7-31 16:56:49 | 显示全部楼层

RE:I.MX28上频繁操作I2C导致的中断异常和复位现象的探讨

由于使用的是PIO QUEUE MODE.如果出现了中断异常,会导致下次读I2C的数据出错,以为混合了上一次的数据,。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

6

帖子

0

新手上路

Rank: 1

积分
15
最后登录
1970-1-1
 楼主| 发表于 2012-7-31 16:57:37 | 显示全部楼层

RE:I.MX28上频繁操作I2C导致的中断异常和复位现象的探讨

此站活跃不啊,,有人来么
回复 支持 反对

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2012-8-1 10:25:23 | 显示全部楼层

    RE:I.MX28上频繁操作I2C导致的中断异常和复位现象的探讨

    你看看你I2C中断中是不是有死循环?如果有最好加处理。不要有完全的死循环。当I2C出现问题以后,主动去重启I2C模块。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    19

    帖子

    0

    新手上路

    Rank: 1

    积分
    46
    最后登录
    1970-1-1
    发表于 2012-8-1 17:33:04 | 显示全部楼层

    RE:I.MX28上频繁操作I2C导致的中断异常和复位现象的探讨

    我也遇到因为i2c问题,导致设备当机,因此用i2c,需要加一些冗余措施,防止陷入死循环。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    19

    帖子

    0

    新手上路

    Rank: 1

    积分
    46
    最后登录
    1970-1-1
    发表于 2012-8-1 17:33:10 | 显示全部楼层

    RE:I.MX28上频繁操作I2C导致的中断异常和复位现象的探讨

    我也遇到因为i2c问题,导致设备当机,因此用i2c,需要加一些冗余措施,防止陷入死循环。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    19

    帖子

    0

    新手上路

    Rank: 1

    积分
    46
    最后登录
    1970-1-1
    发表于 2012-8-1 17:33:54 | 显示全部楼层

    RE:I.MX28上频繁操作I2C导致的中断异常和复位现象的探讨

    我也遇到因为i2c问题,导致设备当机,因此用i2c,需要加一些冗余措施,防止陷入死循环。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    6

    帖子

    0

    新手上路

    Rank: 1

    积分
    15
    最后登录
    1970-1-1
     楼主| 发表于 2012-8-2 15:35:35 | 显示全部楼层

    回复:I.MX28上频繁操作I2C导致的中断异常和复位现象的探讨

    回复第 7 楼 于2012-08-01 17:33:54发表:
    我也遇到因为i2c问题,导致设备当机,因此用i2c,需要加一些冗余措施,防止陷入死循环。 

    你说的死循环是指哪方面的死循环啊?
    怀疑是终端嵌套导致的问题,把终端模式改成FIRQ_DISABLE模式就延迟了死机时间。比之前的任何一次时间都长。不过现在的内核也支持嵌套了。有点奇怪了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2012-8-2 15:43:08 | 显示全部楼层

    RE:I.MX28上频繁操作I2C导致的中断异常和复位现象的探讨

    你看一下你的 I2C中断读取代码,有没有while();这种处理寄存器的。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    6

    帖子

    0

    新手上路

    Rank: 1

    积分
    15
    最后登录
    1970-1-1
     楼主| 发表于 2012-8-3 15:24:48 | 显示全部楼层

    回复:I.MX28上频繁操作I2C导致的中断异常和复位现象的探讨

    回复第 9 楼 于2012-08-02 15:43:08发表:
    你看一下你的 I2C中断读取代码,有没有while();这种处理寄存器的。 

    中断读取代码????  这个不是很清楚,是指中断服务子程序呢? 如果是的话,那没有,中断代码已经贴出
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 13:30 , Processed in 0.105064 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表