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