接著之前的英飛凌TC3XX的文章,今天來梳理一下SPI模塊的信息。
?
01.
QSPI模塊簡介
首先什么是QSPI呢?QSPI中的Q是“Queue”的縮寫,指的是一塊通用的內(nèi)存,其中包含兩種數(shù)據(jù),分別為配置數(shù)據(jù)和傳輸數(shù)據(jù),配置數(shù)據(jù)就是寄存器的配置,傳輸數(shù)據(jù)就是實(shí)際要發(fā)送的數(shù)據(jù),最簡單的Queue組成如下圖所示,一個(gè)4byte的配置數(shù)據(jù)以及一個(gè)4byte的傳輸數(shù)據(jù)組成。
那QSPI有什么好處呢?Queue 使得不同格式的SPI數(shù)據(jù)的傳輸更高效,例如:
1. 使用一個(gè)DMA通道就可以完成Queue和QSPI外圍設(shè)備的數(shù)據(jù)傳輸;
2. 通過Queue的數(shù)據(jù)就可以自動(dòng)改變SPI數(shù)據(jù)格式及延時(shí)時(shí)間配置而不需要CPU的
參與;
3. QSPI有特殊的FIFO機(jī)制將Queue中的數(shù)據(jù)定向到對(duì)應(yīng)的目標(biāo)地址中;
然后簡述該模塊的一些特性,在此之前可以看一下SPI模塊的硬件簡圖,如下圖。
該模塊的特性如下:
1.支持主從模式,全雙工通信;
2.4x32bit Tx和Rx FIFOs;
3.多路片選,每路SPI最多可支持16路片選;
4.支持FIFO的單點(diǎn)中斷模式、 ERR中斷、 PT的(EOF)中斷;
5.Job為一個(gè)基本的報(bào)文幀傳輸,包含一個(gè)或多個(gè)Channel的選擇及片選、波特率、延時(shí)時(shí)間、校驗(yàn)等(ExternalDevice)的設(shè)置,Sequence為一個(gè)基本的SPI收發(fā)操作對(duì)象,包含一個(gè)或多個(gè)Job。
5.靈活的真報(bào)文長度以及幀格式、時(shí)間設(shè)置;數(shù)據(jù)傳輸分為Short Data模式、Long Data模式、Continuous模式、XXL Frame模式等。
Short Data模式下,數(shù)據(jù)長度范圍為2~32bit,一幀數(shù)據(jù)傳輸需要一個(gè)BACON配置和一個(gè)DATA配置;
Long Data模式下,數(shù)據(jù)長度依然為2~32byte,一幀數(shù)據(jù)傳輸需要一個(gè)BACON配置和多個(gè)DATA配置;
Continuous模式又分為Short和Long兩種,Short模式下,第一個(gè)BACON配置的LAST為0,之后寫入的數(shù)據(jù)均為傳輸數(shù)據(jù),直至寫入的BACON.LAST為1,寫入最后一幀數(shù)據(jù)。Long模式下,第一個(gè)BACON.LAST為0,之后按照BACON.DL寫入N個(gè)傳輸數(shù)據(jù),后面的操作就類似Short模式,直至寫入的BACON.LAST為1,寫入最后的一幀數(shù)據(jù)。
XXL FRAME模式是一種擴(kuò)展的Long Data模式,數(shù)據(jù)長度最長可達(dá)65536byte,數(shù)據(jù)長度通過XXLCON.XDL來設(shè)置,而不是BACON.DL,并且無需重復(fù)配置BACON。
Move Counter模式是一種Short Data的擴(kuò)展模式,數(shù)據(jù)長度可達(dá)8192bit,通過MCCON.MCEN使能,數(shù)據(jù)長度通過MC.MCOUNT設(shè)置。
02.
QSPI模塊的時(shí)鐘
QSPI模塊的時(shí)鐘輸入有兩個(gè),分別為Fspb和Fper,其中Fspb用于QAPI模塊用戶接口以及寄存器操作的時(shí)鐘源,F(xiàn)per用于波特率產(chǎn)生的時(shí)鐘源,如下圖所示。
波特率的計(jì)算如下圖所示。
除上述之外,QSPI 提供了硬件的idle, leading和 trailing 延時(shí)設(shè)置以及數(shù)據(jù)采樣點(diǎn)的設(shè)置,如下圖所示。
03.
QSPI模塊MCAL API接口簡介
通常來說,當(dāng)前的使用英飛凌的芯片,都是基于購買的MCAL進(jìn)行開發(fā),那對(duì)于QSPI模塊而言,常用的API有哪些呢?下面來列舉一下。
Spi_Init (),初始化QSPI核的相關(guān)寄存器、復(fù)位全局變量、設(shè)置QSPI狀態(tài)為IDLE。對(duì)于多核場景而言,調(diào)用此API只會(huì)初始化隸屬于調(diào)用核的SPI,因此在每個(gè)含有SPI的核中均需要調(diào)用該API。
Spi_DeInit ()用于反初始化SPI驅(qū)動(dòng)程序相關(guān)的硬件和全局變量,該API只有在調(diào)用過Spi_Init()后并且只有當(dāng)設(shè)備處于空閑狀態(tài)時(shí)才接受處理,與Spi_Init函數(shù)類似,不同核上的SPI需要反初始化的話,均需調(diào)用該API。
Spi_SetupEB ()用于設(shè)置收、發(fā)數(shù)據(jù)緩存及緩存長度。
Spi_WriteIB ()用于拷貝數(shù)據(jù)到發(fā)送緩存。
Spi_ReadIB ()用于將接收到的通道數(shù)據(jù)從內(nèi)部緩沖區(qū)同步讀取到應(yīng)用程序傳遞的目標(biāo)緩沖區(qū)。?
Spi_SetAsyncMode ()用于設(shè)置異步通信的Sequence是中斷模式還是輪詢模式。
Spi_AsyncTransmit ()/Spi_SyncTransmit ()用于異步傳輸函數(shù)/同步傳輸函數(shù)。
Spi_MainFunction_Handling ()?該API用于輪詢SPI的相關(guān)中斷標(biāo)識(shí)。
Spi_GetJobResult/Spi_GetSequenceResult/Spi_GetHWUnitStatus /Spi_GetStatus 查詢某Job的最終傳輸狀態(tài)/查詢某Sequence的最終傳輸狀態(tài)/查詢某路SPI核的傳輸狀態(tài)/查詢所有已配置的(包括同步異步) SPI傳輸狀態(tài)。
Spi_QspiDmaCallOut ()用于?每個(gè)channel傳輸結(jié)束后調(diào)用該API, 在此回調(diào)期間重新配置該回調(diào)通道,并重新觸發(fā)相應(yīng)的DMA通道來啟動(dòng)下一個(gè)通道傳輸。
04.
QSPI模塊MCAL配置
跟之前的列舉的其他模塊一樣,首先是General模塊的配置,包括時(shí)鐘源,SPI的模式,另外錯(cuò)誤檢測以及safety檢測的關(guān)閉或者開啟,可根據(jù)需求來設(shè)置。
第二步則是配置SpiHwConfiguration模塊,包括SPI內(nèi)核的設(shè)置以及接收引腳的配置。
第三步則是通道的配置,包括模式,數(shù)據(jù)長度,傳輸方向等。
第四步則是波特率,片選通道、開環(huán)模式的配置。
第五步則是上述提到的idle/trail等時(shí)間參數(shù)的設(shè)置。
第六步則是Job或者Squence的配置。
第七步則是所有引腳的配置。
編輯:黃飛
?
評(píng)論