日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32F0使用LL库实现SHT70通讯

發布時間:2024/7/23 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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通讯的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。