找回密码
 立即注册
楼主: 980578873

I2C通讯问题

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

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

就是这个意思。我给你的例程正常吧?
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

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

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

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


  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2023-3-24 16:13:35 | 显示全部楼层
从设备抓着数据线不放了,排查从机。
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

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

大概等45分钟I2C又自行恢复正常了
  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2024-11-16 11:36:36

8

主题

9

回帖

214

积分

中级会员

积分
214
发表于 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;
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2024-11-16 11:36:36

8

主题

9

回帖

214

积分

中级会员

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2024-11-16 11:36:36

8

主题

9

回帖

214

积分

中级会员

积分
214
发表于 2023-4-22 18:38:16 | 显示全部楼层
ilys*** 发表于 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;
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-12-16 10:25:25
已绑定手机

0

主题

1

回帖

10

积分

新手上路

积分
10
发表于 2024-12-16 09:58:31 | 显示全部楼层
我也是一直停留在这while语句这里,究竟是什么问题引起的,我将SCL引脚接一下地就可以正常使用
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:34 , Processed in 0.143392 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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