摘要:如圖所示在了解起始條件和停止條件后,我們再來看看在這個(gè)過程中數(shù)據(jù)的傳輸是如何進(jìn)行的。四參考資料通過接口實(shí)現(xiàn)溫濕度的采集硬件和軟件區(qū)別
I2C 總線在物理連接上非常簡單,分別由SDA(串行數(shù)據(jù)線)和SCL(串行時(shí)鐘線)及上拉電阻組成。通信原理是通過對SCL和SDA線高低電平時(shí)序的控制,來 產(chǎn)生I2C總線協(xié)議所需要的信號進(jìn)行數(shù)據(jù)的傳遞。在總線空閑狀態(tài)時(shí),這兩根線一般被上面所接的上拉電阻拉高,保持著高電平。
I2C協(xié)議規(guī)定,總線上數(shù)據(jù)的傳輸必須以一個(gè)起始信號作為開始條件,以一個(gè)結(jié)束信號作為傳輸?shù)耐V箺l件。起始和結(jié)束信號總是由主設(shè)備產(chǎn)生。總線在空閑狀態(tài) 時(shí),SCL和SDA都保持著高電平,當(dāng)SCL為高電平而SDA由高到低的跳變,表示產(chǎn)生一個(gè)起始條件;當(dāng)SCL為高而SDA由低到高的跳變,表示產(chǎn)生一個(gè) 停止條件。在起始條件產(chǎn)生后,總線處于忙狀態(tài),由本次數(shù)據(jù)傳輸?shù)闹鲝脑O(shè)備獨(dú)占,其他I2C器件無法訪問總線;而在停止條件產(chǎn)生后,本次數(shù)據(jù)傳輸?shù)闹鲝脑O(shè)備 將釋放總線,總線再次處于空閑狀態(tài)。如圖所示:
在了解起始條件和停止條件后,我們再來看看在這個(gè)過程中數(shù)據(jù)的傳輸是如何進(jìn)行的。數(shù)據(jù)傳輸以字節(jié)為單位。主設(shè)備在SCL線上產(chǎn)生每個(gè) 時(shí)鐘脈沖的過程中將在SDA線上傳輸一個(gè)數(shù)據(jù)位,當(dāng)一個(gè)字節(jié)按數(shù)據(jù)位從高位到低位的順序傳輸完后,緊接著從設(shè)備將拉低SDA線,回傳給主設(shè)備一個(gè)應(yīng)答位, 此時(shí)才認(rèn)為一個(gè)字節(jié)真正的被傳輸完成。當(dāng)然,并不是所有的字節(jié)傳輸都必須有一個(gè)應(yīng)答位,比如:當(dāng)從設(shè)備不能再接收主設(shè)備發(fā)送的數(shù)據(jù)時(shí),從設(shè)備將回傳一個(gè)否 定應(yīng)答位。數(shù)據(jù)傳輸?shù)倪^程如圖所示:
I2C總線上的每一個(gè)設(shè)備都對應(yīng)一個(gè)唯一的地址,主從設(shè)備之間的數(shù)據(jù)傳輸是建立在地址的基礎(chǔ)上,也就是說,主設(shè)備在傳輸有效數(shù)據(jù)之前 要先指定從設(shè)備的地址,地址指定的過程和上面數(shù)據(jù)傳輸?shù)倪^程一樣,只不過大多數(shù)從設(shè)備的地址是7位的,然后協(xié)議規(guī)定再給地址添加一個(gè)最低位用來表示接下來 數(shù)據(jù)傳輸?shù)姆较颍?表示主設(shè)備向從設(shè)備寫數(shù)據(jù),1表示主設(shè)備向從設(shè)備讀數(shù)據(jù)。如圖所示:
所謂硬件I2C對應(yīng)芯片上的I2C外設(shè),有相應(yīng)I2C驅(qū)動電路,其所使用的I2C管腳也是專用的;軟件I2C一般是用GPIO管腳,用軟件控制管腳狀態(tài)以模擬I2C通信波形。
模擬I2C 是通過GPIO,軟件模擬寄存器的工作方式,而硬件(固件)I2C是直接調(diào)用內(nèi)部寄存器進(jìn)行配置。如果要從具體硬件上來看,可以去看下芯片手冊。因?yàn)楣碳蘒2C的端口是固定的,所以會有所區(qū)別。
(1)硬件IIC用法比較復(fù)雜,模擬IIC的流程更清楚一些。
(2) 硬件IIC速度比模擬快,并且可以用DMA
(3)模擬IIC可以在任何管腳上,而硬件只能在固定管腳上。
軟件i2c是程序員使用程序控制SCL,SDA線輸出高低電平,模擬i2c協(xié)議的時(shí)序。一般較硬件i2c穩(wěn)定,但是程序較為繁瑣,但不難。
硬件i2c程序員只要調(diào)用i2c的控制函數(shù)即可,不用直接的去控制SCL,SDA高低電平的輸出。但是有些單片機(jī)的硬件i2c不太穩(wěn)定,調(diào)試問題較多。
具體信息請到官方下載對應(yīng)產(chǎn)品介紹文檔,資料鏈接如下
http://www.aosong.com/class-36.html
在野火提供的示例代碼中,打開一個(gè)只包含固件庫的空項(xiàng)目。向工程中添加相關(guān)代碼,添加代碼的具體內(nèi)容請參考下面鏈接:
https://blog.csdn.net/hhhhhh277523/article/details/111397514
1.AHT20芯片的使用過程
void read_AHT20_once(void){ delay_ms(10); reset_AHT20();//重置AHT20芯片 delay_ms(10); init_AHT20();//初始化AHT20芯片 delay_ms(10); startMeasure_AHT20();//開始測試AHT20芯片 delay_ms(80); read_AHT20();//讀取AHT20采集的到的數(shù)據(jù) delay_ms(5);}
2.AHT20芯片讀取數(shù)據(jù)
void read_AHT20(void){ uint8_t i; for(i=0; i<6; i++) { readByte[i]=0; } I2C_Start();//I2C啟動 I2C_WriteByte(0x71);//I2C寫數(shù)據(jù) ack_status = Receive_ACK();//收到的應(yīng)答信息 readByte[0]= I2C_ReadByte();//I2C讀取數(shù)據(jù) Send_ACK();//發(fā)送應(yīng)答信息 readByte[1]= I2C_ReadByte(); Send_ACK(); readByte[2]= I2C_ReadByte(); Send_ACK(); readByte[3]= I2C_ReadByte(); Send_ACK(); readByte[4]= I2C_ReadByte(); Send_ACK(); readByte[5]= I2C_ReadByte(); SendNot_Ack(); //Send_ACK(); I2C_Stop();//I2C停止函數(shù) //判斷讀取到的第一個(gè)字節(jié)是不是0x08,0x08是該芯片讀取流程中規(guī)定的,如果讀取過程沒有問題,就對讀到的數(shù)據(jù)進(jìn)行相應(yīng)的處理 if( (readByte[0] & 0x68) == 0x08 ) { H1 = readByte[1]; H1 = (H1<<8) | readByte[2]; H1 = (H1<<8) | readByte[3]; H1 = H1>>4; H1 = (H1*1000)/1024/1024; T1 = readByte[3]; T1 = T1 & 0x0000000F; T1 = (T1<<8) | readByte[4]; T1 = (T1<<8) | readByte[5]; T1 = (T1*2000)/1024/1024 - 500; AHT20_OutData[0] = (H1>>8) & 0x000000FF; AHT20_OutData[1] = H1 & 0x000000FF; AHT20_OutData[2] = (T1>>8) & 0x000000FF; AHT20_OutData[3] = T1 & 0x000000FF; } else { AHT20_OutData[0] = 0xFF; AHT20_OutData[1] = 0xFF; AHT20_OutData[2] = 0xFF; AHT20_OutData[3] = 0xFF; printf("讀取失敗?。?!"); } printf("/r/n"); //根據(jù)AHT20芯片中,溫度和濕度的計(jì)算公式,得到最終的結(jié)果,通過串口顯示 printf("溫度:%d%d.%d",T1/100,(T1/10)%10,T1%10); printf("濕度:%d%d.%d",H1/100,(H1/10)%10,H1%10); printf("/r/n");}
溫濕度傳感器接法 由于本程序采用的軟件I2C實(shí)現(xiàn)的,采用GPIO引腳是PB6,PB7。具體定義代碼如下
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
#define IIC_SCL PBout(6) //SCL
#define IIC_SDA PBout(7) //SDA
#define READ_SDA PBin(7) 所以,SCL連接PB6,SDA連接PB7。 如果采用硬件I2C進(jìn)行實(shí)現(xiàn),可以查看關(guān)于STM32的原理圖,可以看到硬件I2C接口,野火stm32mini開發(fā)板的I2C接口是PA2,PA3,要實(shí)現(xiàn)硬件I2C讀取數(shù)據(jù),就根據(jù)上面使用的方式進(jìn)行配置,就可以完成通訊
本次實(shí)驗(yàn)了解了I2C總線協(xié)議的具體內(nèi)容、了解了硬件I2C和模擬I2C的主要區(qū)別,硬件I2C的效率要遠(yuǎn)高于軟件的,而軟件I2C由于不受管腳限制,接口比較靈活。學(xué)會了如何用stm32實(shí)現(xiàn)用實(shí)現(xiàn)溫濕度的測量。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/124459.html
摘要:三小結(jié)本次實(shí)驗(yàn)在實(shí)現(xiàn)了溫濕度數(shù)據(jù)采集并通過串口顯示和利用屏數(shù)據(jù)顯示代碼的基礎(chǔ)上,完成屏顯示采集的溫濕度數(shù)據(jù)也并不復(fù)雜,其中,溫濕度數(shù)據(jù)采集的過程使用的是模擬,屏的數(shù)據(jù)顯示采用的是。 ...
摘要:文章目錄一原理二實(shí)現(xiàn)顯示中文滾動顯示顯示字符串讀取溫濕度顯示溫濕度三結(jié)果開機(jī)顯示歡迎信息循環(huán)讀取溫濕度以及滾動顯示我的四總結(jié)五參考六源碼一原理的定義就是串行外圍設(shè)備接口。 ...
摘要:帶中文字庫的是一種具有位位并行線或線串行多種接口方式,內(nèi)部含有國標(biāo)一級二級簡體中文字庫的點(diǎn)陣圖形液晶顯示模塊其顯示分辨率為。貼片按鍵模塊支持標(biāo)準(zhǔn)的協(xié)議,完整的協(xié)議棧。以最低成本提供最大實(shí)用性,為功能嵌入其他系統(tǒng)提供無限可能。 項(xiàng)目簡介 開發(fā)環(huán)境: Keil5.14,CubeMX6.0.1,主...
摘要:使用庫讀寫環(huán)境光照度傳感器本文將教大家如何快速使用庫讀取光照度數(shù)據(jù)。五實(shí)驗(yàn)樣機(jī)測試展示通過之前配置好的面板,通過涂鴉智能進(jìn)行配網(wǎng)實(shí)時(shí)采集光照度傳感器的數(shù)據(jù)。 使用STM32 HAL庫讀寫環(huán)境光照度傳感器(BH1750) 本文將教大家如何快速使用STM32HAL庫讀取光照度數(shù)據(jù)。 實(shí)現(xiàn)功能:通...
摘要:基于的與通信連接,實(shí)現(xiàn)溫濕度數(shù)據(jù)互傳,控制第一步,在實(shí)現(xiàn)將傳感器數(shù)據(jù)采集之后,并且完成配網(wǎng)步驟,可以正常通過模塊正常將數(shù)據(jù)發(fā)送到云平臺之后進(jìn)行以下閱讀,上述內(nèi)容可以跳轉(zhuǎn)到以下鏈接進(jìn)行查看具體操作。 ...
閱讀 3032·2021-11-23 09:51
閱讀 1018·2021-09-26 09:55
閱讀 3981·2021-09-22 14:58
閱讀 1511·2021-09-08 09:35
閱讀 1089·2021-08-26 14:16
閱讀 894·2019-08-23 18:17
閱讀 2087·2019-08-23 16:45
閱讀 712·2019-08-23 15:55