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è)備間的通信。基本的連線方式是四條信號線,如下圖:
圖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ā)送與接收,示意圖如下:
圖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的四種組合被定義為四種模式,如下表:
圖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)行通信。
圖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的操作,下面先抄錄這個存儲器芯片的部分命令格式,方便例程的理解。以下例程會用到表中帶陰影的命令。
表1.W25Q32BV部分命令列表
圖5.開發(fā)板上的SPI Flash線路圖
1.3.1 SPI的輪詢方式操作
以下所有的SPI例程都使用相同的初始化程序。
代碼片段1. SPI主機(jī)初始化函數(shù)
初始化函數(shù)非常簡單直接,和所有其它模塊的初始化過程一樣,都是“開啟時(shí)鐘→映射引腳→復(fù)位模塊→配置參數(shù)。
下圖顯示了所有SPI配置寄存器的配置位。
圖6.SPI配置寄存器(CFG)一覽
代碼片段1中只設(shè)置了CFG寄存器的第0、2位,其它位均為’0’。
LPC800的SPI發(fā)送數(shù)據(jù)/控制寄存器是非常有特色的。
圖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)的判斷:
再定義兩個宏,用于發(fā)送控制位的設(shè)置:
在代碼片段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ù)
在上述代碼的第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ù)
最后是非常簡單的主函數(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和存儲器容量
上述代碼中的第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)體中的各個分量在不同的中斷程序中有不同的意義。
按照不同的命令類,分別使用四種中斷處理程序,分別處理不同的流程,用結(jié)構(gòu)體中IRQHandler指定使用哪個流程。
下面是四個不同的中斷處理程序。
一. 僅發(fā)送命令流程
代碼片段6. 僅發(fā)送命令緩沖區(qū)處理流程
僅發(fā)送命令緩沖區(qū)處理流程中由于只有發(fā)送流程,在使用時(shí)只需要使能發(fā)送就緒中斷,所以上述處理中不需要判斷狀態(tài)寄存器而區(qū)分是發(fā)送還是接收。
這個處理流程的使用方式,以“寫使能”(Write Enable)命令介紹如下。
代碼片段7. 使用僅發(fā)送命令緩沖區(qū)處理流程實(shí)現(xiàn)“寫使能”命令
上述函數(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ū)處理流程
該處理流程的前半段很簡單,逐個發(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)“頁編程”命令
使用要編程的頁地址、數(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ù)串處理流程
發(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ù)”
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)字處理流程
發(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)志位
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)用方式是:
五. 測試SPI Flash的主函數(shù)
介紹完所有的中斷處理流程,最后這個主函數(shù)就非常簡單了:
代碼片段14.測試SPI Flash主函數(shù)
運(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ù)幀與字符長度相同。
圖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í)序延遲控制。延遲寄存器的各個控制位如下圖。
圖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的作用位置。
圖10.PRE_DELAY和POST_DELAY的作用位置示意圖(CPHA=0)
圖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的作用位置如下圖
圖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的作用位置如下圖
圖13.TRANSFER_DELAY的作用位置示意圖
審核編輯:湯梓紅
-
mcu
+關(guān)注
關(guān)注
146文章
17203瀏覽量
351934 -
通信協(xié)議
+關(guān)注
關(guān)注
28文章
900瀏覽量
40351 -
接口
+關(guān)注
關(guān)注
33文章
8668瀏覽量
151526 -
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)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論