本帖最后由 数码小叶 于 2022-9-3 11:58 编辑
在第一篇:【STM32H750B-DK评测】一:开箱 https://bbs.21ic.com/icview-3248872-1-1.html?fromuser=%E6%95%B0%E7%A0%81%E5%B0%8F%E5%8F%B6(出处: 21ic电子技术开**坛)。
中提到,跟随STM32H750B-DK一起有块STMod+的扩展板以及SHT3x湿度传感器模块,因此需要驱动起来。
查看SHT3x湿度传感器模块的原理图
其给出的接口是IIC形式,在STMod+的扩展板上,也引出了标准的IIC接口,刚好可以使用
为了后面不占用太多的CPU资源,决定用硬件IIC,这样再加上DMA基本可以忽略对cpu的占用。
根据原理图,STMod+的扩展板上的IIC使用的是PD12和PD13两个管脚
参考数据手册STM32H750xB pin/ball definition,PD12/PD13对应的是IIC4,初始化对应管脚为IIC功能
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C4;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
hi2c4.Instance = I2C4;
hi2c4.Init.Timing = 0x10C0ECFF;
hi2c4.Init.OwnAddress1 = 0;
hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c4.Init.OwnAddress2 = 0;
hi2c4.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2c4.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c4.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c4) != HAL_OK)
{
Error_Handler();
}
SHT3x系列湿度传感器包括低成本版本SHT30、标准版本SHT31,以及高端版本SHT35,模块板载的是SHT30-DIS-B,,2.15 - 5.5 V的宽电压支持,其精度可以达到
湿度:±2@10-90% RH 、温度:±0.2@0-65 °C。
要驱动SHT3x,得从数据手册获取几个信息,比如IIC的地址、时序、基本的指令等。
跟很多器件一样,一个ADDR引脚决定了地址的末位。剩下的指令操作,发现数据手册也都给出了解释以及操作时序图,这个确实比一般手册给的生动的多
在手册中,也找到了温湿度的换算关系式,数字式的就是这点方便
虽然给的接口都是标准的,但美中不足的是配套的SHT3x湿度传感器模块给的是排针,STMod+的扩展板是XA接插件连接方式,两者不能直接相连,最后只能使用杜邦线连接了。
相比于其他IIC器件,驱动SHT3x主要在CRC校验上多花了点时间,在数据手册以及时序图上都有表述:
“All SHT3x-DIS commands and data are mapped to a 16-bit address space. Additionally, data and commands are protected with a CRC checksum. This increases communication reliability. The 16 bits commands to the sensor already include a 3 bit CRC checksum. Data sent from and received by the sensor is always succeeded by an 8 bit CRC.”
最后结合给的CRC参数,失败几次后,成功完成了CRC校验
#define CRC8_Polynomial 0x31
uint8_t CheckCRC8(uint8_t* const Date_check, uint8_t Date_initial)
{
uint8_t CRC_calculates;
uint8_t i = 0, j = 0;
CRC_calculates = Date_initial;
for(j = 0; j<2;j++)
{
CRC_calculates ^= Date_check[j];
for (i = 0; i<8; i++)
{
if (CRC_calculates & 0x80)
{
CRC_calculates = (CRC_calculates <<1)^Polynomial;
}
else
{
CRC_calculates = (CRC_calculates <<1);
}
}
}
return CRC_calculates;
数次卡在CRC校验失败后终于校验通过了
下一步就是利用touchGFX的Model-View-Presenter的思路,将数值传到屏幕上,再结合控件完成温湿度值的监测。
|