STM32硬件I2C无响应

2020-01-01 17:48发布

这个STM32硬件I2C总是卡在这里,不知道为什么,望大家能够讲解
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
SkyGz
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);

}

一周热门 更多>