STM32L071硬件I2C读取AM2320数据

STM32L071硬件I2C读取AM2320数据

直接上代码

// 2019-01-06 19:11:36 Mony:返回值除以10得到实际的温度、湿度值
void fmlAm2320GetValue(int16_t *pTemperature,uint16_t *pHumidity)
{
    #define AM2320_ADDRESS  0xB8
    
    uint8_t IIC_TX_Buffer[]={0x03,0x00,0x04}; //读温湿度命令(无CRC校验)
    uint8_t IIC_RX_Buffer[12]; 
    
    HAL_I2C_DeInit(&hi2c1);     //  复位I2C1外设的配置
    osDelay(2);                 //  延时2mS
    MX_I2C1_Init();             //  初始化I2C1外设
    
    __HAL_I2C_ENABLE(&hi2c1);   //  使能I2C1外设
    //  1. 唤醒AM2320
    HAL_I2C_Master_Transmit(&hi2c1,AM2320_ADDRESS,0,0,10);
    osDelay(3);
    //  2. 向AM2320发送读指令,读湿度、温度数据,共4字节
    HAL_I2C_Master_Transmit(&hi2c1,AM2320_ADDRESS,IIC_TX_Buffer,3,10);
    osDelay(3);
    //  3. 从AM2320读数据
    HAL_I2C_Master_Receive(&hi2c1,AM2320_ADDRESS,IIC_RX_Buffer,8,10);
    //  4. 计算温湿度数据。回复的消息中B0是功能码,B1是数据长度
    if((IIC_RX_Buffer[0] != 0x03) || (IIC_RX_Buffer[1] != 0x04)) {
        *pHumidity    = 20000;//以极大值表示错误数据
        *pTemperature = 20000;//以极大值表示错误数据
    } else {
        *pHumidity    = ((IIC_RX_Buffer[2] << 8) | IIC_RX_Buffer[3]) & 0x7FFF;
        *pTemperature = ((IIC_RX_Buffer[4] << 8) | IIC_RX_Buffer[5]) & 0x7FFF;
        if(IIC_RX_Buffer[2] & 0x80)
            *pTemperature = 0 - *pTemperature;
    }
    
    __HAL_I2C_DISABLE(&hi2c1);  //  禁用I2C1外设
}

鉴于STM32的硬件I2C不是那么让人放心,在调用函数的时候,总是先把I2C硬件复归,然后重新初始化…至于不这么操作,具体会不会出现硬件故障,这里就不做深究了

你可能感兴趣的:(电子,电路,MCU及外设驱动,嵌入式软件)