日本无码免费高清在线|成人日本在线观看高清|A级片免费视频操逼欧美|全裸美女搞黄色大片网站|免费成人a片视频|久久无码福利成人激情久久|国产视频一二国产在线v|av女主播在线观看|五月激情影音先锋|亚洲一区天堂av

  • 手機(jī)站
  • 小程序

    汽車測試網(wǎng)

  • 公眾號
    • 汽車測試網(wǎng)

    • 在線課堂

    • 電車測試

AUTOSAR MCAL SPI詳解

2021-03-25 08:19:00·  來源:汽車電子與軟件  
 
本文將詳細(xì)介紹AUTOSAR MCAL SPI模塊的知識點(diǎn)及注意事項,本文大部分內(nèi)容來源于標(biāo)準(zhǔn),并參照了NXP S32K1系列的 MCAL SPI的代碼。耐心看完本文后,你就對AUTOSAR
本文將詳細(xì)介紹AUTOSAR MCAL SPI模塊的知識點(diǎn)及注意事項,本文大部分內(nèi)容來源于標(biāo)準(zhǔn),并參照了NXP S32K1系列的 MCAL SPI的代碼。
耐心看完本文后,你就對AUTOSAR MCAL SPI有了非常深入的了解。

1. 模塊簡介

SPI驅(qū)動程序給那些通過SPI總線連接的設(shè)備提供讀寫服務(wù)。常見的設(shè)備,比如EEPROM,外掛Watchdog,或其他一些專用集成電路(ASIC)。當(dāng)然,SPI驅(qū)動程序也提供對片上SPI外設(shè)的配置及使用。

驅(qū)動程序?qū)δ芎团渲枚紕澐至硕鄠€等級以達(dá)到高擴(kuò)展性及靈活性。比如功能方面,劃分為3個等級。根據(jù)不同等級可配置為同步或異步。

當(dāng)然還抽象了很多其他概念,比如Sequence, Job, Channel等。重要概念/關(guān)鍵點(diǎn)請見下圖:

AUTOSAR MCAL SPI詳解

2. 模塊限制

只支持Master模式。

只支持全雙工模式。

LEVEL 2 是為那些需要單獨(dú)提供至少兩路SPI總線的芯片而指定的。否則,使用這種級別的功能沒有意義。

外設(shè)時鐘初始化及分頻由MCU模塊負(fù)責(zé)

如果有寄存器需要和其他外設(shè)共享,這種寄存器由MCU負(fù)責(zé)。

3. 主要概念:Sequence/Job/Channel


AUTOSAR MCAL SPI詳解1

首先需要說明一下這里的Channel是軟件層面的,與硬件的物理通道/Channel沒任何關(guān)系,也沒有進(jìn)行任何綁定。軟件層面的這個Channel只是對BUFF做一些配置。

Job是和外設(shè)綁定的。所以一個Channel可以同時屬于多個Job,如上CH2及CH5。CH2和CH5的區(qū)別在于前者是用于不同外設(shè),后者用同一外設(shè)。個人不推薦這么使用,因為一旦管理不好,很容易造成buff里面的數(shù)據(jù)混亂。一個Job也同樣可以同時屬于多個Sequence,如上Job0 。

一個Job下面可以有多個Channel,如上Job1, Job2,Job3;且應(yīng)至少有一個Channel,否則沒意義,如上Job5是不允許的。這種情況通常是這個Job/Seq有多個用戶使用,針對每個用戶分配自己獨(dú)立的Channel。
同樣,一個Sequence下面可以有多個Job,如上Seq3;應(yīng)至少有一個Job,否則 沒意義,如上Seq2是不允許的。

同一個Sequence下面的多個Job,他們擁有相同的優(yōu)先級。

一個外設(shè)可有多個Job綁定。

上圖可以發(fā)現(xiàn),一個Sequence下面可以有不同外設(shè)(總線)的Job。

傳輸是以Sequence為單位,只能操作Sequence。接收是具體到某個Channel。獲取狀態(tài)或者回調(diào),Job及Sequence都可以(Level1, Level2)。

4. Sequence/Job/Channel發(fā)送時序

AUTOSAR MCAL SPI詳解2
如上圖所示,發(fā)送任務(wù)需要等Sequence下面的所有Job及所有Channel都發(fā)送完成后,總線才空閑(釋放)。

如果多個Job共用一個Channel(Sequence也一樣),那么在傳輸過程中用戶需要保證不調(diào)用讀/寫相關(guān)函數(shù),否則數(shù)據(jù)一致性無法保證(數(shù)據(jù)混亂)。

在傳輸過程中,讀/寫函數(shù)自己是無法保證數(shù)據(jù)的完整性的。

允許同時發(fā)起多個Sequence傳輸請求。比如當(dāng)一個Seq正在傳輸過程中,允許發(fā)起另外的Seq傳輸請求,但相同的Seq不能同時發(fā)起多次。驅(qū)動程序會根據(jù)當(dāng)前情況選擇接受或拒絕。比如新的Seq與原Seq有共享的Job,這種情況不會接受請求以防止沖突等。

Sequence傳輸請求是可以被取消的(Spi_Cancel),取消這個操作以Job為原子單位進(jìn)行處理。取消之后還是會調(diào)用回調(diào)函數(shù)通知用戶(如果使能了)。需要注意的是,取消操作是否會對外設(shè)造成損壞或其他未定義行為需要用戶自己把控,驅(qū)動程序是不負(fù)責(zé)的。

Sequence下面可以包含多個Job,每個Job傳輸完成后會根據(jù)優(yōu)先級策略(請見后文)重新進(jìn)行調(diào)度。Polling模式下調(diào)度是靠用戶周期調(diào)用Spi_MainFunction 函數(shù)來實(shí)現(xiàn)的。

5. MCAL SPI模式分類

AUTOSAR MCAL SPI詳解3
√: support/available x: not support/unavailable IB/EB: 請見后文

LEVEL 0:提供一組簡化的服務(wù),只處理簡單的同步傳輸。對于包含簡單SPI網(wǎng)絡(luò)的ECU來說,這種情況經(jīng)常發(fā)生,即便對于使用高速外部設(shè)備的ECU來說也是如此。

同步傳輸意味著一旦調(diào)用了傳輸服務(wù)函數(shù),在該傳輸請求完成之前,程序?qū)恢北蛔枞ㄒ粋€好的代碼實(shí)現(xiàn),通常也會有超時監(jiān)控機(jī)制,超時后也會釋放CPU)。

LEVEL 1:提供一組簡化的服務(wù),只處理異步傳輸。對于那些使用SPI且定義了不同優(yōu)先級的功能來說,異步傳輸經(jīng)常被用到。還有一些低速外設(shè)也同樣適合該異步模式。

異步傳輸意味著當(dāng)傳輸正在進(jìn)行時,調(diào)用傳輸服務(wù)的用戶不會被阻塞。驅(qū)動程序可以在傳輸結(jié)束時通知用戶(可由用戶進(jìn)行配置)。異步傳輸模式又可以分為通過輪詢或中斷來實(shí)現(xiàn)。

LEVEL 2:前面兩種的組合。包含全部功能??蓾M足不同速率,不同優(yōu)先級等復(fù)雜需求場景。是為那些需要單獨(dú)提供至少兩路SPI總線的芯片而指定的。否則,使用這種級別的功能沒有意義。

如果配置為(異步)輪詢模式(僅在API等級為Level 2時有效),需要周期調(diào)用:Spi_MainFunction。

AUTOSAR MCAL SPI詳解4
由上表可以看到,DMA只有在異步模式(Async Mode)下才有效。

6. SPI Buffer

AUTOSAR MCAL SPI詳解5
IB: Internal Buffers EB: External Buffers

上表中的優(yōu)缺點(diǎn)來自于標(biāo)準(zhǔn)文檔的翻譯,有些語句不太通順,請看下面文字描述。不影響你理解。

有些硬件層面提供了比較大的Buffer,這種情況IB類型可以充分發(fā)揮硬件特性,提高其性能(這是IB Buffer的設(shè)計初衷)(注意,如果有多個channel同時掛到一個device上面,則該功能使用有限制)。如果硬件沒有Buffer,則需要軟件來模擬實(shí)現(xiàn)。

IB類型的Buffer其大小是固定的。EB類型Buffer可以通過API進(jìn)行設(shè)置。

SPI驅(qū)動不負(fù)責(zé)保證IB Buffer里數(shù)據(jù)的連續(xù)性。如果某個Channel被多個Job/Seq使用,SPI驅(qū)動也不負(fù)責(zé)維護(hù)該Buffer被多個Job/Seq重寫這種場景。

但是發(fā)送和接收的Buffer是分開獨(dú)立的。也就是發(fā)送Buffer不會被接收的數(shù)據(jù)覆蓋。

EB Buffer的設(shè)計初衷是為了盡量重用外部(這里指用戶)Buffer,因為很多情況下,用戶已經(jīng)有了一個Buffer,那么使用EB類型Buffer,只需要將用戶Buffer的指針提供給SPI驅(qū)動以達(dá)到共用的目的。所以SPI驅(qū)動也是無法對該Buffer管理的,需要用戶來保證其一致性。還有一種場景是,有時候我們的Buffer大小是變化的(比如多個使用者的需求可能不同,或者一個使用者數(shù)據(jù)長度是變化的),這種情況也需要使用EB類型Buffer來解決(因為IB類型Buffer是固定大小的)。當(dāng)然EB類型Buffer也可以是固定大小。但是Buffer大小的最大值需要靜態(tài)配置??偟膩碚fEB類型Buffer使用更靈活。

Channel傳輸有自己的參數(shù)(Spi_SetupEB),但參數(shù)(source/target)也可以是NULL,如果發(fā)送的時候Source為NULL,則會使用默認(rèn)參數(shù)傳輸,如果接收的時候Target為NULL,則會忽略接收到的數(shù)據(jù)。每個Channel,Spi_SetupEB函數(shù)只能在發(fā)起傳輸請求前調(diào)用一次,除非有信息需要變更,比如長度信息。

AUTOSAR MCAL SPI詳解6

如果Data Width也是uint8,uint16,uint32三種類型,由于和Data Buffer Type一致,所以可以直接進(jìn)行轉(zhuǎn)發(fā)。但是如果Data Width是8~32,類型不一致,那需要小心。比如,如果Data Width設(shè)置12Bits。Data Buffer Type只能選擇uint16,這種情況下,發(fā)送的時候只能發(fā)送低12Bits,忽略高4位。接收的時候只接收低12位,高4位用0填充。

7. SPI其他重要機(jī)制

•  優(yōu)先級:數(shù)字越小優(yōu)先級越低

•  Sequence鏈接的Job應(yīng)具有相同或遞減的優(yōu)先級

•  Sequence可被中斷

•  并發(fā)同步傳輸

該驅(qū)動可能會被多個軟件模塊同時使用,這些模塊可能彼此獨(dú)立,也可能屬于不同的層。為了防止同時訪問時發(fā)生沖突,因此增加了優(yōu)先級機(jī)制,每個Job將分配一個優(yōu)先級。這種場景通常發(fā)生在基于異步機(jī)制的實(shí)時系統(tǒng)中。

一個Sequence下面的多個Job,要么這些Job都具有相同的優(yōu)先級。如果優(yōu)先級不同,則第一個Job優(yōu)先級最高,優(yōu)先級最低的放最后(配置的時候就需要這樣做)。盡管驅(qū)動內(nèi)部有基于優(yōu)先級的調(diào)度器,但調(diào)度器更多用來處理那些允許被中斷的Sequence執(zhí)行過程中發(fā)起了一個新的更高優(yōu)先級的Sequence任務(wù)的調(diào)度。

Level 1和Level 2可以配置某個Sequence是否可以被搶占。如果使能被搶占功能,則該Sequence啟動傳輸以后,過程中如果有更高優(yōu)先級的Job發(fā)起傳輸請求,則會掛起(Suspend)當(dāng)前Sequence去執(zhí)行更高優(yōu)先級的Job,打斷是以Job為原子單位進(jìn)行的,也就是必須等待某個Job執(zhí)行完,下一次調(diào)度點(diǎn)執(zhí)行的時候才切換,請參照前面的時序圖。

如果沒有使能搶占功能,則該Sequence一旦開始傳輸,必須等他傳輸完成后方可執(zhí)行其他Sequence的傳輸請求。

如果某個Sequence被搶占,用戶需要清楚是否存在多個Sequence共用同一個Channel的情況,如果有,則自己需要管理好Channel的數(shù)據(jù),防止搶占過程中被更高優(yōu)先級的Job將原來Channel里面的數(shù)據(jù)覆蓋掉(通常不建議這么配置)。

同步傳輸也是可以同時發(fā)起多個不同Sequence傳輸請求的,但用戶必須使能該功能(SPI_SUPPORT_CONCURRENT_SYNC_TRANSMIT :Level 0, Level2下有效);

8. 注意事項

1 使用本模塊中的服務(wù)前,必須先調(diào)用Spi _Init()函數(shù)初始化。

2 如果使用了DMA功能,Spi _Init()函數(shù)必須在Port_Init()函數(shù)及Mcl_Init()函數(shù)之后調(diào)用。

3 如果配置為(異步)輪詢模式(僅在API等級為Level 2時有效),需要周期調(diào)用:Spi_MainFunction。

4 如果使用固定優(yōu)先級策略,SpiPhyRxDmaChannel優(yōu)先級必須大于SpiPhyTxDmaChannel優(yōu)先級。

5 如果配置為(異步)中斷模式,且啟用了DMA:

(1)必須使能DMA相應(yīng)通道中斷。

(2)必須將SPI模塊的接收/發(fā)送中斷函數(shù)注冊到DMA完成回調(diào)函數(shù)里,配置見DMA模塊配置。


AUTOSAR MCAL SPI詳解7

6 如果配置為(異步)中斷模式,但是使用FIFO,需要將中斷函數(shù)(Spi_LPspi_IsrTDF_LPSPI_X)注冊到中斷向量表里面,其中X為通道號。

由于MCAL本身不提供中斷向量表注冊功能,可以參照SDK或者M(jìn)CAL示例工程里的中斷注冊函數(shù):sys_registerIsrHandler()。

7 如果使能DMA傳輸模式,且D-CACHE使能的情況下,不能使用內(nèi)部buf(IB)來發(fā)送或接收,必須將源地址及目標(biāo)地址的buf放在NON-CACHE區(qū)域以避免數(shù)據(jù)一致性問題(如果放在CACHE區(qū)域可能會發(fā)生數(shù)據(jù)亂的現(xiàn)象)。可以在鏈接文件(*.ld)里面使用分區(qū)指令將需要發(fā)送或接收的變量進(jìn)行隔離。

8 在SPI模塊的回調(diào)函數(shù)中只能調(diào)用下面這些函數(shù),其他函數(shù)不允許在里面調(diào)用(協(xié)議標(biāo)準(zhǔn)規(guī)定):

a. Spi_ReadIB

b. Spi_WriteIB

c. Spi_SetupEB

d. Spi_GetJobResult

e. Spi_GetSequenceResult

f. Spi_GetHWUnitStatus

g. Spi_Cancel 
分享到:
 
反對 0 舉報 0 收藏 0 評論 0
滬ICP備11026917號-25