STM32MP157資源擴展板驅動移植篇2:擴展板空氣溫濕度傳感器控制

寫在前面:
本文章為《STM32MP157資源擴展板驅動移植篇》系列中的一篇,筆者使用的開發(fā)平臺為華清遠見FS-MP1A開發(fā)板(STM32MP157開發(fā)板)。資源擴展板是FS-MP1A開發(fā)板的擴展模塊,主要包含了10余種助主流傳感器、執(zhí)行器件、總線控制器件,非常方便項目擴展用??赏卣归_發(fā)智慧家庭、智能醫(yī)療、智能安防、工業(yè)控制、圖像識別、環(huán)境檢測等方向的10個左右綜合項目,華清遠見開發(fā)板也將配套提供所有項目的說明文檔、實驗源碼、應用程序等資料。
針對FS-MP1A開發(fā)板,除了資源擴展板驅動移植篇外,還包括其他多系列教程,包括Cortex-A7開發(fā)篇、Cortex-M4開發(fā)篇、FreeRTOS篇、Linux應用開發(fā)篇、Linux系統移植篇、Linux驅動開發(fā)篇、硬件設計篇、人工智能機器視覺篇、Qt應用編程篇、Qt綜合項目實戰(zhàn)篇等。歡迎關注,更多stm32mp157開發(fā)教程及視頻,可加技術交流Q群459754978,感謝關注。
資源擴展板介紹
硬件介紹

打開百度APP看高清圖片
資源擴展板可開發(fā)項目

擴展板空氣溫濕度傳感器控制
實驗原理
打開擴展板原理圖對照擴展板可以看到擴展板有1個溫濕度傳感器SI7006,如下圖:

由上圖可見可通過I2C總線與SI7006通信。

擴展板與底板接口對照圖
查看原理圖可知數據線I2C1_SDA、I2C1_SCL和I2C_INT1管腳對應關系如下:

查看SI7006芯片手冊確認設備七位從機地址為:0x40

實驗目的
了解溫濕度傳感器工作原理
學習I2C協議的使用方法,掌握如何利用STM32MP157A芯片控制SI7006溫濕度傳感器
實驗環(huán)境
FS-MP1A開發(fā)平臺
ST-Link仿真器
STM32CubeIDE開發(fā)軟件
PC機 XP、Window7/10 (32/64bit)
實驗步驟
打開STM32CubeIDE,配置CubeMX。
首先根據前幾章內容配置好系統時鐘與串口打印,然后對PF14、PF15引腳分別配置成I2C1_SCL與I2C1_SDA,切換到I2C1標簽,勾選給“M4”,選中“I2C”,如下圖所示。


上述為新建工程配置過程,可參考12.3.2章節(jié)進行導入已有工程,工程存放路徑【華清遠見-FS-MP1A開發(fā)資料\02-程序源碼\ARM體系結構與接口技術\Cortex-M4\8_EX_I2C_TEM】
代碼實現
由于使用的是硬件I2C,不需要自己寫程序實現I2C時序,我們需要做的僅僅是調用HAL提供的硬件I2C操作函數。其中,調用“HAL_I2C_Master_Transmit”函數發(fā)送數據,調用“HAL_I2C_Master_Receive”函數接收數據,創(chuàng)建driver_si_7006.c文件實現傳感器的控制。其代碼如下
uint8_t?SI7006_Init(void)
{
HAL_I2C_Init(&hi2c1);
SI7006_WriteByte(SI7006CMD_RESET);
HAL_Delay(50);
return?0;
}
void?SI7006_ReadDataTest(void)
{
uint16_t hum = 0, tem = 0,tem_1 = 0,tem_2 = 0;
hum = SI7006_Read_Data(SI7006CMD_RH_HOLD);
tem = SI7006_Read_Data(SI7006CMD_TEMP_HOLD);
tem = ((17572*tem)/65536 - 4685);
hum = (125*hum/65536 - 6);
tem_1 = tem/100;
tem_2 = tem%100;
printf("\r hum = %d%% \n", hum);
printf("\r tem = %d.%d\n", tem_1,tem_2);
}
uint8_t?SI7006_WriteByte(uint8_t reg)
{
uint8_t write_data = reg;
if(HAL_I2C_Master_Transmit(&hi2c1, SI7006_ADDR | SI7006_W , (uint8_t*)&write_data, 1, 300) != HAL_OK)
{
Error_Handler();
}
while?(HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);
return?0;
}
uint16_t?SI7006_ReadWord(uint8_t reg)
{
uint16_t read_data = 0;
if(HAL_I2C_Master_Transmit(&hi2c1, SI7006_ADDR | SI7006_W , (uint8_t*)®, 1, 300) != HAL_OK) //發(fā)送命令
{
Error_Handler();
}
while?(HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);
if(HAL_I2C_Master_Receive(&hi2c1, SI7006_ADDR | SI7006_R , (uint8_t*)&read_data, 2, 300) != HAL_OK) //接收word數據
{
Error_Handler();
}
return?read_data;
}
uint16_t?SI7006_Read_Data(uint16_t cmd)
{
uint16_t data = 0,data_low = 0,data_high = 0;
data = SI7006_ReadWord(cmd); //采集溫濕度
data_low = (data & 0xff); //進行高低字節(jié)轉換
data_high = (data >> 8) & 0xff;
data = (data_low << 8) + data_high;
return?data;
}
其中,使用“HAL_I2C_Master_Receive”接收16位數據時,由于先接收的高字節(jié)數據,然后是低字節(jié)數據,所以,在使用數據時需要進行高低字節(jié)調換。
在主函數里,先分別初始化I2C與SI7006,再調用“SI7006_ReadDataTest”函數即可以采集溫濕度傳感器數值。