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秒 效率較差的儲存過程...