SemiDrive E3 MCAL 開發系列(7)– Spi 模塊的使用

一、  概述

本文將會介紹 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

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論