USART波特率 vs SPI速率--學習筆記


  本篇文章將與大家探討USART波特率 vs SPI速率。這里提出一個問題,為什么USART的波特率是內核時鍾的1/8或者1/16,而SPI最快的頻率可以是內核時鍾的1/2。

  請大家帶着這個問題來閱讀本文。

  

 

  串口和SPI內部時鍾

  在回答上面問題之前,需要先了解STM32內部時鍾的概念,尤其是串口和SPI的內部時鍾。

  STM32里包含有系統時鍾、AHB時鍾和APB時鍾。APB時鍾來源於AHB,AHB時鍾來源於系統時鍾。

  

 

  從上圖中可以看出,時鍾就像流水一樣,從時鍾源匯聚到系統時鍾上,再從系統時鍾繼續分頻或者說是繼續分發到AHB、APB。

  通常我們談論的MCU能跑到多少M、主頻多少M,其實所指的就是系統時鍾。

  這些時鍾在不同的STM32系列中是不一樣的,我們以STM32F401為例,手冊上說它的APB1的最高時鍾是42MHz,APB2的最高時鍾是84MHz,不同的外設因為掛在不同的總線上,所以速度就不太相同了。

  比如USART1掛在APB2上,所以它的時鍾最高就是84MHz, USART2是掛在APB1上,它的總線時鍾最快就是42MHz。

  當我們配置串口的時候會發現,USART2的 baudrate 最高是2.625Mbit/s,但是同樣配置的USART1卻可以達到5.25Mbit/s,這就是因為所在的總線時鍾的不同而不同。

  那我們怎么知道使用的USART1、USART2到底掛在哪條總線上呢?去從數據手冊里尋找,直接在手冊里搜索關鍵詞APB1或者APB2就可以快速找到列表。

  串口的過采樣技術規范

  比如說做數據的接收,我們可以看到串口是通過過采樣技術來實現對數據的接收,因為它沒有時鍾線,只能通過高於波特率的16倍或者8倍對總線上的數據一個一個地進行采集,根據最后采集到的情況來判斷信號的狀態。

  

 

  舉個例子,當我們采集START信號的時候,實際上它要求采集到1110 x0x0x0 000這樣固定的序列的時候才認為是一個起始信號。

  START信號在串口里是一個bit的低電平信號,我們用16倍的速率進行采樣,首先它在前面會做一個下降沿檢測,這個檢測是要在前面的4個bit能檢測到1110,硬件會對總線上的數據根據采樣點一直進行檢測,這里的采樣點就是APB的時鍾,串口掛在不同的APB上用的時鍾不一樣。

  采樣的時候采集到1110就知道是一個下降沿,后面的x意思是任意的,后面的幾個位中至少需要檢測到三個0,而最后邊的三個位需要是連續的三個0,這樣才能被判定是一個起始位。其實只是判斷了3、5、7、8、9、10這六個點,只要是0,就可以確認了。這里我們是以START信號為例,其他信號也是這樣的。

  可能有人會有疑問,x是任意的,不去檢測,如果0不滿足要求應該怎么辦呢?

  如果3、5、7、8、9、10這六個點都是0,那就可以認為這是一個起始信號;如果在3、5、7和8、9、10這兩個階段都滿足至少有兩個bit是0的話,那就可以確認它是起始信號,確認的意思是說它里面的接收緩沖區非空,標志位就已經置上了,承認這個信號,但是還要給一個NE的標志位,因為雖然承認了這個信號,但里面是存在噪聲的。

  我們看串口的中斷標志位的時候就可以看到,在它的錯誤事件里就有一個NOISE FLAG,這個位就表示當串口在接收的時候,在總線上檢測到的電平並不是一個標准的、完整的高電平或者低電平,會有錯誤但不影響整個數據的接收,如果在接收的時候開啟了EIE位,錯誤可以產生一個中斷,讓MCU對總線上的情況有一個了解。

  

 

  如果前三個bit滿足條件,而后三個bit沒有滿足的話,那就說明這個數據是錯誤的,就不會置標志位了,只要在3、5、7和8、9、10這兩個階段中有一個階段不滿足條件,就不會置位,並且還會有噪聲的說明。

  當然了,這些都是在檢測下降沿沒有問題的情況下來說的,如果說在檢測下降沿1110都不完整或者是錯誤的,直接就會回到ideal狀態,重新等待下一個數據發送過來。

  SPI的速度為什么這么快?

  我們可以看一下SPI的時序圖,圖中上面兩根線是CLOCK線,它根據配置的不同而不同,在CPHA=0時,即在第一個時鍾沿進行采樣,CPOL表示的是時鍾的默認電平是高電平(CPOL=1)還是低電平(CPOL=0),這里看到的每個時鍾都可以傳輸一個bit。

  

 

  SPI速率是不是應該和系統時鍾一樣?

  其實不是,因為系統需要時間去獲取采集到的數據,所以SPI的時鍾分頻系數最小是二分之一的分頻,那么就是說SPI的速度是系統時鍾的一半了。

  有人覺得同步傳輸明顯優於異步傳輸,因為有時鍾線,傳輸速率會更高。

  但其實這種說法並不是完全正確的,因為每一種傳輸方式都有自己的優勢。比如串口有自動波特率的功能,就是說在接收的時候並不知道主機是按照什么樣的波特率進行傳輸的,那就只能等主機發一個特定字節的數據過來並且檢測數據的狀態,然后自己硬件去設置波特率的寄存器,這樣就可以在下一次傳輸的時候和主機使用相同的波特率。

  其次,在不同的溫度范圍內,內部的RC振盪器是有溫漂的並且很大,最標准的校准方法是給它一個時鍾沿,但是很多時候並沒有這個時鍾沿,那我們就可以用自動波特率。

  每次通訊的時候都采用自動波特率,就是每次都先接收,接收之后BRR寄存器里面的值就會隨着溫度的變化發生改變,MCU就可以根據BRR的值來調節HSITRIM。這個方法的好處是不需要提供一個非常標准的時鍾,通過串口通訊這種異步的方式就可以把時鍾信息傳給單片機內部。

 

學習視頻資料

(stm32 USART串口應用)
http://www.makeru.com.cn/live/1392_1164.html?s=45051
PWM脈寬調制技術
http://www.makeru.com.cn/live/4034_2146.html?s=45051
基於STM32講解串口操作
http://www.makeru.com.cn/live/1758_490.html?s=45051
通過Z-stack協議棧實現串口透傳
http://www.makeru.com.cn/live/1758_330.html?s=45051
(stm32直流電機驅動)
http://www.makeru.com.cn/live/1392_1218.html?s=45051

通信協議 - UART串口協議
http://www.makeru.com.cn/live/3576_1437.html?s=45051
stm32之SPI通信
http://www.makeru.com.cn/live/3523_1795.html?s=45051
SPI通信協議驅動norFlash
http://www.makeru.com.cn/live/4034_2151.html?s=45051

學習資料群:830802928


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM