一、 概述
本文將會介紹 SemiDrive E3 MCAL Spi 模塊的簡介以及基本配置。此外會結合實際操作的介紹,幫助新手快速了解並掌握這個模塊的使用,文中的 MCAL 是基於 PTG3.0 的版本,開發板是官方的 E3640 網關板。
二、 Spi 模塊簡介
AutoSar 關於 Spi 模塊定義了一些概念,例如 Channel、Job、Sequence。下面將具體介紹這些概念的具體含義以及使用上的一些注意事項,這幾個概念之間的關係如下圖所示。
圖 2.1 AutoSar Spi 模塊框架
從圖中可以看出 Channel 是對應到具體的 SPI 設備,同個 SPI 控制器不同的片選信號對應不同的 SPI 設備,然後 Job 是和 Channel 進行綁定的,每個 Job 至少綁定一個 Channel,不然這個 Job 沒有意義,每個 Job可以綁定多個 Channel,例如圖中的 Job1 綁定了 Ch1 和 Ch2;同個 Channel 可以被多個 Job 綁定,例如圖中的 Ch2 和 Ch5;Ch2 和 Ch5 的區別是 Ch2 用於不同的外設,而 Ch5 用於同一個外設,不推薦這麼使用,容易造成數據混亂。
SPI 的傳輸是以 Sequence 為單位的,Sequence下面必須要綁定 Job,不然的話該 Sequence 沒有意義。每個 Sequence 下面可以有多個 Job,這些 Job 擁有多個同個優先級,每個 Job 是從片選信號開始到片選信號結束,如下圖所示。
圖 2.2 SPI 傳輸序列
三、 Spi 模塊的主要配置
在配置 SPI 模塊之前我們需要對 MCU 模塊和 Port 模塊先進行配置,首先配置 MCU 模塊,使能我們需要用到的 SPI 實例。
圖 3.1 使能 SPI 模塊
接著配置 Port 模塊,對 SPI 引腳進行配置。
圖 3.2 配置 SPI 引腳
最後對 SPI 模塊進行配置,首先根據實際使用的 SPI 的 Channel、Job、Sequence 數量進行配置。
圖 3.3 SPI General 配置
接著配置 SPI 的硬體單元,SpiController 這欄是選擇實際的 SPI 控制器,例如這裡我們將 SPI2 配置為 CSIB2,不使能 DMA 傳輸,Master 模式。
圖 3.4 配置 SPI 硬體單元
然後配置 SPI 設備,點擊右邊的加號添加一個 SPI 設備,然後配置該 SPI 設備的波特率,片選引腳,片選極性,採樣數據的邊緣等,具體的配置選項如圖 3.6 所示。
圖 3.5 配置 SPI 設備
圖 3.6 SPI 設備配置選項
- SpiBaudrate:用於配置該 SPI 設備的波特率
- SpiCsIdentifier:用於選擇使用哪個片選引腳
- SpiCsPolarity:用於配置片選信號的極性
- SpiCsSelection:用於選擇使用硬體片選還是 GPIO 片選
- SpiDataShiftEdge:用於選擇 SPI 數據的採樣邊緣,LEADING 為第一個邊緣,TRAILING 為第二個邊緣
- SpiHwUnit:用於選擇該 SPI 設備使用哪個 SPI 控制器
- SpiShiftClockIdleLevel:用於配置時鐘空閒狀態的電平
- SpiTimeClk2Cs:用於配置 CS 有效到時鐘產生的時間,單位為秒,範圍為 0~0.0001 秒
- SpiTimeClk2CsEnd:用於配置時鐘信號結束到 CS 無效的時間,單位為秒,範圍為 0~0.0001 秒
接著添加並配置 SPI 的 Job,點擊右邊的加號符號進行 Job 的添加,這裡 SpiJobId 按照順序遞增就好,SpiJobPriority 為 Job 的優先級,配置範圍為 0 ~ 3,最後將該 Job 跟 SPI 設備進行綁定。
圖 3.7 添加 SPI 的Job 並配置
接著添加並配置 SPI Channel,如下圖所示,這裡添加了兩個 Channel。
圖 3.8 添加 SPI Channel 並配置
圖 3.9 SPI Channel 的配置參數
如圖 3.9 所示,具體配置以下參數:
- SpiChannelId:通道 ID,按照順序遞增就好
- SpiChannelType:配置 Channel 的類型,EB 為使用外部 Buffer,IB 為使用內部 Buffer,選擇 EB 的話,用戶需要自己分配空間作為 Buffer。IB 的話驅動會自動處理
- SpiDataWidth:配置數據寬度,可以配置為 4\8\16\32
- SpiEbMaxLength:配置 EB Buffer 的最大長度
- SpiIbNBuffers:配置 IB Buffer 的最大大小
- SpiTransferStart:配置傳輸的大小端,MSB 或 LSB
接著將 Job 和 Channel 進行綁定,這裡將 Job10 和 Channel33 綁定,Job11 和 Channel34 綁定。
圖 3.10 將 Job 和 Channel 進行綁定
最後新增 Sequence 並且將 Sequence 和 Job 進行綁定,這裡我們將 Sequence6 和 Job10 和 Job11 進行綁定,如下圖所示。到此則完成了 SPI 模塊的所有配置。
圖 3.11 將 Sequence 和 Job 進行綁定
四、 實際操作
配置完了以後,打開 MCAL 的工程,我們需要對代碼進行修改,主要修改 spi_test.c文件,具體修改如下圖所示。
圖 4.1 定義緩衝區
定義好緩存區後,我們對緩存區進行初始化,將發送緩存區的值配置為 0x55 和 0xAA。
圖 4.2 初始化緩衝區
初始化好緩衝區後,因為我們 Channel 的類型是配置為 EB 的,因此我們需要調用 Spi_SetupEB() 接口將我們定義的緩存設置為 EB 緩存,並指定對應的 Channel。最後我們直接調用 Spi_AsyncTransmit() 接口啟動 SPI 傳輸即可,傳參為 SequenceId。
圖 4.3 設置 EB 並且啟動傳輸
按照以上修改完代碼後,重新編譯工程並下載到板子,重新上下電運行。
圖 4.4 運行測試用例
輸入 “runcase 1800”運行 SPI 的測試例程,同時用邏輯分析儀抓取 SPI 的波形,抓取的波形如下圖所示。從圖中可以看到總共發送了兩個 Job,Job10 和 Job11,發送的數據也是一致的。
圖 4.5 抓取的 SPI 波形
五、 使用注意事項
配置 Spi 模塊時,需要注意以下事項:
- SPI 的 SCLK 引腳的上下拉配置需要和 SPI 中配置的 Clock 空閒電平一致,SS 引腳的上下拉及初始電平狀態需要根據 CS 的極性來配置,如果 CS 的極性為高電平,那麼 SS 引腳應配置為下拉並且初始化電平為低電平。
- 同一個 Job 不能在多個 Sequence 之間共享
- JobId,SeqId,ChannelId,配置的時候需要全局唯一,且從 0 開始連續編號
- Slave 啟動 DMA 時,對應 DMA 通道的中斷優先級需要和 Slave 對應控制器的中斷優先級相同,避免出現競爭。
六、 參考資料
1.《SemiDrive_E3_MCAL_User_Guide_Rev03.00.pdf》,2023.08
評論