摘要:
本文先介紹一下對I2C學習的理解,然后用I2C實作AHT20進行溫濕度采集
文章目錄
- 摘要:
- 一、I2C簡介
- 二、硬體I2C與軟體I2C的區別
- 三、實作I2CAHT20溫濕度傳感器的資料采集
- 1、AHT20簡介
- 2、配置函式庫,撰寫函式
- 4、最終結果展示
- 四、總結
一、I2C簡介
IC( Inter-- Integrated Circuit)總線是一種由 PHILIPS公司開發的兩線式串行總線,用于連接微控制器及其外圍設備,它是由資料線SDA和時鐘SCL構成的串行總線,可發送和接收資料,
在CPU與被控I2C之間、I2C與I2C之間進行雙向傳送,高速IC總線一般可達400kbps以上, I2C總線在傳送資料程序中共有三種型別信號,它們分別是:開始信號、結束信號和應答信號,
- 開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送資料,
- 結束信號:SCL為高電平時,SDA由低電平向高電平跳變,結東傳送資料,
- 應答信號:接收資料的IC在接收到8bit資料后,向發送資料的IC發出特定的低電平脈沖表示已收到資料,CPU向受控單元發出一個信號后,等待受控單元發出一個應答信號,CPU接
收到應答信號后,根據實際情況作出是否繼續傳遞信號的判斷,若未收到應答信號,由判斷為 受控單元出現故障,
這些信號中,起始信號是必需的,結束信號和應答信號,都可以不要,
?? stm32(正點原子)的SLC和SDA的連接如下:

二、硬體I2C與軟體I2C的區別
🏳??🌈 硬體I2C
硬體I2C對應芯片上的I2C外設,有相應I2C驅動電路,其所使用的I2C管腳也是專用的
🏳??🌈 軟體I2C
軟體I2C一般是用GPIO管腳,用軟體控制管腳狀態以模擬I2C通信波形
硬體I2C的效率要遠高于軟體的,而軟體I2C由于不受管腳限制,介面比較靈活
模擬I2C 是通過GPIO,軟體模擬暫存器的作業方式,而硬體(韌體)I2C是直接呼叫內部暫存器進行配置,如果要從具體硬體上來看,可以去看下芯片手冊,因為韌體I2C的埠是固定的,所以會有所區別,
區分他們:
- 可以看底層配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是韌體IIC
- 可以看IIC寫函式,看里面有木有呼叫現成的函式或者給某個暫存器賦值,如果有,則肯定是韌體IIC功能,沒有的話肯定是資料一個bit一個bit模擬發生送的,肯定用到了回圈,則為模擬,
根據代碼量判斷,模擬的代碼量肯定比韌體的要大,
三、實作I2CAHT20溫濕度傳感器的資料采集
1、AHT20簡介
AHT20是國內奧松生成的I2C介面的MEMS溫濕度傳感器,ADC位數為20Bit,具有體積小、精度高、成本低等優點,
由于AHT10/15/20 具有國產化、體積小、精度高、成本低等特點,可以替代 DHT11/DHT12/AM2320/SHT20/SHT30,單芯片價格在¥2~3,體積小巧很輕松嵌入到產品上
引數如下:
| AHT20 | |
|---|---|
| 供電電壓 | 2.0-5.5V |
| 作業電流(休眠) | 0.25uA |
| 作業電流(測量) | 23uA |
| 測量范圍(濕度) | 0~100%RH |
| 測量范圍(溫度) | -40~+85℃ |
| 溫度精度 | ±2%RH(25℃) |
| 濕度精度 | ±0.3℃ |
| 解析度 | 溫度: 0.01℃ 濕度: 0.024%RH |
| 信號輸出 | I2C信號 |
| 防護 | 無 |
| 封裝大小 | 3x3x1.0mm(DFN) |
2、配置函式庫,撰寫函式
參考 正點原子STM32開發板第27章 IIC實驗
step0:驅動代碼(官網下載),下載AHT20.c和AHT20.h,官網都有,另外最重要的還是I2C可以參考原子的代碼在myiic下就是關于i2c的代碼,
對于正點原子的精英版,其SCL和SDL分別對應的就是PB6和PB7,我們用普通IO口來模擬I2C的功能,來實作功能,

step1:用例程原子I2C例程!基本函式庫的基本框架不用變,因為做的串口通信,所以就不需要lcd與key的系列函式了,并且加入我們的代碼,
這里你可以把上面的兩個代碼復制在HARDWARE問件夾下
點擊manage project items 在HARDWRE下加入上面.c檔案,

然后點擊魔術棒,C/C++,路徑添加AHT20檔案夾

step2:撰寫主函式
1、檢測AHT20是否采集到資料,如果采到就處理資料
2、根據如下兩個公式
c1 = AHT20.HT[0]10010/1024/1024; //濕度
t1 = AHT20.HT[1]20010/1024/1024-500;//溫度計算公式
來計算得出溫度,
3、通過指示燈翻轉標識正常作業
4、AHT20函式中,有定義結構體,根據結構體來得到相關值

下面是主函式:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "usmart.h"
#include "24cxx.h"
#include "AHT20.h"
/****my code start lee***/
struct m_AHT20 AHT20;
int main(void)
{
volatile int c1,t1;
float c2,t2;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//設定中斷優先級
LED_Init(); //初始化LED
delay_init(); //延時初始化
IIC_Init(); //IIC初始化
uart_init(115200); //串口初始化為115200
AHT20.alive=!AHT20_Init(); //AHT20初始化
while(1)
{
if(AHT20.alive)//是否存活
{
//讀取其原始資料
AHT20.flag = AHT20_ReadHT(AHT20.HT);
c1 = AHT20.HT[0]*100*10/1024/1024; //濕度
t1 = AHT20.HT[1]*200*10/1024/1024-500;//溫度計算公式
//結果都放大了10倍
c2=c1/10.0;
t2=t1/10.0;
printf("濕度:\r\n%f\r\n",c2);
printf("溫度:\r\n%f\r\n\r\n",t2);
//正常作業雙燈翻轉
LED0=!LED0;
LED1=!LED1;
}
delay_ms(2000);
}
}
step3:編譯連接,燒入程式
硬體如下

分別對應
SCL–>PB6
SDA–>PB7
共地
給3.3V電
4、最終結果展示

四、總結
這次的學習我了解了什么是硬體I2C什么是軟體I2C,通過對AHT20的配置與實驗更加了解了如何使用I2C,獲益匪淺,
參考
https://blog.csdn.net/weixin_42048417/article/details/80683556
http://www.aosong.com/products-61.html
https://zhidao.baidu.com/question/693765215942559364.html
https://blog.csdn.net/toopoo/article/details/80053929
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/234955.html
標籤:其他
