開發板 |
代碼包 |
示例 SPI |
撥碼 |
SD103_E3_GATEWAY_EPOWERTRAIN_A03_041 |
MCAL3.0+PATCH 4676506 |
SPI7 |
1110 |
表 (1)
二、測試過程
1、原理圖
圖 (1)
圖 (2)
開發板上貼 R1311、R1312、R1313、R1314;SPI7 的四個引腳引到 J2305.
2、Datasheet
Pin Name |
MUX |
Moudule |
Function |
Default |
GPIO_S10 |
MUX3 |
SPI7 |
SS0 |
|
GPIO_S11 |
MUX3 |
SPI7 |
SCLK |
|
GPIO_S12 |
MUX3 |
SPI7 |
MISO |
|
GPIO_S13 |
MUX3 |
SPI7 |
MOSI |
|
表 (2)來源:表 Pin Multiplexing of Digital GPIO Pins in Safety Domain
3、配置 MCAL
3.1、Mcu
圖 (3)
3.2、Port
圖 (4)
圖 (5)
3.3、Spi
圖 (6)
SpiEbMaxLenth 等同於 spi_test.c 中的 SPI_BUFFER_SIZE_CHANNEL_x。
SpiChannel:
- SpiChannId:全局唯一的數據 Buffer 識別號,配置過程必須保持這個編號連續且單調遞增,生成時會根據 BufferId 編號排序。
- SpiChannelType:數據 Buffer 類型主要有兩種 IB 和 EB 區別和意義如下:
IB:內部 Buffer,由 Spi 驅動內部定義生成對應的數組,用戶在數據傳輸前需先通過 WriteIB 接口將數據由用戶提供的內存區域拷貝到驅動內部的 Buffer 中,然後在數據傳輸完成後通過 ReadIB 將數據從 Spi 驅動內部拷貝到用戶目的內存區域。
EB:外部 Buffer 這裡的外部概念強調是 Spi 驅動的外部,就是用戶定義的數據緩存區,數據傳輸前必須通過 Setup_EB 接口設置外部數據緩存區地址及長度信息;數據傳輸完成後接收到的數據已經直接存放在用戶指定的內存地址空間中,對比 IB 的類型的數據 Buffer 這裡少了 1-2 次數據拷貝操作,但是在使用異步傳輸時要求用戶提供的數據 Buffer 對應的內存空間在數據傳輸過程中不能有除了 Spi 驅動外的軟體寫入,要保證 Spi 驅動的獨占訪問,常見的錯誤使用方式是將數據 Buffer 定義在函數體內(棧上),當接口退出後棧會被其他的上下文使用此時就會出現競爭寫棧空間導致收發的數據錯誤。
註:用戶層提供的外部 Buffer 需要注意地址對齊,使用 dma 模式時統一按 32 字節對齊;否則不使用 DMA 時按數據位寬對應對齊 4-8bits 按 1 字節對齊,9-16bits 按 2 字節對齊,16-32bits 按 4 字節對齊;並且即使不需要更新此 EB 通道的數據緩衝區地址,每次傳輸前都需要重新調用接口設置 EB Buffer 的地址信息---即使此時設置的地址可能每次都是相同的。
- SpiDataWidth:
傳輸的數據寬度,單位 bit。這裡需要說明的是內部在處理不同數據寬度的時候實際是還是按字節 (4-8bits)、雙字節(9-16bits)、字(17-32bits) 的方式來進行處理的,也就是對 EB 類型的數據 Buffer 而言,用戶也需要遵循這個規則;同一個SpiJob 下的所有數據 Buffer 的數據寬度都必須保持一致。
- SpiDefaultData:
默認發送數據,當用戶不配置時候默認為全 FF 值,具體取決於數據寬度配置。
- SpiEbMaxLenth:
僅當數據 Buffer 類型為 EB 時此選項有意義,其限制了這個數據 Buffer 允許傳輸的數據長度的最大值,實際傳輸過程傳輸的數據量可以小於這個值。
- SpiNBuffers:
僅當數據 Buffer 類型為 IB 時此選項有意義,其定義了這個數據 Buffer 的數據長度,實際傳輸時也永遠是這個長度。
- SpiTransferStart:
定義當前數據 Buffer 的 bit 序,LSB 為低 bit 優先反之為高 bit 優先;同一個 SpiJob 下的所有數據 Buffer 的比特順序都必須保持一致。
圖 (7)
圖 (8)
SpiExternalDevice:
- SpiBaudrate:單位 bps, 500000 就是 500Kbps,Master 模式最大支持到 25Mpbs@100M (當走線或對端 Slave 移出數據的時機偏晚時需要使能 Master 的 MISO 採樣延遲,以確保正確採樣 MISO 值),Slave 模式最大支持到 25Mbps@100M 最小 200K。
- SpiCsPolarity:片選信號極性。
- SpiEnableRx:是否使能接收。
- SpiHwUnit:指示此設備掛接在哪一路 SPI 控制器上 SPI1-SPI8 對應 CSIB1-CSIB8,當作為 Slave 時意義相同。
- SpiTimeClk2Cs:片選信號有效後延時多少秒(實際是以 sclk 的周期為單位)後再出 sclk 信號,對應通用概念建立時間,僅僅在使用硬體 CS 且作為 Master 模式此配置參數有意義。
- SpiTimeClk2CsEnd:傳輸結束 sclk 信號停止後延時多少秒(實際是多少個 sclk 的 clk 周期)後再驅動片選信號取消片選,對應通用概念的保持時間,僅僅在使用硬體CS且作 Master 模式此配置參數有意義。
- SpiCsViaGpio:當選擇通過軟體控制 GPIO 來驅動片選信號的情況下這裡需要配置,指定一個 GPIO 引腳作為片選信號的控制。當使用軟體控制 GPIO 來驅動片選信號時需要注意此時硬體 SS0 信號如果不特殊處理,可能會同時出現硬體驅動的片選信號 SS0 和軟體控制的 GPIO 兩個片選信號同時選中兩個外部設備從而導致通信衝突,特殊處理方式參 SpiCsPin 配置項說明。
- SpiCsIdentifier:Spi 控制器支持四個 CS 引腳信號控制,使用 0-3 對應 SS0-SS3;當 SpiCsSelection 選擇 VIA_GPIO 時,此配置項無效,但要求配置為 0。
- SpiDataShiftEdge/SpiShiftClockIdleLevel:配置 SPI 通信時序參考後續的表格。
- SpiCsSelection:配置當前設備使用的 SPI 控制器硬體控制的片選信號還是軟體通過 GPIO 驅動的。
圖 (9)
圖 (10)
圖 (11)
圖 (12)
圖 (13)
4、IAR
Spi_test.c 函數結構:
SPI_BUFFER_SIZE_CHANNEL
fifo_init;fifo_show:static void fifo_init(void* addr,uint32 val,uint32 len,uint8 width),第二個參數是 SPI 的值,共 32 位無符號整型;
Tc_spi_asny_03
Tc_spi_async_03_less
async_transmit_slave
Tc_spi_async_loop_back
Tc_spi_async_loop_back_early_cs_end
spi_loop_demo
Spi_test.c 默認不做更改。
5、硬體連接
圖 (14)
LAP-C PRO(32128M) A0 連接 GPIO_S10 做 SPI7_SS0;
LAP-C PRO(32128M) A1 連接 GPIO_S11 做 SPI7_SCLK;
LAP-C PRO(32128M) A2 連接 GPIO_S13 做 SPI7_MOSI;
LAP-C PRO(32128M) GND 連接 GPIO_S10 做 SPI7_GND;
6、SPI 測試
6.1、使用邏輯分析儀 LAP-C PRO(32128M)
圖 (15)
圖 (16) 一個 JOB 三個通道:channel_28,channel_29,channel_30
一個片選內只有一個 JOB 的內容。
channel_28:0010 1000 0010 1000 0010 1000 0010 1000
channel_29:0010 1001 0010 1001 0010 1001 0010 1001
channel_30:0011 0000 0011 0000 0011 0000 0011 0000
一個時鐘周期內傳遞一個 bit 的數據。
6.2、使用示波器(Tektronix MDO3054)
圖 (17)
圖 (18)
SS0:gpio_s10->示波器通道 1
SCLK:gpio_s11->示波器通道3
MOSI:gpio_s13->示波器通道 2
頻率 8M 如何計算得知:一個 bit 是 120ns,1/120ns≈8.333M。
圖 (19)
若 SpiChannel_28 的 SpiEbMaxLength 設為 4,則傳輸的數據是 2828=0010 1000 0010 1000。
圖 (20)
7、串口發命令
Help->listcase->runcase 1800;
圖 (21)
注1:SPI 四種模式
SpidataShiftEdge |
SpiShiftClockIdLevel |
Spi mode |
LEADING |
LOW |
MODE1 |
TRAILING |
LOW |
MODE0 |
LEADING |
HIGH |
MODE3 |
TRAILING |
HIGH |
MODE2 |
表 (3)
MODE0:時鐘線空閒時低電平,第一個跳變沿(採樣點)在第一個 bit 的中間
MODE1:時鐘線空閒時低電平,第二個跳變沿(採樣點)在第一個 bit 的中間
MODE2:時鐘線空閒時高電平,第一個跳變沿(採樣點)在第一個 bit 的中間
MODE3:時鐘線空閒時高電平,第二個跳變沿(採樣點)在第一個 bit 的中間
注2:Spi 會根據 MCU 配置支持 1,3,5 三種數量的多核場景,默認不在 ResM 進行任何配置的情況下,Spi 工作在單核模式所有的資源劃分在 SF 核心上。當有需要將不同 Spi 控制器分在不同核心上時需要在 ResM 模塊中進行配置,詳見 《SemiDrive_E3_MCAL User Guide》。
參考資料:
《E3400&E3600 Series MCU Datasheet Release 00.16》
《E3400&E3600 MCU Technical Reference Manual Release 00.12》
《SD103_E3_REF_GATEWAY_ePOWERTRAIN_A02_絲印圖》
《SD103_E3_REF_GATEWAY_ePOWERTRAIN_A02_SCH》
《SemiDrive_E3_MCAL User Guide》,適用 MCAL PTG3.0 及後續版本
歡迎在博文下方留言評論,我們會及時回復您的問題。如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com
作者:Rita Liu / 劉倩
評論