STM32F0使用LL库实现SHT70通讯
在本次項目中,限于空間要求我們選用了STM32F030F4作為控制芯片。這款MCU不但封裝緊湊,而且自帶的Flash空間也非常有限,所以我們選擇了LL庫實現。本篇我們將基于LL庫采用模擬I2C接口的方式實現溫濕度采集。
1、SHT70簡述
SHT70是一款集溫濕度測量于一體的傳感器,現在對其作簡要介紹。其引腳定義如下:
SHT7X溫濕度傳感器使用的2線通訊,類似于I2C總線,但并不相同,使用普通的GPIO就可實現通訊。此次采用STM32F030F4來操作SHT70,具體的連接方式如下:
SCK 用于微處理器與SHT1x 之間的通訊同步。由于接口包含了完全靜態邏輯,因而不存在最小SCK 頻率。
DATA 引腳為三態結構,用于讀取傳感器數據 . 當向傳感器發送命令時, DATA 在 SCK 上升沿有效且在 SCK 高電平時必須保持穩定。 DATA 在 SCK 下降沿之后改變。為避免信號沖突,微處理器應驅動DATA 在低電平。需要一個外部的上拉電阻(例如:10kΩ)將信號提拉至高電平。上拉電阻通常已包含在微處理器的I/O 電路中。
2、軟件實現
我們了解了SHT70的相關特點,基于它類I2C的通訊方式,我們采用相關的GPIO來模擬I2C通訊。這里所說的I2C,并非常規意義上的I2C,而是面向SHT70的協議的I2C。
2.1、端口配置
所謂的端口配置其實就是對應的GPIO引腳的配置,其實就是將用于模擬I2C通訊的引腳按需要配置為不同的GPIO輸入輸出特性。具體代碼如下:
/*溫濕度變送器GPIO端口配置*/ static void SHT_GPIO_Configuration(void) {LL_GPIO_InitTypeDef GPIO_InitStruct;/* 使能GPIO端口時鐘 */LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);LL_GPIO_SetOutputPin(I2C_SCL_GPIO_Port, I2C_SCL_Pin);LL_GPIO_SetOutputPin(I2C_SDA_GPIO_Port, I2C_SDA_Pin);/* 配置SHT15通訊接口GPIO PA9、PA10 */GPIO_InitStruct.Pin = I2C_SCL_Pin;GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;LL_GPIO_Init(I2C_SCL_GPIO_Port, &GPIO_InitStruct);GPIO_InitStruct.Pin = I2C_SDA_Pin;GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;LL_GPIO_Init(I2C_SDA_GPIO_Port, &GPIO_InitStruct); }2.2、I2C操作函數
前面我們介紹了SHT70采用的是類似I2C的通訊接口,所以我們需要按照SHT70的要求來寫這個類I2C的操作函數。主要有3個內容:
2.2.1、SCK時鐘線的輸出操作
/*操作SCK引腳,設置高低操作*/ static void OperationSckPin(BusPinValue value) {if (value==Set){LL_GPIO_SetOutputPin(I2C_SCL_GPIO_Port, I2C_SCL_Pin);}else if(value==Reset){LL_GPIO_ResetOutputPin(I2C_SCL_GPIO_Port, I2C_SCL_Pin);} }2.2.2、SDA數據線的輸出操作
/*操作DATA引腳,設置高低操作*/ static void OperationDataPin(BusPinValue value) {if (value==Set){LL_GPIO_SetOutputPin(I2C_SDA_GPIO_Port, I2C_SDA_Pin);}else if(value==Reset){LL_GPIO_ResetOutputPin(I2C_SDA_GPIO_Port, I2C_SDA_Pin);} }2.2.3、SDA數據線的方向操作
/*將DATA線設置為輸入輸出方向模式*/ void SetDataPineDirection(IODirection direction) {LL_GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin = I2C_SDA_Pin;if(direction){ ?GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;}else{ ?GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;} ?LL_GPIO_Init(I2C_SDA_GPIO_Port, &GPIO_InitStruct); }2.3、通訊函數
現在說明一下傳感器通訊的實現。首先看一看其操作命令。傳感器的命令包含三個地址位(目前只支持000,這就是只能掛接在空閑的IIC總線上的原因)和五個命令位。SHT1x 會以下述方式表示已正確地接收到指令:在第8個SCK 時鐘的下降沿之后,將DATA 下拉為低電平(ACK 位)。在第9個SCK 時鐘的下降沿之后,釋放DATA(恢復高電平)。命令集如下:
| 命令 | 代碼 |
| 預留 | 0000x |
| 溫度測量 | 00011 |
| 濕度測量 | 00101 |
| 讀狀態寄存器 | 00111 |
| 寫狀態寄存器 | 00110 |
| 預留 | 0101x-1110x |
| 軟復位, 接口復位, 狀態寄存器復位即恢復為默認狀態.在要發送下一個命令前,至少等待 11ms. | 11110 |
而關于各種該命令操作的實現,SHT70與SHT1x是完全相同的,在我們前面的文章中曾詳述。而且這部分與LL實際上是沒關系的,準確的說與任何庫都沒關系,所以不再重復,有興趣可以產看前面的文章。
3、總結
我們已經完成可SHT70的相關函數與端口配置,我們還需要對我們的代碼進行驗證。將程序下載到目標板,監視結果如下:
從上圖,我們可以看到溫濕度的數據與實際一致。
歡迎關注:
?
總結
以上是生活随笔為你收集整理的STM32F0使用LL库实现SHT70通讯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言位运算八进制转二进制,C语言十进制
- 下一篇: 模拟网页行为之工具篇二