STM32--学习笔记 常用协议总结
學習筆記–STM32常用協議總結
文章目錄
- 學習筆記--STM32常用協議總結
- 1. One-Wire:一根數據線
- 2. I2C協議:時鐘線(SCL)和數據線(SDA)
- 3. UART串口:DB9接口為標準接口,其中(GND,RXD/TXD)必不可少
- 4. SPI協議:MISO、MOSI、SCK、CS
STM32常用的協議根據外設連接的總線數量不同可以分為:
1根線: One-Wire/一線協議,比如DHT11溫濕度傳感器,DS18B20溫度傳感器;
2根線:I2C協議,比如SHT30溫濕度傳感器,OLED顯示屏;
3根線:UART/串口協議,比如GPS,NB-IoT;
4根線:SPI協議,比如NFC,LoRa。
1. One-Wire:一根數據線
DHT11:
總線空閑時保持高電平,內置上拉電阻
傳輸時序:
通信過程:
DHT11上電后(DHT11 上電后要等待1S以越過不穩定狀態在此期間不能發送任何指令),測試環境溫濕度數據,并記錄數據,同時DHT11的DATA數據線由上拉電阻拉高一直保持高電平;此時DHT11的DATA引腳處于輸入狀態,時刻檢測外部信號。
微處理器的I/0設置為輸出同時輸出低電平,且低電平保持時間不能小于18ms(最大不得超過30ms),然后微處理器的I/0設置為輸入狀態,由于上拉電阻,微處理器的I/0即DHT11的DATA數據線也隨之變高,等待DHT11作出回答信號。發送信號如下圖所示:
DHT11的DATA引腳檢測到外部信號有低電平時,等待外部信號低電平結束,延遲后DHT11的DATA引腳處于輸出狀態,輸出81-85微秒的低電平作為應答信號,緊接著輸出86-88微秒的高電平通知外設準備接收數據,微處理器的I/0此時處于輸入狀態,檢測到I/0有低電平(DHT11回應信號)后,等待86-88微秒的高電平后的數據接收,發送信號如下圖所示:
由DHT11的DATA引腳輸出40位數據,微處理器根據I/0電平的變化接收40位數據,位數據“0”的格式為: 54微秒的低電平和23- 27微秒的高電平,位數據“1”的格式為: 54微秒的低電平加68-74微秒的高電平。位數據“0”,“1” 格式信號如下圖所示:
結束信號:
DHT11的DATA引腳輸出40位數據后,繼續輸出低電平54微秒后轉為輸入狀態,由于上拉電阻隨之變為高電平。但DHT11內部重測環境溫濕度數據,并記錄數據,等待外部信號的到來。
DS18B20:
復位和應答時序:
單總線上的所有通信都是以初始化序列開始,總線空閑狀態都被上拉電阻拉為高電平;主機輸出低電平,保持至少為480us,產生復位脈沖。接著主機釋放總線,上拉電阻將總線拉為高電平,延時15-60us,進入接收模式。這時DS18B20拉低總線60-240us,產生低電平應答脈沖,然后釋放總線。
寫時序:
總線控制器通過控制單總線高低電平持續時間從而把邏輯1或0寫DS18B20中,每次只傳輸1位數據。
單片機想要給DS18B20寫入一個0時,需要將單片機引腳拉低,保持低電平時間要在60~120us之間,然后釋放總線。
單片機想要給DS18B20寫入一個1時,需要將單片機引腳拉低,拉低時間需要大于1us,然后在15us內拉高總線.。
在寫時序起始后15us到60us期間,DS18B20處于采樣單總線電平狀態。如果在此期間總線為高電平,則向DS18B20寫入1;如果總線為低電平,則向DSl8B20寫入0。
注意:2次寫周期之間至少間隔1us
主機向DS18B20寫入的功能命令:
ROM指令:
采用多個DS18B20時,需要寫ROM指令來控制總線上的某個DS18B20,如果是單個DS18B20,直接寫跳過ROM指令0xCC即可。
RAM指令:
DS18B20在獲取溫度之后會存放在內部的RAM里面,需要控制端使用相應的指令才能對RAM進行操作。
讀取溫度 0xBE,讀取高速暫存器存儲的數據。
溫度轉換 0x44,開啟溫度讀取轉換,讀取好的溫度會存儲在高速暫存器的第0個和第一個字節中。
讀時序:
讀時隙由主機拉低總線電平至少1us然后再釋放總線,讀取DS18B20發送過來的1或者0。DS18B20在檢測到總線被拉低1微秒后,便開始送出數據,若是要送出0就把總線拉為低電平直到讀周期結束。若要送出1則釋放總線為高電平。
注意:所有讀時隙必須至少需要60us,讀寫都是LSB順序,也就是先讀取高速暫存器的第0個字節(溫度的低8位),在讀取高速暫存器的第1個字節(溫度的高8位) ,我們正常使用DS18B20讀取溫度讀取兩個溫度字節即可。
2. I2C協議:時鐘線(SCL)和數據線(SDA)
通信時序:
在I2C總線上傳送的每一位數據都由一個同步時鐘脈沖想對應,即在SCL串行時鐘的配合下,數據在SDA上從高位向低位依次串行傳送每一位的數據。
起始位和結束位:
I2C總線在空閑時SDA和SCL都處于高電平狀態(由上拉電阻拉高),當主設備要開始一次I2C通信時就發送一個START信號,告訴從設備要開始通信,通信結束時,發送一個STOP信號,告訴從設備結束本次通信。
I2C讀寫地址:
一個I2C總線上可以有多個從設備,主設備通過物理地址確定和哪個從設備通信,從設備的物理地址由內部電路決定。
主機在發送START信號之后,第二個時序應該立刻給出要通信從設備的物理地址。此外,I2C總線是一種能夠實現半雙工通信的同步串行通信協議,主設備應該具有讀/寫能力。
因此,I2C的讀寫地址除了7bit的物理地址以外,還有1bit標識讀/寫方向。所以I2C的讀寫地址一般為1Byte,高7位為物理地址,最低位為讀寫方向位。(0為寫,1為讀)
I2C應答信號:
主機在發送I2C通信請求之后,對應物理地址的從設備會回應一個ACK應答信號。
此外,主/從設備在之后的通信過程中,數據接收方收到傳輸的一個字節數據后,需要給出ACK回應,此時處在第九個時鐘周期,發送端釋放SDA總線,將SDA電平拉高,由接收方控制。
繼續通信:回應ACK信號,即SDA為低電平;
結束通信:回應NACK信號,即SDA為高電平。
數據位收發:
主設備在收到從設備應答信號之后,開始給從設備發送數據。SDA數據線上的每個字節必須是8bit,每次傳輸的總字節數沒有限制,每個字節發送完成后,必須跟著一個應答信號。
I2C總線通信時數據傳輸采用MSB方式發送,高電平表示1,低電平表示0。當傳輸的數據位需要改變時,比如現在發送的為1,下一個發送為0,必須要在SCL為低電平期間改變,此外,在傳輸過程中,SDA上的數據位在SCL高電平期間必須保持穩定不變,因為防止誤發開始/停止信號,引起數據錯亂。
SHT30:
采用I2C協議的溫濕度傳感器,通信時序:
3. UART串口:DB9接口為標準接口,其中(GND,RXD/TXD)必不可少
注意UART和USART的區別在于前者只支持異步通信,而后者支持異步/同步通信,目前使用主要是異步通信模式。
各個引腳的作用如下:
現在大多數使用的是USB轉串口的設備,縮小了串口的體積。
串口通信基本原理:
串口通信最少使用GND和一根信號線可以完成單工通信,比如GPS;大部分串口通信都是3根線(GND,RXD,TXD)實現全雙工通信。
串口通信時序:
串口通信時,收發是按周期進行的,每個周期傳輸N個二進制位。這一個周期就叫做一個通信單元。一個通信單元由起始位+數據位+奇偶校驗位+停止位構成。
波特率:
在電子通信領域,波特率為調制速率,指的是有效數據訊號調制載波的速率,即單位時間內載波調制狀態變化的次數。
串口通信是一種異步通信方式,收發雙方并沒有同步時鐘來約定一個bit的數據收發維持電平多長時間,這樣只能靠收發雙方的速率來同步收發數據,這個速率就是波特率,單位為bps(bit period second)。
常用的速率為115200(3G/4G/調試串口)、9600(NB-IoT/GPS)、4800等,收發雙方保持一致即可。
起始位:
表示發送方要開始發送一個通信單元。總線空閑時維持高電平,一旦產生一個下降沿變為低電平表示起始信號。
數據位:
表示一個通信單元中有效信息位,一次發送多少位有效數據是可以設定的(6,7,8,9,一般選擇8位)。
奇偶校驗位:
用來校驗數據位,分為奇校驗和偶校驗:
奇校驗保證傳輸過程中1的個數為奇數,偶校驗保證傳輸過程中1的個數為偶數。
停止位:
收發雙方本單元通信結束的標志,由通信線上的電平變化來反映。常見的有1位/1.5位/2位停止位等,一般用1位停止位。
TTL與RS232電平:
電平信號是信號線電平減去GND電平的差值,這個電壓差決定了傳輸的是1還是0;
TTL電平(MCU或者芯片電平)標準規定:高電平為5V(51單片機)或者3.3V(ARM)表示1,0V表示0;
RS232電平標準規定:-15V至-3V表示1,+3V至+15V表示0;
顯然TTL是芯片的串口直接出的電平,適合距離近干擾小的情況;設備與設備之間的遠距離通信因為壓降和干擾等因素需要使用RS232電平,但它的通信距離一般也小于15M;
4. SPI協議:MISO、MOSI、SCK、CS
SPI是一種同步串行全雙工的接口技術,速度快,效率高。通常為一個主設備(Master)和一個或者多個從設備(Slave)構成,主設備通過片選端選擇一個從設備進行通信。由四根線構成:MISO(Master input Slave output),MOSI,CLK(時鐘),CS(片選)。但其在傳輸數據時沒有像I2C協議有應答機制,在數據的可靠性傳輸上有一定缺陷。
SPI 傳輸模式:
SPI共有四種傳輸模式,由CPOL(時鐘極性,表示空閑時為低電平還是高電平)和CPHA(時鐘相位,表示從結束空閑狀態開始第幾個跳變沿開始采樣數據)決定。
模式0:CPOL=0,CPHA=0。SCK串行時鐘線空閑是低電平。在SCK的上升沿采樣數據,在SCK下降沿切換。
模式1:CPOL=0,CPHA=1。SCK串行時鐘線空閑是低電平。在SCK的下降沿采樣數據,在SCK上升沿切換。
模式2:CPOL=1,CPHA=0。SCK串行時鐘線空閑是高電平。在SCK的下降沿采樣數據,在SCK上升沿切換。
模式3:CPOL=1,CPHA=1。SCK串行時鐘線空閑是高電平。在SCK的上升沿采樣數據,在SCK下降沿切換。
常用的是模式0和3;
注意在數據傳輸過程中,One-Wire的DHT11是MSB,DS18B20是LSB,I2C是高位先行(MSB),UART是低位先行(LSB),SPI協議可選擇使用MSB還是LSB。
SPI數據交換:
主設備通過拉低相應的NSS(片選)引腳選擇相應的從設備進行通信,通信完成后再拉高相應的片選引腳,雙方通過交換各自移位寄存器里的數據完成數據交換。主設備的讀和寫都是這樣一種數據交換的模式。
總結
以上是生活随笔為你收集整理的STM32--学习笔记 常用协议总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Arista中国战略升级 加码布局园区网
- 下一篇: Re:萌娘百科上的黑幕实现