用USART接口代替SPI怎麼做?

如何把USART當做SPI用

  • 剛開始學習時就知道USART可以和UART一樣使用,但始終沒有深究到底它多個同步功能有什麼別的用,今天看到一篇文章,讓我豁然開朗。

需要解答的問題:


  • 它與UART有什麼區別呢?
  • 它的硬件連接方式是怎樣的?
  • 該如何使能USART的SPI模式?
  • 把USART當做SPI來使用的時候和標準的SPI有什麼區別,需要注意哪些事項?

UART與USART的區別
  • UART的全稱叫做通用異步串行收發器,Universal Asynchronous Receiver/Transmitter,用於異步通信。
  • USART的全稱叫做通用同步異步串行收發器,Universal Synchronous/Asynchronous Receiver/Transmitter,從字面意思我們也可以知道USART比UART增加了一部分同步的功能。
  • 顯而易見,USART當做SPI來用,就是利用了USART的同步模式。
USART的硬件連接方式
  • 是否有時鐘線,是同步收發器和異步收發器最大的區別,這取決於硬件的連接。
  • 從USART的硬件連接可以看到標準的SPI的主機和從機應該是怎樣連接,有三線的和四線的,下圖展示了四線的連接方式。
    • 標準的SPI主機和從機連接方式
      標準的SPI主機和從機連接方式
      由主機MASTER提供CLK,MOSI和MOSI直接相連,主機的MISO和從機的MISO直接相連,片選是由主機來選擇從機。
      那麼,如果是把USART當做SPI的時候,我們怎麼跟SPI的從機連接呢?
    • USART當作SPI使用時的連接方式
      USART當作SPI使用時的連接方式
  • 在USART選擇爲同步傳輸的模式時,USART會有三個管腳被定義功能:除了RX和從機的Data out相連,TX和從機的Data in相連,還會有一個SCLK被使能,直接和SPI的CLK相連。
  • 這時,大家可能會發現,上面兩圖有一點區別 —— 沒有CS,沒有片選。
    • 與標準的SPI連接方式相比,USART當作SPI使用時,真的沒有片選嗎?答案非也。如果需要一個片選的話,MCU上的任何一個GPIO都可以當作從機的一個片選信號,所以我們基本的連接也變得非常簡單。RX和DO直接相連,TX和DIN直接相連,CLK直接相連,CS用任何一個GPIO就可以了。
USART的同步模式可分爲主機模式和從機模式
  • 如何使能USART的SPI模式?可細分爲兩種模式,也就是USART可以當作SPI的MASTER(主機模式),還可以當作SPI的SLAVE(從機模式)。
  • 這裏,需要注意一下,並不是所有的STM32都可以當作SPI的從機模式,目前主要是STM32L4+和STM32H7這兩個系列可以支持SPI的從機模式,其他的都僅支持SPI的主機模式。簡而言之,L4和H7系列是既支持主機模式又支持從機模式。
    接下來,我們先來描述一下這兩種模式。
  • 使能SPI的主機模式,只要開啓CR寄存器中CLKEN這個位即可,同時要注意如果開啓了CLKEN位,那它就只能當作SPI的主機模式,而不能當作從機模式。
    USART_CR2寄存器
  • 使能SPI的從機模式,也是在CR寄存器裏面,開啓SLAVEEN這個位,就將SPI設置成從機模式。
    如果同時使能了CLKEN和SLAVEEN,那SPI到底應該是在主機模式還是從機模式呢?
    • 對此,有一個詳細說明,就是CR寄存器中的CLKEN、SLAVEEN其中的一個一旦開啓,那就要保證其他位是清零的狀態。串口可以當作SPI接口去用,也可以當作SMATER接口來用,具體用哪個功能是由軟件來決定的,也就是由應用來決定的。
      USART同步模式下的描述
USART用作SPI與標準SPI有何區別
  • 使能SPI之後,就需要設置數據格式。我們知道串口有七位數據位、八位數據位和九位數據位,但是在設置爲SPI模式之後,還有兩個地方需要設置,一個是時鐘極性,另一個是相位極性。這兩個位是什麼意思呢?
  • 讓我們一起來看下USART的時序圖。
    USART的時序圖
  • 從上圖可以看到,在時鐘極性爲0的時候,CLK的默認電平是低電平;時鐘極性爲1時,CLK的默認電平是高電平。相位極性(CPHA)爲0的時候,它和數據是在時鐘的第一個沿進行採樣;CPHA爲1時,它和數據是在時鐘的第二個沿進行採樣。
  • USART時序圖中需要特別注意,有一個LBCL位,它會決定最後一個時鐘沿是不是發出。串口發送或者接收的時候,通常需要有一個奇偶校驗位。
    1. 如果數據位是八位,其中有一個奇偶校驗位,那真實有效的數據位就只有七位。奇偶校驗位本身並不是數據,它是由前七位進行奇偶校驗之後得到的,是0或者是1。
    2. 如果我們只想發真實的數據,而不想發奇偶校驗位,那就可以把LBCL設置爲0,最後一位就不會發出。
    3. 但是有的時候是沒有奇偶校驗位的,八位全部都是有效數據,那這時候就需要把LBCL設置爲1,讓它產生一個完整的八個時鐘信號。
  • 這點在應用中有一定的意義,也就是說發送的數據本身就是帶有校驗位的。標準SPI的處理方式是先將數據發送出去,之後再發送它的校驗位;但如果用串口進行發送,也就是用USART把它當作SPI模式進行數據發送的時候,實際上是可以直接在後面加上校驗位的,數據接收的時候也需要去檢查校驗位是否是正確的。
  • 除了LBCL位,我們應該瞭解在數據的起始位和結束位中是不會產生任何時鐘信號的,也就是說如果數據有10個bit,只有中間的8個bit會產生時鐘信號,最開始的START和最後的STOP無論有幾位都是不會產生時鐘信號的。
    • 這是因爲如果我們和標準的SPI模式去對比的話,我們會發現在標準的SPI中每一個位都是有時鐘信號的,也就是數據的吞吐率和時鐘是成正比的,但是如果用USART來傳輸SPI的數據,那數據真實的帶寬最多隻有實際吞吐率的80%,而SPI的帶寬是可以佔到100%的。
  • 除了帶寬這一點區別之外,還有什麼區別呢
    • 我們可以看到,當USART用作SPI時,數據位只能設置爲七位、八位或者九位,但是標準的SPI一般可以設置爲4-16位,如果數據位一定要設置成7位以下,比如4位、5位,那就只能用SPI模式,不能把USART當成SPI使用。
    • 另外,SPI和USART的速率也是有很大區別的,UART的速率最高可達10.5Mbit/s,SPI的速率最高可達系統時鐘的一半。對於高速的數據通訊,SPI的優勢比較明顯。
  • 以上是USART當作SPI的主機模式時,與標準SPI的區別。
  • 當USART做SPI從機模式的時候,有一個專門的CS叫NSS管腳,它可以作爲時鐘的輸入信號,在每個時鐘沿會有一個數據從主機裏反饋回來,NSS其他的操作和主機模式都是非常相似的,只是它的時鐘信號來自外部。
USART用作SPI的注意事項
  • 最後,我們說一說USART用作SPI模式時的注意事項
    1. 一旦設置成SPI模式,在軟件中要確保其他模式不被開啓,包括SPI的主機和從機模式,只能有一種模式被開啓。
    2. 我們要注意USART當作SPI模式時,它的速率沒有真正的SPI的速率高,而且它的有效帶寬也少於SPI的有效帶寬。
    3. SPI模式只在USART中是有效的,那麼每一個系列中USART的個數和是否支持同步模式是不一樣的。
      • 比如在F1、F3上有3個USART,它都是支持SPI主機模式的,不支持SPI從機模式。
      • 在L4+、H7上是既支持主機模式又支持從機模式,而且USART最多可以到三個或者四個。
      • 但是有一些小封裝,比如STM32L011D4,有一個USART的,叫USART2,但因爲管腳的限制,它雖然也叫USART,卻不支持同步模式,需要具體去查數據手冊。
      • ST的USART本身還是很多的,尤其在F0上,F0上最多可以有8個USART,我們可以在這樣的系列上更多更靈活地將USART用作SPI。
  • STM32的USART的功能非常豐富,可以多多嘗試,在評論區大家交流一下。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章