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

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

    汽車測(cè)試網(wǎng)

  • 公眾號(hào)
    • 汽車測(cè)試網(wǎng)

    • 在線課堂

    • 電車測(cè)試

AUTOSAR MCAL SPI詳解

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

1. 模塊簡(jiǎn)介

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

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

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

AUTOSAR MCAL SPI詳解

2. 模塊限制

只支持Master模式。

只支持全雙工模式。

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

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

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

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


AUTOSAR MCAL SPI詳解1

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

Job是和外設(shè)綁定的。所以一個(gè)Channel可以同時(shí)屬于多個(gè)Job,如上CH2及CH5。CH2和CH5的區(qū)別在于前者是用于不同外設(shè),后者用同一外設(shè)。個(gè)人不推薦這么使用,因?yàn)橐坏┕芾聿缓茫苋菀自斐蒪uff里面的數(shù)據(jù)混亂。一個(gè)Job也同樣可以同時(shí)屬于多個(gè)Sequence,如上Job0 。

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

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

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

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

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

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

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

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

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

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

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

Sequence下面可以包含多個(gè)Job,每個(gè)Job傳輸完成后會(huì)根據(jù)優(yōu)先級(jí)策略(請(qǐng)見后文)重新進(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: 請(qǐng)見后文

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

同步傳輸意味著一旦調(diào)用了傳輸服務(wù)函數(shù),在該傳輸請(qǐng)求完成之前,程序?qū)?huì)一直被阻塞(一個(gè)好的代碼實(shí)現(xiàn),通常也會(huì)有超時(shí)監(jiān)控機(jī)制,超時(shí)后也會(huì)釋放CPU)。

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

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

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

如果配置為(異步)輪詢模式(僅在API等級(jí)為L(zhǎng)evel 2時(shí)有效),需要周期調(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)文檔的翻譯,有些語句不太通順,請(qǐng)看下面文字描述。不影響你理解。

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

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

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

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

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

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

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ā)送的時(shí)候只能發(fā)送低12Bits,忽略高4位。接收的時(shí)候只接收低12位,高4位用0填充。

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

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

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

•  Sequence可被中斷

•  并發(fā)同步傳輸

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

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

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

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

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

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

8. 注意事項(xiàng)

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

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

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

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

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

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

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


AUTOSAR MCAL SPI詳解7

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

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

7 如果使能DMA傳輸模式,且D-CACHE使能的情況下,不能使用內(nèi)部buf(IB)來發(fā)送或接收,必須將源地址及目標(biāo)地址的buf放在NON-CACHE區(qū)域以避免數(shù)據(jù)一致性問題(如果放在CACHE區(qū)域可能會(huì)發(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 
分享到:
 
反對(duì) 0 舉報(bào) 0 收藏 0 評(píng)論 0
滬ICP備11026917號(hào)-25