總結學習i2c匯流排通訊協議,完成基於i2c硬體協議的aht20溫濕度感測器的資料採集,並將採集的溫度-濕度值通過串列埠輸出。
具體任務:
1)解釋什麼是「軟體i2c」和「硬體i2c」? (閱讀野火配套教材的第23章「i2c–讀寫eeprom」原理章節)
2)閱讀aht20資料手冊,程式設計實現:每隔2秒鐘採集一次溫濕度資料,並通過串列埠傳送到上位機(win10)。
軟體i2c一般是用gpio管腳,用軟體控制管腳狀態以模擬i2c通訊波形。
i2c bus(inter-integrated circuit bus) 最早是由philips半導體(現被nxp收購)開發的兩線時序列匯流排,常用於微控制器與外設之間的連線。i2c協議規定,匯流排上資料的傳輸必須以乙個起始訊號作為開始條件,以乙個結束訊號作為傳輸的停止條件。起始和結束訊號總是由主裝置產生。起始和結束訊號產生條件:匯流排在空閒狀態時,scl和sda都保持著高電平,當scl為高電平而sda由高到低的跳變,表示產生乙個起始條件;當scl為高而sda由低到高的跳變,表示產生乙個停止條件。
硬體i2c的效率要遠高於軟體的,而軟體i2c由於不受管腳限制,介面比較靈活。
如何判斷
可以看底層配置,比如io口配置,如果配置了io口的功能(iic功能)那就是韌體iic,否則就是模擬
可以看iic寫函式,看裡面有木有呼叫現成的函式或者給某個暫存器賦值,如果有,則肯定是韌體iic功能,沒有的話肯定是資料乙個bit乙個bit模擬發生送的,肯定用到了迴圈,則為模擬。
根據**量判斷,模擬的**量肯定比韌體的要大。
硬體iic用法比較複雜,模擬iic的流程更清楚一些。
硬體iic速度比模擬快,並且可以用dma
模擬iic可以在任何管腳上,而硬體只能在固定管腳上。
軟體i2c是程式設計師使用程式控制scl,sda線輸出高低電平,模擬i2c協議的時序。一般較硬體i2c穩定,但是程式較為繁瑣,但不難。
硬體i2c程式設計師只要呼叫i2c的控制函式即可,不用直接的去控制scl,sda高低電平的輸出。但是有些微控制器的硬體i2c不太穩定,除錯問題較多。
注:此次實驗用的軟體i2c此次實驗所用的程式資料為野火自帶資料報
改寫程式:
main.c程式**改寫如下:
#include
"sys.h"
#include
"delay.h"
#include
"usart.h"
#include
"bsp_i2c.h"
uint8_t t;
uint8_t len;
uint16_t times=0;
intmain
(void
)}
將bsp_i2c.c中的void reset_aht20(void)改為
void
reset_aht20
(void
)
將bsp_i2c.c中的void init_aht20(void)改為
void
init_aht10
(void
)
將bsp_i2c.c中的void read_aht20(void)改為
void
read_aht10
(void
)//-------------
i2c_start()
;i2c_writebyte
(0x71);
ack_status =
receive_ack()
;if(ack_status)
printf
(" ");
else
printf
("11-n-");
readbyte[0]
=i2c_readbyte()
;printf
(" "
,readbyte[0]
);send_ack()
; readbyte[1]
=i2c_readbyte()
;printf
(" "
,readbyte[1]
);send_ack()
; readbyte[2]
=i2c_readbyte()
;printf
(" "
,readbyte[2]
);send_ack()
; readbyte[3]
=i2c_readbyte()
;printf
(" "
,readbyte[3]
);send_ack()
; readbyte[4]
=i2c_readbyte()
;printf
(" "
,readbyte[4]
);send_ack()
; readbyte[5]
=i2c_readbyte()
;printf
(" "
,readbyte[5]
);sendnot_ack()
;//send_ack();
i2c_stop()
;//--------------if(
(readbyte[0]
&0x68)==
0x08
)else
printf
("\r\n");
printf
("îâ¶è:%d%d.%d\n"
,t1/
100,
(t1/10)
%10,t1%10)
;printf
("ꪶè:%d%d.%d"
,h1/
100,
(h1/10)
%10,h1%10)
;printf
("\r\n");
}
編譯程式,生成可執行檔案.hex
燒錄程式,執行結果如下:
通過這次實驗,我對stm32的操作更加流暢了,又是大有收穫的一天。
AHT10 溫濕度感測器
aht10 標頭檔案 ifndef i2c ath10 h define i2c ath10 h include c types.h void delayms u32 ms void aht10init void aht10 rst unsigned char aht10 status unsign...
STM32F405 標準庫 SHT20溫濕度感測器
sht20是個溫濕度感測器,使用i2c通訊 下面的i2c程式需要換成你們自己的i2c程式 softreset函式 硬體初始化 set resolution函式 設定解析度 readsht20函式 開始測量 在main.c主函式裡面這樣呼叫 if softreset 0 while 1 sht20.c...
基於IIC實現溫濕度採集
2 aht20溫濕度感測器 3 實現溫濕度採集 4 總結 iic inter integrated circuit 其實是iicbus簡稱,所以中文應該叫積體電路匯流排,它是一種序列通訊匯流排,使用多主從架構,速率較低。iic就是i2c正確讀法為 i平方c 其有兩個物理介面分別為scl和sda sc...