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硬件复归,然后重新初始化…至于不这么操作,具体会不会出现硬件故障,这里就不做深究了 |