SPI不夠用啦啦啦啦啦啦啦? USART來幫忙

如果您在使用STM32的時(shí)候,恰好缺少一個(gè)SPI接口,同時(shí)片上的資源還有多余的USART(一般來說,USART的接口都較豐富,比如STM32L0系列的產(chǎn)品),我們完全可以用USART來替代SPI,效果非常不錯(cuò)。
本文將向大家介紹如何把USART當(dāng)做SPI來用。
USART是指全雙工通用同步/異步串行收發(fā)模塊,該接口是一個(gè)高度靈活的串行通信設(shè)備。那么,它與UART有什么區(qū)別呢?它的硬件連接方式是怎樣的?該如何使能USART的SPI模式?把USART當(dāng)做SPI來使用的時(shí)候和標(biāo)準(zhǔn)的SPI有什么區(qū)別,需要注意哪些事項(xiàng)?本文將逐一為大家解讀。
UART與USART的區(qū)別
早期在開發(fā)8051的時(shí)候使用的都是UART,大家可能了解的比較多一些。UART的全稱叫做通用異步串行收發(fā)器,Universal Asynchronous Receiver/Transmitter,用于異步通信。
USART的全稱叫做通用同步異步串行收發(fā)器,Universal Synchronous/Asynchronous Receiver/Transmitter,從字面意思我們也可以知道USART比UART增加了一部分同步的功能。
顯而易見,USART當(dāng)做SPI來用,就是利用了USART的同步模式。
USART硬件連接方式
是否有時(shí)鐘線,是同步收發(fā)器和異步收發(fā)器最大的區(qū)別,這取決于硬件的連接。
從USART的硬件連接可以看到標(biāo)準(zhǔn)的SPI的主機(jī)和從機(jī)應(yīng)該是怎樣連接,有三線的和四線的,下圖展示了四線的連接方式。

由主機(jī)MASTER提供CLK,MOSI和MOSI直接相連,主機(jī)的MISO和從機(jī)的MISO直接相連,片選是由主機(jī)來選擇從機(jī)。
那么,如果是把USART當(dāng)做SPI的時(shí)候,我們?cè)趺锤鶶PI的從機(jī)連接呢?

在USART選擇為同步傳輸?shù)哪J綍r(shí),USART會(huì)有三個(gè)管腳被定義功能:除了RX和從機(jī)的Data out相連,TX和從機(jī)的Data in相連,還會(huì)有一個(gè)SCLK被使能,直接和SPI的CLK相連。這時(shí),大家可能會(huì)發(fā)現(xiàn),上面兩圖有一點(diǎn)區(qū)別 —— 沒有CS,沒有片選。
與標(biāo)準(zhǔn)的SPI連接方式相比,USART當(dāng)作SPI使用時(shí),真的沒有片選嗎?答案非也。如果需要一個(gè)片選的話,MCU上的任何一個(gè)GPIO都可以當(dāng)作從機(jī)的一個(gè)片選信號(hào),所以我們基本的連接也變得非常簡單。RX和DO直接相連,TX和DIN直接相連,CLK直接相連,CS用任何一個(gè)GPIO就可以了。
USART的同步模式可分為
主機(jī)模式和從機(jī)模式
如何使能USART的SPI模式?可細(xì)分為兩種模式,也就是USART可以當(dāng)作SPI的MASTER(主機(jī)模式),還可以當(dāng)作SPI的SLAVE(從機(jī)模式)。
這里,需要大家注意一下,并不是所有的STM32都可以當(dāng)作SPI的從機(jī)模式,目前主要是STM32L4+和STM32H7這兩個(gè)系列可以支持SPI的從機(jī)模式,其他的都僅支持SPI的主機(jī)模式。簡而言之,L4和H7系列是既支持主機(jī)模式又支持從機(jī)模式。接下來,我們先來描述一下這兩種模式。使能SPI的主機(jī)模式,只要開啟CR寄存器中CLKEN這個(gè)位即可,同時(shí)要注意如果開啟了CLKEN位,那它就只能當(dāng)作SPI的主機(jī)模式,而不能當(dāng)作從機(jī)模式。

使能SPI的從機(jī)模式,也是在CR寄存器里面,開啟SLAVEEN這個(gè)位,就將SPI設(shè)置成從機(jī)模式。
如果同時(shí)使能了CLKEN和SLAVEEN,那SPI到底應(yīng)該是在主機(jī)模式還是從機(jī)模式呢?
對(duì)此,有一個(gè)詳細(xì)說明,就是CR寄存器中的CLKEN、SLAVEEN其中的一個(gè)一旦開啟,那就要保證其他位是清零的狀態(tài)。串口可以當(dāng)作SPI接口去用,也可以當(dāng)作SMATER接口來用,具體用哪個(gè)功能是由軟件來決定的,也就是由應(yīng)用來決定的。

USART用作SPI時(shí)與標(biāo)準(zhǔn)的SPI有何區(qū)別
使能SPI之后,就需要設(shè)置數(shù)據(jù)格式。我們知道串口有七位數(shù)據(jù)位、八位數(shù)據(jù)位和九位數(shù)據(jù)位,但是在設(shè)置為SPI模式之后,還有兩個(gè)地方需要設(shè)置,一個(gè)是時(shí)鐘極性,另一個(gè)是相位極性。這兩個(gè)位是什么意思呢?讓我們一起來看下USART的時(shí)序圖。

從上圖可以看到,在時(shí)鐘極性為0的時(shí)候,CLK的默認(rèn)電平是低電平;時(shí)鐘極性為1時(shí),CLK的默認(rèn)電平是高電平。
相位極性(CPHA)為0的時(shí)候,它和數(shù)據(jù)是在時(shí)鐘的第一個(gè)沿進(jìn)行采樣;CPHA為1時(shí),它和數(shù)據(jù)是在時(shí)鐘的第二個(gè)沿進(jìn)行采樣。
USART時(shí)序圖中需要特別注意,有一個(gè)LBCL位,它會(huì)決定最后一個(gè)時(shí)鐘沿是不是發(fā)出。串口發(fā)送或者接收的時(shí)候,通常需要有一個(gè)奇偶校驗(yàn)位。如果數(shù)據(jù)位是八位,其中有一個(gè)奇偶校驗(yàn)位,那真實(shí)有效的數(shù)據(jù)位就只有七位。奇偶校驗(yàn)位本身并不是數(shù)據(jù),它是由前七位進(jìn)行奇偶校驗(yàn)之后得到的,是0或者是1。如果我們只想發(fā)真實(shí)的數(shù)據(jù),而不想發(fā)奇偶校驗(yàn)位,那就可以把LBCL設(shè)置為0,最后一位就不會(huì)發(fā)出。但是有的時(shí)候是沒有奇偶校驗(yàn)位的,八位全部都是有效數(shù)據(jù),那這時(shí)候就需要把LBCL設(shè)置為1,讓它產(chǎn)生一個(gè)完整的八個(gè)時(shí)鐘信號(hào)。
這點(diǎn)在應(yīng)用中有一定的意義,也就是說發(fā)送的數(shù)據(jù)本身就是帶有校驗(yàn)位的。標(biāo)準(zhǔn)SPI的處理方式是先將數(shù)據(jù)發(fā)送出去,之后再發(fā)送它的校驗(yàn)位;但如果用串口進(jìn)行發(fā)送,也就是用USART把它當(dāng)作SPI模式進(jìn)行數(shù)據(jù)發(fā)送的時(shí)候,實(shí)際上是可以直接在后面加上校驗(yàn)位的,數(shù)據(jù)接收的時(shí)候也需要去檢查校驗(yàn)位是否是正確的。
除了LBCL位,我們應(yīng)該了解在數(shù)據(jù)的起始位和結(jié)束位中是不會(huì)產(chǎn)生任何時(shí)鐘信號(hào)的,也就是說如果數(shù)據(jù)有10個(gè)bit,只有中間的8個(gè)bit會(huì)產(chǎn)生時(shí)鐘信號(hào),最開始的START和最后的STOP無論有幾位都是不會(huì)產(chǎn)生時(shí)鐘信號(hào)的。這是因?yàn)槿绻覀兒蜆?biāo)準(zhǔn)的SPI模式去對(duì)比的話,我們會(huì)發(fā)現(xiàn)在標(biāo)準(zhǔn)的SPI中每一個(gè)位都是有時(shí)鐘信號(hào)的,也就是數(shù)據(jù)的吞吐率和時(shí)鐘是成正比的,但是如果用USART來傳輸SPI的數(shù)據(jù),那數(shù)據(jù)真實(shí)的帶寬最多只有實(shí)際吞吐率的80%,而SPI的帶寬是可以占到100%的。
除了帶寬這一點(diǎn)區(qū)別之外,還有什么區(qū)別呢?
我們可以看到,當(dāng)USART用作SPI時(shí),數(shù)據(jù)位只能設(shè)置為七位、八位或者九位,但是標(biāo)準(zhǔn)的SPI一般可以設(shè)置為4-16位,如果數(shù)據(jù)位一定要設(shè)置成7位以下,比如4位、5位,那就只能用SPI模式,不能把USART當(dāng)成SPI使用。
另外,SPI和USART的速率也是有很大區(qū)別的,UART的速率最高可達(dá)10.5Mbit/s,SPI的速率最高可達(dá)系統(tǒng)時(shí)鐘的一半。對(duì)于高速的數(shù)據(jù)通訊,SPI的優(yōu)勢比較明顯。
以上是USART當(dāng)作SPI的主機(jī)模式時(shí),與標(biāo)準(zhǔn)SPI的區(qū)別。
當(dāng)USART做SPI從機(jī)模式的時(shí)候,有一個(gè)專門的CS叫NSS管腳,它可以作為時(shí)鐘的輸入信號(hào),在每個(gè)時(shí)鐘沿會(huì)有一個(gè)數(shù)據(jù)從主機(jī)里反饋回來,NSS其他的操作和主機(jī)模式都是非常相似的,只是它的時(shí)鐘信號(hào)來自外部。
USART用作SPI時(shí)的注意事項(xiàng)
最后,我們說一說USART用作SPI模式時(shí)的注意事項(xiàng)。
首先,一旦設(shè)置成SPI模式,在軟件中要確保其他模式不被開啟,包括SPI的主機(jī)模式和從機(jī)模式,只能有一種模式被開啟。
第二,我們要注意USART當(dāng)作SPI模式時(shí),它的速率沒有真正的SPI的速率高,而且它的有效帶寬也少于SPI的有效帶寬。
第三,SPI模式只在USART中是有效的,那么每一個(gè)系列中USART的個(gè)數(shù)和是否支持同步模式是不一樣的,比如在F1、F3上有3個(gè)USART,它都是支持SPI主機(jī)模式的,不支持SPI從機(jī)模式;在L4+、H7上是既支持主機(jī)模式又支持從機(jī)模式,而且USART最多可以到三個(gè)或者四個(gè)。但是有一些小封裝,比如STM32L011D4,有一個(gè)USART的,叫USART2,但因?yàn)楣苣_的限制,它雖然也叫USART,卻不支持同步模式,需要具體去查數(shù)據(jù)手冊(cè)。ST的USART本身還是很多的,尤其在F0上,F(xiàn)0上最多可以有8個(gè)USART,我們可以在這樣的系列上更多更靈活地將USART用作SPI。
STM32的USART的功能非常豐富,大家可以多多嘗試。