STM32硬件I2C无响应

2020-01-01 17:48发布

这个STM32硬件I2C总是卡在这里,不知道为什么,望大家能够讲解
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
kingqb
1楼-- · 2020-01-02 13:12
 精彩回答 2  元偷偷看……
於氏天鹰
2楼-- · 2020-01-02 19:09
SkyGz 发表于 2016-8-2 22:54
我前段时间 也碰过,  卡在这

后来可以了

我用了您的方法,现在在读取的时候第一次的EV6能够通过了,但是读取时候不是需要再次重启I2C的吗,在它重启后进行7位地址发送后再检测EV6就无法通过了
於氏天鹰
3楼-- · 2020-01-02 23:16
本帖最后由 於氏天鹰 于 2016-8-3 10:39 编辑

微信截图_20160803104259.png (56.01 KB, 下载次数: 0)

下载附件

2016-8-3 10:39 上传

现在的DEBUG的情况是这样,卡在了第二次的EV6检测
alsowang
4楼-- · 2020-01-03 04:19
明知不好用还要尝试,楼主精神值得学习,实验出来了记得回来跟大家说一下。
SkyGz
5楼-- · 2020-01-03 06:49
本帖最后由 SkyGz 于 2016-8-3 10:45 编辑
於氏天鹰 发表于 2016-8-3 10:33
我用了您的方法,现在在读取的时候第一次的EV6能够通过了,但是读取时候不是需要再次重启I2C的吗,在它重 ...


不用, 之后都不用I2C_REBOOT,  也不会再出现卡的情况(不过不要在DEBUG下单步调试,   直接全速运行 看会不会卡就行)

我的读写函数



void I2C_WriteByte(unsigned char id,unsigned char write_address,unsigned char byte)
{
        I2C_GenerateSTART(I2C1,ENABLE);
        //产生起始条件
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
        //等待ACK
        I2C_Send7bitAddress(I2C1,id,I2C_Direction_Transmitter);
        //向设备发送设备地址
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
        //等待ACK
        I2C_SendData(I2C1, write_address);
        //寄存器地址
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        //等待ACK
        I2C_SendData(I2C1, byte);
        //发送数据
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        //发送完成
        I2C_GenerateSTOP(I2C1, ENABLE);
        //产生结束信号
}


//----------------------------------------------------//
unsigned char I2C_ReadByte(unsigned char  id, unsigned char read_address)
{  
        unsigned char temp;        

        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
        //等待I2C
        I2C_GenerateSTART(I2C1, ENABLE);
          //产生起始信号
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
        //EV5
        I2C_Send7bitAddress(I2C1, id, I2C_Direction_Transmitter);
        //发送地址
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
          //EV6
  I2C_Cmd(I2C1, ENABLE);
        //重新设置可以清楚EV6
        I2C_SendData(I2C1, read_address);  
        //发送读得地址
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
          //EV8
        I2C_GenerateSTART(I2C1, ENABLE);
        //重新发送
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
          //EV5
        I2C_Send7bitAddress(I2C1, id, I2C_Direction_Receiver);
          //发送读地址
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
          //EV6  
        I2C_AcknowledgeConfig(I2C1, DISABLE);
        I2C_GenerateSTOP(I2C1, ENABLE);
        //关闭应答和停止条件产生
        while(!(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)));
             
        temp = I2C_ReceiveData(I2C1);
   
        I2C_AcknowledgeConfig(I2C1, ENABLE);
               
    return temp;
}







------------------------------------------------------------------------------------------------------------------------
MPU_GetData(MPU6050_Addr, ACCEL_XOUT_H, 14, BUF_6050_buff);

void MPU6050_GetData(u8 id, u8 reg, u8 len, u8 *buff)

{
    //启动传输发送首寄存器地址
    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

    I2C_GenerateSTART(I2C1, ENABLE);

    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

    I2C_Send7bitAddress(I2C1, id, I2C_Direction_Transmitter);

    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

    I2C_Cmd(I2C1, ENABLE);
    I2C_SendData(I2C1, reg);

    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

    //开始接受
    I2C_GenerateSTART(I2C1, ENABLE);

    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

    I2C_Send7bitAddress(I2C1, id, I2C_Direction_Receiver);

    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));


    while (len)
    {
        while(!(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)));

        *buff = I2C_ReceiveData(I2C1);

        if(len == 2)
        {
            I2C_AcknowledgeConfig(I2C1, DISABLE);//最后一个不应答
        }

        buff++;
        len--;
    }



    I2C_AcknowledgeConfig(I2C1, ENABLE);
    I2C_GenerateSTOP(I2C1, ENABLE);

}
於氏天鹰
6楼-- · 2020-01-03 08:39
 精彩回答 2  元偷偷看……

一周热门 更多>