成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

stm32通過I2C接口實(shí)現(xiàn)溫濕度(AHT20)的采集

chengtao1633 / 3031人閱讀

摘要:如圖所示在了解起始條件和停止條件后,我們再來看看在這個(gè)過程中數(shù)據(jù)的傳輸是如何進(jìn)行的。四參考資料通過接口實(shí)現(xiàn)溫濕度的采集硬件和軟件區(qū)別

一、I2C總線協(xié)議詳解

(一)I2C總線物理拓?fù)浣Y(jié)構(gòu)


I2C 總線在物理連接上非常簡單,分別由SDA(串行數(shù)據(jù)線)和SCL(串行時(shí)鐘線)及上拉電阻組成。通信原理是通過對SCL和SDA線高低電平時(shí)序的控制,來 產(chǎn)生I2C總線協(xié)議所需要的信號進(jìn)行數(shù)據(jù)的傳遞。在總線空閑狀態(tài)時(shí),這兩根線一般被上面所接的上拉電阻拉高,保持著高電平。

(二)I2C總線協(xié)議

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和模擬I2C

1.硬件I2C

所謂硬件I2C對應(yīng)芯片上的I2C外設(shè),有相應(yīng)I2C驅(qū)動電路,其所使用的I2C管腳也是專用的;軟件I2C一般是用GPIO管腳,用軟件控制管腳狀態(tài)以模擬I2C通信波形。

2.模擬I2C

模擬I2C 是通過GPIO,軟件模擬寄存器的工作方式,而硬件(固件)I2C是直接調(diào)用內(nèi)部寄存器進(jìn)行配置。如果要從具體硬件上來看,可以去看下芯片手冊。因?yàn)楣碳蘒2C的端口是固定的,所以會有所區(qū)別。

3.區(qū)別

  • 硬件I2C的效率要遠(yuǎn)高于軟件的,而軟件I2C由于不受管腳限制,接口比較靈活。
  • 可以看底層配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是固件IIC,否則就是模擬
  • 可以看IIC寫函數(shù),看里面有木有調(diào)用現(xiàn)成的函數(shù)或者給某個(gè)寄存器賦值,如果有,則肯定是固件IIC功能,沒有的話肯定是數(shù)據(jù)一個(gè)bit一個(gè)bit模擬發(fā)生送的,肯定用到了循環(huán),則為模擬。
  • 根據(jù)代碼量判斷,模擬的代碼量肯定比固件的要大。
  • (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)試問題較多。

二、實(shí)現(xiàn)AHT20采集程序

(一)了解AHT20芯片的相關(guān)信息

具體信息請到官方下載對應(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)行配置,就可以完成通訊

(五)運(yùn)行結(jié)果

三、總結(jié)

本次實(shí)驗(yàn)了解了I2C總線協(xié)議的具體內(nèi)容、了解了硬件I2C和模擬I2C的主要區(qū)別,硬件I2C的效率要遠(yuǎn)高于軟件的,而軟件I2C由于不受管腳限制,接口比較靈活。學(xué)會了如何用stm32實(shí)現(xiàn)用實(shí)現(xiàn)溫濕度的測量。

四、參考資料

stm32通過I2C接口實(shí)現(xiàn)溫濕度(AHT20)的采集
硬件IIC和軟件IIC區(qū)別

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/124459.html

相關(guān)文章

  • 基于STM32OLED屏顯示AHT20采集濕度數(shù)據(jù)

    摘要:三小結(jié)本次實(shí)驗(yàn)在實(shí)現(xiàn)了溫濕度數(shù)據(jù)采集并通過串口顯示和利用屏數(shù)據(jù)顯示代碼的基礎(chǔ)上,完成屏顯示采集的溫濕度數(shù)據(jù)也并不復(fù)雜,其中,溫濕度數(shù)據(jù)采集的過程使用的是模擬,屏的數(shù)據(jù)顯示采用的是。 ...

    vincent_xyb 評論0 收藏0
  • STM32F103基于spi實(shí)現(xiàn)OLED顯示

    摘要:文章目錄一原理二實(shí)現(xiàn)顯示中文滾動顯示顯示字符串讀取溫濕度顯示溫濕度三結(jié)果開機(jī)顯示歡迎信息循環(huán)讀取溫濕度以及滾動顯示我的四總結(jié)五參考六源碼一原理的定義就是串行外圍設(shè)備接口。 ...

    xfee 評論0 收藏0
  • 基于STM32平臺數(shù)字溫度顯示器系統(tǒng)設(shè)計(jì)

    摘要:帶中文字庫的是一種具有位位并行線或線串行多種接口方式,內(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,主...

    villainhr 評論0 收藏0
  • STM32CubeMX學(xué)習(xí)教程之硬件I2C讀取光照度

    摘要:使用庫讀寫環(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)功能:通...

    tinylcy 評論0 收藏0
  • 基于STM32ESP8266 WIFI與ONENET通信連接(2),云平臺以及手機(jī)APP數(shù)據(jù)顯示

    摘要:基于的與通信連接,實(shí)現(xiàn)溫濕度數(shù)據(jù)互傳,控制第一步,在實(shí)現(xiàn)將傳感器數(shù)據(jù)采集之后,并且完成配網(wǎng)步驟,可以正常通過模塊正常將數(shù)據(jù)發(fā)送到云平臺之后進(jìn)行以下閱讀,上述內(nèi)容可以跳轉(zhuǎn)到以下鏈接進(jìn)行查看具體操作。 ...

    antz 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<