0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文詳解SPI串行外設(shè)接口

恩智浦MCU加油站 ? 來源:恩智浦MCU加油站 ? 作者:恩智浦MCU加油站 ? 2024-01-18 09:45 ? 次閱讀

SPI也是MCU最常見的對外通信口之一,由摩托羅拉在上世紀(jì)80年代中開發(fā),用于嵌入式系統(tǒng)中器件之間的短距離數(shù)據(jù)通信,標(biāo)準(zhǔn)模式使用四條信號線。目前常見的應(yīng)用器件有:LCD模組、以太網(wǎng)模塊、SPI串行Flash和很多傳感器等,大部分SD卡都具有SPI操作模式。

SPI的特點(diǎn)是主從結(jié)構(gòu)、協(xié)議簡單、成本低廉、串行傳輸?shù)?,具有同步時(shí)鐘信號,傳輸速率可達(dá)幾兆至十幾兆(近來也有達(dá)到二、三十兆速率的器件),適合于中等數(shù)據(jù)量、點(diǎn)對點(diǎn)的傳輸環(huán)境。

1.1 SPI通信協(xié)議

SPI是點(diǎn)對點(diǎn)的全雙工串行通信協(xié)議,用于兩個設(shè)備間的通信。基本的連線方式是四條信號線,如下圖:

535caeb0-b5a0-11ee-8b88-92fbcf53809c.png

圖1.SPI信號線連接示意圖

四條信號線中有兩條數(shù)據(jù)線,分別用于主機(jī)向從機(jī)發(fā)送數(shù)據(jù)(MOSI: Master OutSlave In),和從機(jī)向主機(jī)發(fā)送數(shù)據(jù)(MISO: MasterIn Slave Out)。

主機(jī)器件通過SCK時(shí)鐘信號線向從機(jī)輸出時(shí)鐘,同時(shí)主機(jī)輸出SSEL信號作為從機(jī)的片選。

1.1.1 SPI數(shù)據(jù)傳輸

SPI的數(shù)據(jù)傳輸流程十分簡單,在每個SCK的時(shí)鐘周期中有如下操作:

▲主機(jī)在MOSI向從機(jī)發(fā)送一個數(shù)據(jù)位;

▲從機(jī)在MOSI上接收一個數(shù)據(jù)位;

▲從機(jī)在MISO向主機(jī)發(fā)送一個數(shù)據(jù)位;

▲主機(jī)在MISO上接收一個數(shù)據(jù)位。

一般SPI的主機(jī)和從機(jī)都是各由一個移位寄存器實(shí)現(xiàn)數(shù)據(jù)的發(fā)送與接收,示意圖如下:

536b6c8e-b5a0-11ee-8b88-92fbcf53809c.png

圖2.SPI數(shù)據(jù)移位示意圖

在同一個時(shí)鐘信號的驅(qū)動下,主機(jī)和從機(jī)的移位寄存器同時(shí)向相同方向移位,經(jīng)過n個時(shí)鐘周期的n次移位,主機(jī)的數(shù)據(jù)與從機(jī)的數(shù)據(jù)正好進(jìn)行了交換。

通常每個字符數(shù)據(jù)的長度n=8或n=16。LPC800允許每個數(shù)據(jù)長度可以是1~16中任意數(shù)值。

1.1.2 SPI的時(shí)鐘信號

SPI的時(shí)鐘信號SCK除了頻率特性外,還需要考慮它的極性和相位,分別由CPOL和CPHA表示,具有以下意義:

▲時(shí)鐘極性:

CPOL=0:空閑時(shí),時(shí)鐘信號為‘0’。時(shí)鐘信號的前沿為上升沿,后沿為下降沿。

CPOL=1:空閑時(shí),時(shí)鐘信號為‘1’。時(shí)鐘信號的前沿為下降沿,后沿為上升沿。

▲時(shí)鐘相位:

CPHA=0:發(fā)送方在前一個時(shí)鐘周期的后沿改變輸出信號;接收方在時(shí)鐘周期的前沿采樣輸入信號。

CPHA=1:發(fā)送方在時(shí)鐘周期的前沿改變輸出信號;接收方在時(shí)鐘周期的后沿采樣輸入信號。

通常CPOL和CPHA的四種組合被定義為四種模式,如下表:

53752cd8-b5a0-11ee-8b88-92fbcf53809c.png

537ed7d8-b5a0-11ee-8b88-92fbcf53809c.png

圖3.SPI四種操作模式波形示意圖

在模式0和模式2的SCK第一個時(shí)鐘邊沿之前,SPI主機(jī)利用內(nèi)部時(shí)鐘在MOSI上輸出第一個數(shù)據(jù)位(最高位),SPI從機(jī)則使用前一個數(shù)據(jù)幀的最后一個邊沿輸出第一個數(shù)據(jù)位(最高位)。

1.1.3 SPI 設(shè)備的互連

SPI設(shè)備間的互連是主從關(guān)系,一個主設(shè)備可以連接多個從設(shè)備,主設(shè)備通過從設(shè)備片選信號區(qū)別與那個從設(shè)備進(jìn)行通信。

53961ede-b5a0-11ee-8b88-92fbcf53809c.png

圖4.SPI設(shè)備間互連示意圖

一個主機(jī)設(shè)備能夠連接的從機(jī)數(shù)量,由能夠輸出的片選信號(SSELn)的個數(shù),和MOSI、SCK信號線的驅(qū)動能力限制。

1.2 LPC800的SPI特性

LPC800的SPI非常簡單,但配置豐富并且很方便使用。

▲每個數(shù)據(jù)幀的長度可以直接配置為1~16位的任一種,通過軟件操作還可以支持任意長度的數(shù)據(jù)幀。

▲支持主機(jī)模式或從機(jī)模式。

▲主機(jī)可以在發(fā)送數(shù)據(jù)時(shí),不必理會從機(jī)返回的數(shù)據(jù)。這有助于優(yōu)化軟件的操作,例如對LCD模組刷屏?xí)r(現(xiàn)實(shí)中有不少LCD模組是不可讀的),或?qū)懭隨PI存儲器時(shí)。

▲控制信息可以與發(fā)送的數(shù)據(jù)一起寫入寄存器,這樣可以實(shí)現(xiàn)各種靈活的操作要求。

▲最多有四個直接控制的從機(jī)片選信號,并且可以配置極性。

▲支持DMA操作。

▲可以靈活地控制每個數(shù)據(jù)幀中的各種時(shí)序。

1.3 SPI Flash讀寫例程 下面以幾個例程示范使用SPI對SPI Flash的 讀寫操作。

這些例程都是在LPC824-Lite上,對板上的W25Q32BV的操作,下面先抄錄這個存儲器芯片的部分命令格式,方便例程的理解。以下例程會用到表中帶陰影的命令。

53a4044a-b5a0-11ee-8b88-92fbcf53809c.png

表1.W25Q32BV部分命令列表

53b0aa9c-b5a0-11ee-8b88-92fbcf53809c.png

圖5.開發(fā)板上的SPI Flash線路圖

1.3.1 SPI的輪詢方式操作

以下所有的SPI例程都使用相同的初始化程序。

代碼片段1. SPI主機(jī)初始化函數(shù)

53c881b2-b5a0-11ee-8b88-92fbcf53809c.png

初始化函數(shù)非常簡單直接,和所有其它模塊的初始化過程一樣,都是“開啟時(shí)鐘→映射引腳→復(fù)位模塊→配置參數(shù)

下圖顯示了所有SPI配置寄存器的配置位。

53d840d4-b5a0-11ee-8b88-92fbcf53809c.png

圖6.SPI配置寄存器(CFG)一覽

代碼片段1中只設(shè)置了CFG寄存器的第0、2位,其它位均為’0’。

LPC800的SPI發(fā)送數(shù)據(jù)/控制寄存器是非常有特色的。

53d840d4-b5a0-11ee-8b88-92fbcf53809c.png

圖7.SPI發(fā)送數(shù)據(jù)和控制寄存器一覽

上圖是完整的發(fā)送數(shù)據(jù)控制寄存器的所有位,用戶可以使用TXDATCTL寄存器,同時(shí)寫入數(shù)據(jù)和所有的控制位,也可以使用TXCTL單獨(dú)寫入控制位,或使用TXDAT單獨(dú)寫入數(shù)據(jù)位。

對于輸出至從機(jī)的SSEL片選信號,用戶可以隨時(shí)按照需要輸出對應(yīng)的電平,甚至可以按字符單獨(dú)控制SSEL的電平。

如果需要使用超過16位的數(shù)據(jù)幀,則可以用EOF控制位實(shí)現(xiàn)。例如需要每個數(shù)據(jù)幀長度為24位,則可以輸出兩個12位的字符,在輸出第一個12位的字符時(shí),配置EOF=0,在輸出第二個12位的字符時(shí),配置EOF=1;也可以輸出3個8位字符,并在輸出第三個字符時(shí),配置EOF=1實(shí)現(xiàn)。

由圖2可以看出,SPI在發(fā)送數(shù)據(jù)的同時(shí),也會接收對方的數(shù)據(jù),但很多時(shí)候在發(fā)送的過程中,程序并不需要關(guān)心接收到什么數(shù)據(jù),例如在向LCD屏輸出數(shù)據(jù)時(shí)。在這種情況下,設(shè)置RXIGNORE=1可以讓SPI模塊不產(chǎn)生接收狀態(tài)位,也不會因?yàn)闆]有讀出接收的數(shù)據(jù)而產(chǎn)生接收溢出等錯誤。

下面通過代碼,具體看看如何靈活使用這幾個寄存器。

下面定義兩個宏,用于發(fā)送與接收狀態(tài)的判斷:

53f8cc96-b5a0-11ee-8b88-92fbcf53809c.png

再定義兩個宏,用于發(fā)送控制位的設(shè)置:

540042a0-b5a0-11ee-8b88-92fbcf53809c.png

在代碼片段1的第08行把SSEL0映射到引腳P0_15,圖5中看到P0_15是SPI Flash的片選信號。因此這兩個宏中都設(shè)置了SSEL控制位為僅輸出SSEL0為有效,其它的SSEL片選均為無效(不選中)。

OUT_CTL將用于發(fā)送命令和數(shù)據(jù)時(shí),此時(shí)不需要關(guān)系輸入的數(shù)據(jù),所有設(shè)置RXIGNORE=1。

IN_DATA則用于需要接收數(shù)據(jù)時(shí),向從機(jī)發(fā)送一串時(shí)鐘脈沖,此時(shí)SPI Flash不理會接收的數(shù)據(jù),可以發(fā)送任意數(shù)值。

結(jié)合上面的初始化代碼和宏定義,下面的代碼用于讀入制造商代碼和芯片的代碼。

代碼片段2.讀取制造商ID和存儲器容量的輪詢函數(shù)

54076a6c-b5a0-11ee-8b88-92fbcf53809c.png

在上述代碼的第11、15行之前,并沒有WaitForSPI0txRdy語句,這是因?yàn)榍懊嬉呀?jīng)接收到有效數(shù)據(jù),這表示前一次的發(fā)送已經(jīng)完成,不再需要等待發(fā)送寄存器就緒,可以直接發(fā)送。

下面的代碼用于讀出設(shè)備ID,流程中與上面不同的只是發(fā)送命令串時(shí),分別操作TXDAT和TXCTL。

代碼片段3.讀取制造商ID和設(shè)備ID的輪詢函數(shù)

541eba46-b5a0-11ee-8b88-92fbcf53809c.png

最后是非常簡單的主函數(shù),代碼片段4.SPI輪詢例程主函數(shù)

01  int main(void)
02  {
03      SPI0_init();      // SPI初始化
04      Read_JEDEC_ID();
05      Read_Device_ID();
06  
07      while (1) {
08      }
09  }

1.3.2 SPI的中斷方式操作

下面是一種簡單的中斷方式操作的例程。

以讀取制造商ID和存儲器容量命令為例,這里我們通過TXDATCTL寄存器,每次都同時(shí)寫入發(fā)送控制字和要發(fā)送的數(shù)據(jù),把每次要寫入TXDATCTL的內(nèi)容事先保存在一個數(shù)組中,然后在中斷處理程序中,逐個把數(shù)組中的數(shù)據(jù)輸出到寄存器中。

數(shù)組定義如下:

const uint32_t CMD_JedecID[] = {
OUT_CTL | 0x9F, // 讀取制造商ID和存儲器容量命令
IN_DATA | 0xFF, // 發(fā)送一個字符的脈沖,讀回制造商ID MF7~MF0
IN_DATA | 0xFF, // 發(fā)送一個字符的脈沖,讀回存儲器ID
IN_DATA | 0xFF, CTL_EOT // 發(fā)送一個字符的脈沖,讀回存儲器容量
};

再通過幾個變量,控制整個操作流程。

uint32_t Tx_Cnt; // 用于控制當(dāng)前數(shù)組發(fā)送的進(jìn)度
uint32_t Tx_Num; // 用于記錄上述數(shù)組的長度
uint32_t *Tx_Buf; // 一個指向發(fā)送數(shù)組的指針
uint32_t Rx_Cnt; // 用于控制當(dāng)前接收數(shù)據(jù)的進(jìn)度
uint8_t Rx_Buf[10]; // 用于存放接收到的數(shù)據(jù)

中斷處理程序和預(yù)備函數(shù)如下:

代碼片段5. 中斷模式讀取制造商ID和存儲器容量

542c9ae4-b5a0-11ee-8b88-92fbcf53809c.png

上述代碼中的第06行,是為了防止由于無數(shù)據(jù)發(fā)送,不能清除STAT寄存器的發(fā)送就緒狀態(tài),而導(dǎo)致的頻繁進(jìn)入中斷。

在第20、21行分別是兩個循環(huán)語句,等待整個的發(fā)送與接收流程結(jié)束。數(shù)據(jù)送到發(fā)送寄存器后,發(fā)送并沒有結(jié)束,硬件還在逐位移位,需要等到SSEL回復(fù)高電平時(shí),才能確認(rèn)信號線上的發(fā)送已經(jīng)結(jié)束。注意這兩個語句的順序不能顛倒,否則在一次都沒有進(jìn)入中斷處理程序前,由于SSEL還未變?yōu)橛行?低電平),而使等待SSEL的語句失去作用。

在這兩行等待語句之前,用戶程序可以做些其它事情,有效地利用CPU的時(shí)間。

上述代碼十分簡單,也很有效,但不適合處理較長的數(shù)據(jù)塊。下面使用另一種方法,用中斷方式實(shí)現(xiàn)對SPIFlash存儲單元的讀寫操作。

1.3.3 中斷方式訪問SPI Flash的完整例程

集中審視W25Q32BV的命令列表(見表1),可以歸納所有命令為以下四類:

1.僅發(fā)送命令(若有24位地址,也歸于命令字,下同),例如“寫使能”、“整片擦除”、“扇區(qū)擦除”等命令。

2.發(fā)送命令和發(fā)送數(shù)據(jù)緩沖區(qū),例如“頁編程”命令。

3.發(fā)送命令和接收數(shù)據(jù)串,例如“讀制造商和設(shè)備ID”、“讀數(shù)據(jù)”等命令。

4.發(fā)送命令和就收狀態(tài)字,并等待某個指定狀態(tài)。

“寫狀態(tài)寄存器”命令既可以是上面第1類,也可以是第2類。

下面的結(jié)構(gòu)體將用于分別向四個不同的中斷處理程序傳遞命令和數(shù)據(jù)緩沖區(qū),結(jié)構(gòu)體中的各個分量在不同的中斷程序中有不同的意義。

54405cdc-b5a0-11ee-8b88-92fbcf53809c.png

按照不同的命令類,分別使用四種中斷處理程序,分別處理不同的流程,用結(jié)構(gòu)體中IRQHandler指定使用哪個流程。

下面是四個不同的中斷處理程序。

一. 僅發(fā)送命令流程

代碼片段6. 僅發(fā)送命令緩沖區(qū)處理流程

5450914c-b5a0-11ee-8b88-92fbcf53809c.png

僅發(fā)送命令緩沖區(qū)處理流程中由于只有發(fā)送流程,在使用時(shí)只需要使能發(fā)送就緒中斷,所以上述處理中不需要判斷狀態(tài)寄存器而區(qū)分是發(fā)送還是接收。

這個處理流程的使用方式,以“寫使能”(Write Enable)命令介紹如下。

代碼片段7. 使用僅發(fā)送命令緩沖區(qū)處理流程實(shí)現(xiàn)“寫使能”命令

546415e6-b5a0-11ee-8b88-92fbcf53809c.png

上述函數(shù),在所有變量、狀態(tài)寄存器和中斷寄存器配置完畢后,第10行使能中斷后,所有產(chǎn)生的SPI0中斷處理,將會在第02行被引導(dǎo)到預(yù)先設(shè)定的SPI0_Cmd_IRQHandler()處理程序。

第12行的作用和代碼片段5的第20、21行作用相同,都是先等待發(fā)送命令緩沖區(qū)完成,然后再等待所有流程結(jié)束,即SSEL恢復(fù)到高電平。

二. 發(fā)送命令和數(shù)據(jù)緩沖區(qū)流程

代碼片段8. 發(fā)送命令和發(fā)送數(shù)據(jù)緩沖區(qū)處理流程

5492bc84-b5a0-11ee-8b88-92fbcf53809c.png

該處理流程的前半段很簡單,逐個發(fā)送命令緩沖區(qū)的數(shù)據(jù),直到所有數(shù)據(jù)發(fā)送完畢。

發(fā)送數(shù)據(jù)緩沖區(qū)的流程,是和僅發(fā)送命令緩沖區(qū)處理流程一樣的,所以代碼片段8的后半段把數(shù)據(jù)緩沖區(qū)的參數(shù),拷貝至命令緩沖區(qū)的控制變量中,然后轉(zhuǎn)入前面的僅發(fā)送命令緩沖區(qū)處理流程,完成發(fā)送數(shù)據(jù)緩沖區(qū)。

“頁編程”命令就是典型的發(fā)送命令和發(fā)送數(shù)據(jù)緩沖區(qū)處理流程,傳輸結(jié)構(gòu)體的設(shè)置如下。

代碼片段9.使用發(fā)送命令和發(fā)送數(shù)據(jù)緩沖區(qū)處理流程實(shí)現(xiàn)“頁編程”命令

54a47316-b5a0-11ee-8b88-92fbcf53809c.png

使用要編程的頁地址、數(shù)據(jù)緩沖區(qū)指針和數(shù)據(jù)長度調(diào)用這個函數(shù),函數(shù)中逐項(xiàng)配置好傳輸結(jié)構(gòu)體各個變量,然后通過代碼片段7的Execution()函數(shù)配置好相應(yīng)寄存器,并等待傳輸流程結(jié)束。

三. 發(fā)送命令和接收數(shù)據(jù)串流程

代碼片段10. 發(fā)送命令和接收數(shù)據(jù)串處理流程

54b2d6d6-b5a0-11ee-8b88-92fbcf53809c.png

發(fā)送命令和接收數(shù)據(jù)串處理流程,比前面兩個流程增加了數(shù)據(jù)接收部分。在處理發(fā)送就緒(TXRDY)中斷部分又分為兩個階段,第一個階段是發(fā)送命令緩沖區(qū)。第二個階段是發(fā)送任意字符(此處為0xFF),用于產(chǎn)生從機(jī)輸出數(shù)據(jù)的時(shí)鐘信號;當(dāng)只剩一個要接收的數(shù)據(jù)時(shí),發(fā)送最后一個任意字符的同時(shí),失能發(fā)送就緒中斷,此后將不再產(chǎn)生這個中斷,達(dá)到控制接收數(shù)據(jù)數(shù)目的目的。

在處理接收就緒(RXRDY)中斷中,直接讀出接收數(shù)據(jù)并保存到數(shù)據(jù)緩沖區(qū)。

“讀數(shù)據(jù)”、“讀芯片唯一ID”等命令都執(zhí)行該流程,讀出的數(shù)據(jù)存放再Data_Buf指示的緩沖區(qū)。

代碼片段11. 使用發(fā)送命令和接收數(shù)據(jù)串處理流程實(shí)現(xiàn)“讀數(shù)據(jù)”

54cbe75c-b5a0-11ee-8b88-92fbcf53809c.png

Page_Read()函數(shù)的參數(shù)與前面的Page_Program()基本相同:讀出的數(shù)據(jù)區(qū)地址、數(shù)據(jù)緩沖區(qū)指針和數(shù)據(jù)長度三個參數(shù)。

四. 發(fā)送命令和就收狀態(tài)字流程

該流程要求先發(fā)送命令字,然后讀出狀態(tài)字,檢測狀態(tài)字的指定位,如果所關(guān)心的狀態(tài)位不是希望的數(shù)值,則重復(fù)讀出狀態(tài)字-檢測狀態(tài)字的過程,直到所關(guān)心的狀態(tài)位達(dá)到期望的數(shù)值。

代碼片段12. 發(fā)送命令和就收狀態(tài)字處理流程

54e68bc0-b5a0-11ee-8b88-92fbcf53809c.png

發(fā)送命令和就收狀態(tài)字處理流程與前面的發(fā)送命令和接收數(shù)據(jù)串處理流程一樣,在處理發(fā)送就緒(TXRDY)中斷部分也分為兩個階段,第一個階段是發(fā)送命令緩沖區(qū)。第二個階段是發(fā)送任意字符(此處為0xFF),用于產(chǎn)生從機(jī)輸出狀態(tài)字的時(shí)鐘信號;當(dāng)接收到的狀態(tài)字與要求的數(shù)值匹配時(shí),則通過再發(fā)送一個任意字符的方式,使SSEL變?yōu)闊o效(高電平)。

在處理接收就緒(RXRDY)中斷中,直接讀出接收數(shù)據(jù)并作為狀態(tài)字保存,留待第11行與預(yù)定的匹配數(shù)值進(jìn)行檢測。

“頁編程”和幾個擦除命令之后都需要使用發(fā)送命令和就收狀態(tài)字處理流程,發(fā)送“讀狀態(tài)寄存器1”然后反復(fù)檢測“忙”標(biāo)志位,直到編程或擦除命令完成,“忙”標(biāo)志位變?yōu)椤?’。

代碼片段13.使用發(fā)送命令和就收狀態(tài)字處理流程等待“忙”標(biāo)志位

54f81e4e-b5a0-11ee-8b88-92fbcf53809c.png

Wait_Status1()函數(shù)有兩個參數(shù)。mask一個屏蔽字,在需要檢測的狀態(tài)字的對應(yīng)位為’1’,不需要檢測的對應(yīng)位為’0’;value是需要檢測的狀態(tài)字的期望值,讀出的狀態(tài)字和mask屏蔽字進(jìn)行“與”運(yùn)算后的結(jié)果,需要和value相同。

例如等待“忙”標(biāo)志位變?yōu)椤?’的調(diào)用方式是:

55035b88-b5a0-11ee-8b88-92fbcf53809c.png

五. 測試SPI Flash的主函數(shù)

介紹完所有的中斷處理流程,最后這個主函數(shù)就非常簡單了:

代碼片段14.測試SPI Flash主函數(shù)

551373b0-b5a0-11ee-8b88-92fbcf53809c.png

運(yùn)行這個程序后,讀者可以檢查Buffer緩沖區(qū)的前后半段,數(shù)據(jù)應(yīng)該相同,表示寫入和讀出成功。

1.4 主機(jī)產(chǎn)生信號的時(shí)序控制 首先澄清一個概念——字符與數(shù)據(jù)幀。字符是指SPI發(fā)送或接收時(shí),TXDAT、TXDATCTL或RXDAT寄存器中一次所容納的數(shù)據(jù)位。一個數(shù)據(jù)幀可以是直接對應(yīng)一個字符,也可以是多個連續(xù)的字符組合。LPC800 的SPI模塊,可以在數(shù)據(jù)幀之間引入幀延遲,但不能在字符之間插入延遲,除非數(shù)據(jù)幀與字符長度相同。

552af99a-b5a0-11ee-8b88-92fbcf53809c.png

圖8.字符與數(shù)據(jù)幀之間的關(guān)系

上圖中的上面一行,顯示了當(dāng)一個數(shù)據(jù)幀的長度小于16位時(shí),一個字符就是一個數(shù)據(jù)幀。圖的下面一行顯示了,當(dāng)一個數(shù)據(jù)幀的長度大于16位時(shí),一個數(shù)據(jù)幀中包含了若干個字符。

發(fā)送每個數(shù)據(jù)幀的最后一個字符時(shí),設(shè)置發(fā)送控制寄存器的EOF位(見圖7),表示幀結(jié)束。使用EOF控制位,即可支持任意長度的數(shù)據(jù)幀。

SPI模塊中有一個延遲寄存器,可以為用戶提供多種時(shí)序延遲控制。延遲寄存器的各個控制位如下圖。

55497adc-b5a0-11ee-8b88-92fbcf53809c.png

圖9.SPI延遲寄存器(DLY)控制位

1.4.1 片選信號與數(shù)據(jù)幀信號之間的間隔控制

PRE_DELAY和POST_DELAY域各有4位,可以分別配置為插入0~15個時(shí)鐘周期的延遲。

PRE_DELAY表示在SSEL變?yōu)橛行Ш笾灵_始傳輸數(shù)據(jù)之間,需要插入的延遲時(shí)間。

POST_DELAY表示在數(shù)據(jù)傳輸結(jié)束至SSEL變?yōu)闊o效之間,需要插入的延遲時(shí)間。

下面兩個圖顯示了PRE_DELAY和POST_DELAY的作用位置。

555c0b5c-b5a0-11ee-8b88-92fbcf53809c.png

圖10.PRE_DELAY和POST_DELAY的作用位置示意圖(CPHA=0)

556e0ab4-b5a0-11ee-8b88-92fbcf53809c.png

圖11.PRE_DELAY和POST_DELAY的作用位置示意圖(CPHA=1)

圖中顯示在SSEL變低之后插入了2個時(shí)鐘周期的延遲(PRE_DELAY=2);在最后一位(LSB)發(fā)送完畢后插入了1個時(shí)鐘周期的延遲(POST_DELAY=1)。

1.4.2 數(shù)據(jù)幀之間的間隔控制

FRAME_DELAY有4位,當(dāng)發(fā)送的字符控制位EOT=1時(shí),在字符的最后一位后插入0~15個時(shí)鐘周期的延遲。這個延遲有利于某些器件在接收到一個數(shù)據(jù)幀后,有足夠的時(shí)間進(jìn)入下一幀的接收。

FRAME_DELAY的作用位置如下圖

55823836-b5a0-11ee-8b88-92fbcf53809c.png

圖12.FRAME_DELAY作用位置示意圖

1.4.3 兩次傳輸之間的間隔控制

TRANSFER _DELAY有4位,當(dāng)發(fā)送的字符控制位EOF=1時(shí),在SSEL變?yōu)闊o效(高電平)之后,需要至少有1~16個時(shí)鐘周期的延遲才能開始下一次傳輸,即SSEL至少要保持一個時(shí)鐘周期的高電平,才能再次變?yōu)榈碗娖?。這個延遲有利于某些器件在接收到一次傳輸?shù)淖詈笠粋€數(shù)據(jù)幀后,有足夠的時(shí)間進(jìn)入下一次傳輸?shù)慕邮铡?/p>

TRANSFER _DELAY只是給出了SSEL保持無效(高電平)的長度低限,這個時(shí)間有可能因?yàn)檐浖脑蜃兊酶L,例如軟件需要時(shí)間準(zhǔn)備下一個傳輸?shù)臄?shù)據(jù)。

TRANSFER _DELAY的作用位置如下圖

5597be0e-b5a0-11ee-8b88-92fbcf53809c.png

圖13.TRANSFER_DELAY的作用位置示意圖

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17203

    瀏覽量

    351934
  • 通信協(xié)議
    +關(guān)注

    關(guān)注

    28

    文章

    900

    瀏覽量

    40351
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8668

    瀏覽量

    151526
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1717

    瀏覽量

    91842
  • 串行外設(shè)接口
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    4026

原文標(biāo)題:LPC800前生今世:十一章 SPI串行外設(shè)

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    詳解SPI串行外設(shè)接口

    個方向傳輸。USB和I2C接口都是半雙工的,且RS485般也作為半雙工接口使用。全雙工系統(tǒng)中兩條單獨(dú)的通道,它們兩端各有個發(fā)送器個個接
    發(fā)表于 03-15 17:07 ?2034次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>詳解</b><b class='flag-5'>SPI</b><b class='flag-5'>串行</b><b class='flag-5'>外設(shè)</b><b class='flag-5'>接口</b>

    詳解SPI串行外設(shè)接口協(xié)議

    SPI在嵌入式系統(tǒng)中非常普遍,無論是芯片上的系統(tǒng)處理器(如ARM、MIC或Power PC等高端32位處理器),還是微控制器(如AVR、PIC等),通常包括能夠以主從模式運(yùn)行的SPI控制器。
    發(fā)表于 07-31 10:54 ?2009次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>詳解</b><b class='flag-5'>SPI</b><b class='flag-5'>串行</b><b class='flag-5'>外設(shè)</b><b class='flag-5'>接口</b>協(xié)議

    詳解SPI接口

    來源:易特創(chuàng)芯串行外設(shè)接口(SPI)是微控制器和外圍IC(如傳感器、ADC、DAC、移位寄存器、SRAM等)之間使用最廣泛的接口
    發(fā)表于 10-22 18:05

    串行外設(shè)接口SPI模塊簡析

    慕課蘇州大學(xué).嵌入式開發(fā)及應(yīng)用.第四章.較復(fù)雜通信模塊.串行外設(shè)接口SPI模塊0 目錄4 較復(fù)雜通信模塊4.1 串行
    發(fā)表于 11-08 07:35

    讀懂串行外設(shè)接口SPI

    串行外設(shè)接口SPI是什么?其有哪些部分組成呢?如何對串行外設(shè)
    發(fā)表于 12-16 06:28

    ADIuC812的串行外設(shè)接口(SPI)及其在LonWork

    ADIuC812的串行外設(shè)接口(SPI)及其在LonWorks智能節(jié)點(diǎn)中的應(yīng)用:介紹了ADIuC812單片機(jī)的串行
    發(fā)表于 05-29 12:20 ?22次下載

    理解ATE SPI (串行外設(shè)接口)

    理解ATE SPI (串行外設(shè)接口) 大多數(shù)Maxim® ATE設(shè)計(jì)都采用了串行
    發(fā)表于 01-26 16:34 ?2644次閱讀
    理解ATE <b class='flag-5'>SPI</b> (<b class='flag-5'>串行</b><b class='flag-5'>外設(shè)</b><b class='flag-5'>接口</b>)

    SPI編程如此簡單?讀懂串行外設(shè)接口

    SPI 是英語 Serial Peripheral interface 的縮寫,顧名思義就是串行外圍設(shè)備接口。
    發(fā)表于 04-27 09:50 ?40次下載

    讀懂SPI串行外設(shè)接口

    SPI總線系統(tǒng)是種同步串行外設(shè)接口,它可以使MCU與各種外圍設(shè)備以串行方式進(jìn)行通信以交換信息。
    發(fā)表于 04-27 15:19 ?1w次閱讀

    PIC32系列參考手冊之串行外設(shè)接口SPI

    本文主要介紹了PIC32系列參考手冊之串行外設(shè)接口SPI)。
    發(fā)表于 06-06 17:28 ?6次下載

    SPI串行外設(shè)接口的編程說明資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是SPI串行外設(shè)接口的編程說明資料免費(fèi)下載。
    發(fā)表于 03-25 08:00 ?2次下載
    <b class='flag-5'>SPI</b><b class='flag-5'>串行</b><b class='flag-5'>外設(shè)</b><b class='flag-5'>接口</b>的編程說明資料免費(fèi)下載

    第9章:串行外設(shè)接口模塊(SPI)PPT下載

    第9章:串行外設(shè)接口模塊(SPI)PPT下載
    發(fā)表于 10-08 14:56 ?36次下載

    SPI 串行外設(shè)接口

    **SPI簡介:**串行外設(shè)接口(Serial Peripheral Interface Bus)SPI
    發(fā)表于 12-20 19:31 ?9次下載
    <b class='flag-5'>SPI</b> <b class='flag-5'>串行</b><b class='flag-5'>外設(shè)</b><b class='flag-5'>接口</b>

    SPI串行外設(shè)接口的特點(diǎn)概述

    SPI是Serial Peripheral interface的縮寫,是串行外設(shè)接口。全雙工通信,有4根信號線,在MCU、SOC、FLA
    的頭像 發(fā)表于 04-24 17:29 ?2009次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>串行</b><b class='flag-5'>外設(shè)</b><b class='flag-5'>接口</b>的特點(diǎn)概述

    SPI串行外設(shè)接口設(shè)計(jì)實(shí)現(xiàn)

    SPI 全稱為 Serial Peripheral Interface,譯為串行外設(shè)接口。它是 Motorola 公司推出的種相對高速的同
    發(fā)表于 05-29 15:40 ?1530次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>串行</b><b class='flag-5'>外設(shè)</b><b class='flag-5'>接口</b>設(shè)計(jì)實(shí)現(xiàn)