SHT30使用的學習過程2 SHT30驅動程式

2021-08-29 10:07:45 字數 3443 閱讀 1083

sht30使用的學習過程2**篇

給各位道個歉,**拖得有點久了,最近事情頗多,抱歉抱歉!

嗯,**篇我想把我寫的所有的**給各位需要使用sht30的朋友們介紹一遍,由於我這版是測試版,所以很多函式沒有封裝的很好,不過**可以用了,我測試的**已經通過,測量溫度和濕度精確到小數點後1位,在這裡想仔細給各位介紹一下我**的寫作過程,因為網上的**僅僅是**,很多開發sht30的小白(像我這樣的)沒辦法移植,或者根本不知道怎麼移植,在這裡我想詳細敘述我的**,包括最基本的i2c通訊,所以可能本次內容很囉嗦,希望各位見諒哈[by zwx lvmm]

上**,我的開發板是stm32f407,這部分屬於初始化配置,沒啥說的。

//io方向設定

#define sda_in()

//pb11輸入模式

#define sda_out()

//pb11輸出模式

//io操作函式

#define iic_scl

pbout(10

)//scl

#define iic_sda

pbout(11

)//sda

#define read_sda

pbin(11

)//輸入sda

void

iic_init

(void

)

此部分**看的原子哥的,io配置的方法也是學習原子哥的設定的。

如最開始的圖所示當scl是高電平的時候,把sda從高電平拉至低電平就可以了,先上這部分的**

void

iic_start

(void

)

這裡為什麼是延時4us,我猜測是按照標準頻率2mhz,最高4mhz計算一下,乙個資料週期大概5us-2.5us之間,還要考慮訊號的建立時間,所以選擇了4us作為乙個週期。其餘的不懂得可以看i2c的介紹。

void

iic_stop

(void

)

這個東西就是說,機器之間的通訊嘛,肯定是像我們使用對講機一樣,說完了一句話,就要加一句over,對方聽到了你的over,才能說他想說的,要不然就會兩個人一起說,肯定亂套了,所以才會有這兩個訊號,而有的時候我們不用說over,比如我們對話結束了,和對方說再見,說完就意味著對話結束了,所以也可以不產生應答訊號。**如下,具體的時序邏輯同樣參考原子哥,各位可以自己學習一下,如果你沒學,就理解一下這個**是幹啥的就行,也一樣可以寫**。

void

iic_ack

(void

)void

iic_nack

(void)

u8 iic_wait_ack

(void)}

iic_scl=0

;//時鐘輸出0

return0;

}

這部分是比較關鍵的,i2c傳送資料這裡是8位的模式,我看到的i2c一般都是資料8位8位發的,傳送的時候乙個週期是4us,scl是高電平的時候要保證資料有效,所以資料必須要在scl變高之前建立完畢,這裡可能有些人不太明白資料的建立是什麼意思,其實就是點平從0變為1不是一瞬間變化完成的,而實經過一段時間漲上去的,其實就是需要一段時間才能點平0->1或者1->0,雖然這段時間很短,但是對於一些速度比較快的協議可能就不能忽略這個影響了。>>這個是移位操作符,不懂得可以去查一查。

void

iic_send_byte

(u8 txd)

}

這部分接收,和傳送差不多,每個週期都分成了兩個2us

//乙個引數 ack  當ack=1,傳送應答訊號,ack=0不傳送應答訊號

u8 iic_read_byte

(unsigned char ack)if(

!ack)

iic_nack()

;//傳送nack

else

iic_ack()

;//傳送ack

return receive;

}

流程:2c開始訊號->7位i2c位址+0(寫操作標誌位)(前面介紹了,如果addr接低電平,那麼這裡就是0x88,如果接高電平就是0x8a)->命令msb->命令lsb(eg 0x2130 高可重複性,1秒測量一次)-> i2c停止訊號。

void

sht_init

(void

)

這樣設定完畢之後,sht30每1秒就會自動測量一次溫度,相關暫存器就更新一次值。

我加了注釋,各位看**的注釋:

void

sht30_read_temp_humi

(u8 *p)

這裡面有兩個全域性變數用來存放轉換的溫度和濕度資料,下面我也寫了資料,各位可以參考

int sht30_data_process

(void

)else

temporary[0]

=data_process.sht30_data_buffer[3]

; temporary[1]

=data_process.sht30_data_buffer[4]

; temporary[2]

=data_process.sht30_data_buffer[5]

;//crc校驗

crc_result=

sht30_crc8_check

(temporary,

2,temporary[2]

);if(crc_result==0)

else

}

int  crc8_compute

(u8 *check_data, u8 num_of_data)

else}}

return crc;

}int sht30_crc8_check

(u8 *p,u8 num_of_data,u8 crcdata)

return0;

}

最後說一下怎麼使用我的這些**,大家可以把所有的**都放到乙個c檔案裡面,然後主函式裡面先初始化一下io口,然後初始化一下sht30,之後就可以呼叫一次sht30_data_process();這個函式就可以得到溫度值了(別忘記那個函式裡面提到的全域性變數)(我設定的模式是1s一次,所以sht30內部暫存器只會1s改變一次資料,如果程式設定的讀取週期太快,也不會一直變化哦,也是1s一次,如果想要重新整理頻率快一些,可以嘗試其他模式,不過太快了個人感覺沒什麼必要)。

親自測試過了,這個**可以用,測得的室溫是26.1度左右,資料不是很穩定,有0.2度左右的波動。由於資料顯示在0.96的oled上,太小了,**不是很清楚,就沒圖了~

技術小白自己摸爬滾打寫的**,希望大佬指正~~感謝感謝,也希望幫助有需要的人。

SHT30使用的學習過程1SHT30工作模式介紹

sht30使用的學習過程1sht30工作模式介紹 篇這裡 引腳 功能1 sdai2c資料線,要接10k上拉電阻 2 addr 不可懸空 用於選擇i2c的位址,當兩個或兩個以上的sht30接入同乙個匯流排的時候才會使用。一般接地,位址是0x44,若接高電平 則位址是0x45 注意開啟訊號的時候,傳送的...

sht30使用心得自述

sht30是盛世瑞恩生產的溫濕度感測器,這個是乙個瑞士企業。從sht10到sht31,盛世瑞恩的感測器還是不錯了。小公尺的溫濕度感測器使用的也是sht30.下面介紹一下使用方法。sht30最高支援1000k的傳輸速率。因此通訊時間非常短。sht30有兩種讀取數值的方法,我介紹一下使用iic的狀態查詢...

我的儲存過程學習2

業務系統需要乙個關於合同狀態的報表,主要顯示合同的狀態,地區,合同客戶型別,合同金額,利息金額等資訊.在中存在4個表 crec01c,sysc01,sysc03d,crmc02分別是 合同主表 區域及業務夥伴 系統狀態 法人資訊表 下面第乙個儲存過程是我第一次寫的,執行時間是5秒 效率較差的儲存過程...