梁工 发表于 2023-3-24 09:56:53

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

就是这个意思。我给你的例程正常吧?

980578873 发表于 2023-3-24 15:12:52

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


我稍微修改后的代码如下:




梁工 发表于 2023-3-24 16:13:35

从设备抓着数据线不放了,排查从机。

980578873 发表于 2023-3-24 16:21:55

梁工 发表于 2023-3-24 16:13
从设备抓着数据线不放了,排查从机。

大概等45分钟I2C又自行恢复正常了

ilysmile 发表于 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;
}

980578873 发表于 2023-4-20 10:07:43

ilysmile 发表于 2023-4-19 22:54
大哥,你的这个问题解决了吗?我用硬件IIC读取MPU6050的数据,在init6050的时候也是卡在了这个循环,你这个 ...

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

ilysmile 发表于 2023-4-22 11:53:35

980578873 发表于 2023-4-20 10:07
你是在什么情况下出现这个问题?是不是在单片机复位出现这个问题呢?

在init MPU6050的程序里,写寄存器的时候,进入了死循环

ilysmile 发表于 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;
}

sansheng 发表于 2024-12-16 09:58:31

我也是一直停留在这while语句这里,究竟是什么问题引起的,我将SCL引脚接一下地就可以正常使用
页: 1 [2]
查看完整版本: I2C通讯问题