查看: 6334|回复: 11

[其他] 有个52235的I2C的问题想请大家帮我看看怎么解决:

[复制链接]

该用户从未签到

48

主题

141

帖子

1

中级会员

Rank: 3Rank: 3

积分
385
最后登录
2020-8-7
发表于 2009-5-4 20:38:33 | 显示全部楼层 |阅读模式
I2SR寄存器的IBB位,在发送START后置为高,我在调试时发现一个问题,就是我在读数据时如果没完成整个读周期,中途中断其运行,这一位就无法再变为0,下次也无法正常操作I2C,将CPU复位(软件硬件都试过),重新初始化都不行,强制发送一个STOP也不行。在这个状态下,我关闭I2C功能,用口线方式强制发一个STOP到总线上,然后再使能I2C(I2CR的IEN位),IBB还是立即就变成1。唯一能恢复的就是装置重新上电。这个怎么解决?
我知道答案 目前已有10人回答
回复

使用道具 举报

该用户从未签到

1

主题

48

帖子

0

新手上路

Rank: 1

积分
2809
最后登录
1970-1-1
发表于 2009-5-17 23:54:29 | 显示全部楼层

RE:有个52235的I2C的问题想请大家帮我看看怎么解决:

该用户从未签到

1

主题

4

帖子

0

新手上路

Rank: 1

积分
9
最后登录
1970-1-1
发表于 2009-7-30 21:22:24 | 显示全部楼层

RE:有个52235的I2C的问题想请大家帮我看看怎么解决:

兄台,我看你也在研究MCF52235,能否相互叫交流一下,我的QQ691567358.我们可以进行一些资源相互分享,毕竟我都是同一个控制芯片

该用户从未签到

5

主题

22

帖子

0

新手上路

Rank: 1

积分
42
最后登录
1970-1-1
发表于 2010-8-28 09:43:50 | 显示全部楼层

回复:有个52235的I2C的问题想请大家帮我看看怎么解决:

回复第 1 楼 njhuangyuan于2009-05-04 12:38:33发表:
I2SR寄存器的IBB位,在发送START后置为高,我在调试时发现一个问题,就是我在读数据时如果没完成整个读周期,中途中断其运行,这一位就无法再变为0,下次也无法正常操作I2C,将CPU复位(软件硬件都试过),重新初始化都不行,强制发送一个STOP也不行。在这个状态下,我关闭I2C功能,用口线方式强制发一个STOP到总线上,然后再使能I2C(I2CR的IEN位),IBB还是立即就变成1。唯一能恢复的就是装置重新上电。这个怎么解决? 

我用52259的也同样遇到这个问题,各位大侠请指教。
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2010-8-28 11:52:33 | 显示全部楼层

    RE:有个52235的I2C的问题想请大家帮我看看怎么解决:

    首先,确认I2C通信过程中没有错误操作。比如读取时,如果读取完毕不要回复ACK,并且置I2C为从模式。下次读取时再开启。
    该会员没有填写今日想说内容.

    该用户从未签到

    2

    主题

    224

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    322
    最后登录
    1970-1-1
    发表于 2010-8-31 20:36:39 | 显示全部楼层

    RE:有个52235的I2C的问题想请大家帮我看看怎么解决:

    这个问题,芯片手册上有提到,在27.4.1,如下:
    NOTE
    If I2SR[IBB] is set when the I2C bus module is enabled, execute the following pseudocode sequence before proceeding with normal initialization code. This issues a STOP command to the slave device, placing it in idle state as if it were power-cycled on.
    I2CR = 0x0
    I2CR = 0xA0
    dummy read of I2DR
    I2SR = 0x0
    I2CR = 0x0
    I2CR = 0x80 ; re-enable
    原因应该是非法中断通信后,而从设备状态机已经进入通信状态,导致主设备端认为总线busy,所以需要以上这段特殊的指令来恢复总线。

    该用户从未签到

    5

    主题

    22

    帖子

    0

    新手上路

    Rank: 1

    积分
    42
    最后登录
    1970-1-1
    发表于 2010-9-1 09:11:08 | 显示全部楼层

    回复:有个52235的I2C的问题想请大家帮我看看怎么解决:

    回复第 6 楼 居颖轶于2010-08-31 12:36:39发表:
    这个问题,芯片手册上有提到,在27.4.1,如下:
    NOTE
    If I2SR[IBB] is set when the I2C bus module is enabled, execute the following pseudocode sequence before proceeding with normal initialization code. This issues a STOP command to the slave device, placing it in idle state as if it were power-cycled on.
    I2CR = 0x0
    I2CR = 0xA0
    dummy read of I2DR
    I2SR = 0x0
    I2CR = 0x0
    I2CR = 0x80 ; re-enable
    原因应该是非法中断通信后,而从设备状态机已经进入通信状态,导致主设备端认为总线busy,所以需要以上这段特殊的指令来恢复总线。 

    这段代码是不全面的,我后来试过了不行,它没有考虑到延时的问题,后来加上延时之后就可以了,否则只能通过加断点的方法才能执行这段代码并且正常结束I2C总线。

    该用户从未签到

    2

    主题

    224

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    322
    最后登录
    1970-1-1
    发表于 2010-9-1 13:10:23 | 显示全部楼层

    RE:有个52235的I2C的问题想请大家帮我看看怎么解决:

    楼上有加dummy read么?

    该用户从未签到

    5

    主题

    22

    帖子

    0

    新手上路

    Rank: 1

    积分
    42
    最后登录
    1970-1-1
    发表于 2010-9-1 17:17:54 | 显示全部楼层

    回复:有个52235的I2C的问题想请大家帮我看看怎么解决:

    回复第 8 楼 居颖轶于2010-09-01 05:10:23发表:
    楼上有加dummy read么? 

    当然有加啦!

    该用户从未签到

    5

    主题

    22

    帖子

    0

    新手上路

    Rank: 1

    积分
    42
    最后登录
    1970-1-1
    发表于 2010-9-16 14:11:13 | 显示全部楼层

    回复:有个52235的I2C的问题想请大家帮我看看怎么解决:

    回复第 6 楼 居颖轶于2010-08-31 12:36:39发表:
    这个问题,芯片手册上有提到,在27.4.1,如下:
    NOTE
    If I2SR[IBB] is set when the I2C bus module is enabled, execute the following pseudocode sequence before proceeding with normal initialization code. This issues a STOP command to the slave device, placing it in idle state as if it were power-cycled on.
    I2CR = 0x0
    I2CR = 0xA0
    dummy read of I2DR
    I2SR = 0x0
    I2CR = 0x0
    I2CR = 0x80 ; re-enable
    原因应该是非法中断通信后,而从设备状态机已经进入通信状态,导致主设备端认为总线busy,所以需要以上这段特殊的指令来恢复总线。 

    请问居大侠,当发现I2C总线忙时,能否通过以下办法来停止I2c总线:先禁止I2C模块,然后SCL和SDA口线改为普通IO口,然后利用IO口模仿I2C通信时序发停止信号到I2C总线上,最后再重新使能I2C模块。
    ???
    是否一定要使用datasheet上提供的那段代码才能停止I2C总线???
    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-11 03:49 , Processed in 0.105088 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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