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硬件復歸,然後重新初始化…至於不這麼操作,具體會不會出現硬件故障,這裏就不做深究了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章