找回密码
 立即注册
楼主: 9805***

I2C通讯问题

[复制链接]

该用户从未签到

46

主题

3043

回帖

6861

积分

超级版主

积分
6861
发表于 2023-3-24 09:56:53 | 显示全部楼层
980578873 发表于 2023-3-24 09:28
好的,明白了,我现在是这样设计I2C初始化前就执行P_SW2 |= 0x80;我后面都不对P_SW2的EAXSFR位清0,这样 ...

就是这个意思。我给你的例程正常吧?
  • TA的每日心情

    2023-12-25 15:38
  • 签到天数: 1 天

    [LV.1]初来乍到

    39

    主题

    204

    回帖

    651

    积分

    高级会员

    积分
    651
     楼主| 发表于 2023-3-24 15:12:52 | 显示全部楼层
    梁工 发表于 2023-3-24 09:56
    就是这个意思。我给你的例程正常吧?

    梁工,您给我的例程单独测试是正常的,但是我稍微修改你的例程关联I2C设备地址和数据后,连续多次按复位按键后出现I2C崩溃了,怎么解决此问题,谢谢。示波器抓到I2C异常的波形如下图:

    1.png
    我稍微修改后的代码如下:
    2.png
    3.png

    该用户从未签到

    46

    主题

    3043

    回帖

    6861

    积分

    超级版主

    积分
    6861
    发表于 2023-3-24 16:13:35 | 显示全部楼层
    从设备抓着数据线不放了,排查从机。
  • TA的每日心情

    2023-12-25 15:38
  • 签到天数: 1 天

    [LV.1]初来乍到

    39

    主题

    204

    回帖

    651

    积分

    高级会员

    积分
    651
     楼主| 发表于 2023-3-24 16:21:55 | 显示全部楼层
    梁工 发表于 2023-3-24 16:13
    从设备抓着数据线不放了,排查从机。

    大概等45分钟I2C又自行恢复正常了
  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    8

    主题

    9

    回帖

    206

    积分

    中级会员

    积分
    206
    发表于 2023-4-19 22:54:53 | 显示全部楼层
    本帖最后由 ilysmile 于 2023-4-19 22:57 编辑

    大哥,你的这个问题解决了吗?我用硬件IIC读取MPU6050的数据,在init6050的时候也是卡在了这个循环,你这个是怎么解决的呀?
    wait函数修改成梁工那种的也不行。函数如下:

    void HardIIC_init()
    {
        P_SW2 |= 0x30;              //I2C¹¦ÄܽÅÑ¡Ôñ£¬0x00:P1.5,P1.4; 0x10:P2.5,P2.4; 0x30:P3.2,P3.3
        I2CCFG = 0xe0;              //ʹÄÜI2CÖ÷»úģʽ
        I2CMSST = 0x00;
    }

    void HardIIC_Wait()
    {
                    u16 i;
                    for(i=0;i<1000;i++){
                            if((I2CMSST & 0x40) != 0) break;
                    }
        I2CMSST &= ~0x40;
    }

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情

    2023-12-25 15:38
  • 签到天数: 1 天

    [LV.1]初来乍到

    39

    主题

    204

    回帖

    651

    积分

    高级会员

    积分
    651
     楼主| 发表于 2023-4-20 10:07:43 | 显示全部楼层
    ilysmile 发表于 2023-4-19 22:54
    大哥,你的这个问题解决了吗?我用硬件IIC读取MPU6050的数据,在init6050的时候也是卡在了这个循环,你这个 ...

    你是在什么情况下出现这个问题?是不是在单片机复位出现这个问题呢?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    8

    主题

    9

    回帖

    206

    积分

    中级会员

    积分
    206
    发表于 2023-4-22 11:53:35 | 显示全部楼层
    980578873 发表于 2023-4-20 10:07
    你是在什么情况下出现这个问题?是不是在单片机复位出现这个问题呢?

    在init MPU6050的程序里,写寄存器的时候,进入了死循环
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    8

    主题

    9

    回帖

    206

    积分

    中级会员

    积分
    206
    发表于 2023-4-22 18:38:16 | 显示全部楼层
    ilysmile 发表于 2023-4-22 11:53
    在init MPU6050的程序里,写寄存器的时候,进入了死循环

    找到原因了,需要给函数开始前后加上 P_SW2 |= 0x80;  P_SW2 &= 0x7f;就好了
    所以init函数这么写就行了:
    void HardIIC_init()
    {
        P_SW2 |= 0x80;        
        I2C_S1 =1;   //I2C¹¦ÄܽÅÑ¡Ôñ£¬00:P1.5,P1.4; 01:P2.5,P2.4; 11:P3.2,P3.3
        I2C_S0 =1;
        I2CCFG = 0xe0;              //ʹÄÜI2CÖ÷»úģʽ
        I2CMSST = 0x00;
                    P_SW2 &= 0x7f;
    }
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-19 13:04 , Processed in 0.066747 second(s), 58 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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