TC264學習筆記 帶DMA的SPI通信
文章目錄
- TC264學習筆記 帶DMA的SPI通信
- 前言
- 一.學習建議
- 二.初始化
- 2.1相關引數配置與初始化
- 2.2添加中斷服務函式
- 2.3模塊初始化
- 2.4SPI通道初始化
- 三.資料收發
前言
最近學習英飛凌的TC264相關知識,在使用時需要用到帶DMA的SPI通信,但是逐飛和龍邱等主流的庫當中的SPI都沒有使用DMA功能,于是去學習iLLD庫,由于是全英文的,并且網上相關資料太少,在學習時踩了不少坑,這里SPI協議、DMA之類的基礎知識就不講了,筆者對單片機了解不是很透徹,下面內容中可能有許多錯誤,望讀者指正,
一.學習建議
1.1使用TC264的iLLD庫的時候,首先使用有道翻譯之類的軟體進行翻譯,看的時候同時對比英文版和中文版,只看機翻可能會導致部分代碼被翻譯了或者理解出錯,
1.2iLLD例程中提到的頭檔案包含只講了這個頭檔案本身,在呼叫某些函式要注意一下添加相應的頭檔案,
1.3iLLD例程中IfxCpu_Irq_installInterruptHandler這個函式是否呼叫和中斷管理模式(?)有關,在龍邱和逐飛的庫中無需呼叫,
二.初始化
2.1相關引數配置與初始化
宏定義
#define SPI_BUFFER_SIZE //發送長度
#define BAUD //設定波特率
//中斷優先級 設定時主要不要沖突
#define IFX_INTPRIO_QSPI0_TX 99 // DMA channel 1
#define IFX_INTPRIO_QSPI0_RX 100 // DMA channel 2
#define IFX_INTPRIO_QSPI0_ER 0x30
#define IFX_INTPRIO_DMA_CH1 101
#define IFX_INTPRIO_DMA_CH2 102
首先為收發定義兩個陣列,在發送時請直接呼叫發送陣列,以減少CPU的占用,
//為資料傳輸宣告全域傳輸和接識訓沖區
uint8 spiTxBuffer [SPI_BUFFER_SIZE];
uint8 spiRxBuffer [SPI_BUFFER_SIZE];
設定相關變數
IfxQspi_SpiMaster spi;
IfxQspi_SpiMaster_Channel spiChannel;
IfxQspi_SpiMaster_ChannelConfig spiMasterChannelConfig;
IfxQspi_SpiMaster_Config spiMasterConfig;
2.2添加中斷服務函式
IFX_INTERRUPT(qspi0TxISR, 0, IFX_INTPRIO_QSPI0_TX)
{
IfxQspi_SpiMaster_isrTransmit(&spi);
}
IFX_INTERRUPT(qspi0RxISR, 0, IFX_INTPRIO_QSPI0_RX)
{
IfxQspi_SpiMaster_isrReceive(&spi);
}
IFX_INTERRUPT(qspi0DmaTxISR, 0, IFX_INTPRIO_DMA_CH1 )
{
IfxQspi_SpiMaster_isrDmaTransmit(&spi);
}
IFX_INTERRUPT(qspi0DmaRxISR, 0, IFX_INTPRIO_DMA_CH2)
{
IfxQspi_SpiMaster_isrDmaReceive(&spi);
}
IFX_INTERRUPT(qspi0ErISR, 0, IFX_INTPRIO_QSPI0_ER)
{
IfxQspi_SpiMaster_isrError(&spi);
}
2.3模塊初始化
//創建模塊配置
IfxQspi_SpiMaster_initModuleConfig(&spiMasterConfig, &MODULE_QSPI3); //注意 改模塊時這里也要改 例程中為MODULE_QSPI0
//設定所需的模式和最大波特率
spiMasterConfig.base.mode = SpiIf_Mode_master; //主機
spiMasterConfig.base.maximumBaudrate = 10000000;
// ISR優先級和中斷目標(帶有Dma使用)
spiMasterConfig.base.txPriority = IFX_INTPRIO_DMA_CH1;
spiMasterConfig.base.rxPriority = IFX_INTPRIO_DMA_CH2;
spiMasterConfig.base.erPriority = IFX_INTPRIO_QSPI0_ER;
//dma配置
spiMasterConfig.dma.txDmaChannelId = IfxDma_ChannelId_1;
spiMasterConfig.dma.rxDmaChannelId = IfxDma_ChannelId_2;
spiMasterConfig.dma.useDma = 1;
//引腳配置
const IfxQspi_SpiMaster_Pins pins = {
&IfxQspi3_SCLK_P33_11_OUT , IfxPort_OutputMode_pushPull, // SCLK 例程為IfxQspi0_SCLK_P20_11_OUT
&IfxQspi3_MTSR_P33_12_OUT, IfxPort_OutputMode_pushPull, // MTSR 例程為IfxQspi0_MTSR_P20_14_OUT
&IfxQspi3_MRSTD_P33_13_IN , IfxPort_InputMode_pullDown, // MRST 例程為IfxQspi0_MRSTA_P20_12_IN
IfxPort_PadDriver_cmosAutomotiveSpeed3 // pad driver mode
};
spiMasterConfig.pins = &pins;
//初始化模塊
IfxQspi_SpiMaster_initModule(&spi, &spiMasterConfig);
/*安裝中斷處理器 不使用
* IfxCpu_Irq_installInterruptHandler (&qspi0TxISR IFX_INTPRIO_QSPI0_TX);
* IfxCpu_Irq_installInterruptHandler (&qspi0RxISR IFX_INTPRIO_QSPI0_RX);
* IfxCpu_Irq_installInterruptHandler (&qspi0ErISR IFX_INTPRIO_QSPI0_ER);
* IfxCpu_enableInterrupts ();
*/
2.4SPI通道初始化
//創建通道配置
IfxQspi_SpiMaster_initChannelConfig(&spiMasterChannelConfig, &spi);
//設定該通道的波特率
spiMasterChannelConfig.base.baudrate = BAUD;
//選擇引腳配置
const IfxQspi_SpiMaster_Output slsOutput = {
&IfxQspi3_SLSO7_P33_7_OUT, //cs 例程為IIfxQspi0_SLSO7_P33_5_OUT
IfxPort_OutputMode_pushPull,
IfxPort_PadDriver_cmosAutomotiveSpeed1
};
spiMasterChannelConfig.sls.output = slsOutput;
spiMasterChannelConfig.mode = IfxQspi_SpiMaster_Mode_short;
//初始化通道
IfxQspi_SpiMaster_initChannel(&spiChannel, &spiMasterChannelConfig);
至此,初始化完成,
三.資料收發
不需要發送的資料或者收到的資料使用NULL_PTR:
//發送和接收資料流:
//等待前一個資料流的傳輸完成
while(IfxQspi_SpiMaster_getStatus(&spiChannel) == SpiIf_Status_busy);
//接收新流
IfxQspi_SpiMaster_exchange(&spiChannel, spiTxBuffer, spiTxBuffer, SPI_BUFFER_SIZE);
//只發送,丟棄接收到的資料:
//等待前一個資料流的傳輸完成
while(IfxQspi_SpiMaster_getStatus(&spiChannel) == SpiIf_Status_busy);
//發送新流
IfxQspi_SpiMaster_exchange(&spiChannel, &spiTxBuffer[i], NULL_PTR, SPI_BUFFER_SIZE);
//只接收
//等待前一個資料流的傳輸完成
while(IfxQspi_SpiMaster_getStatus(&spiChannel) == SpiIf_Status_busy);
//接收新流
IfxQspi_SpiMaster_exchange(&spiChannel, NULL_PTR, &spiRxBuffer[i], SPI_BUFFER_SIZE);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/254795.html
標籤:區塊鏈
上一篇:Docker中文亂碼
下一篇:uni-app 小程式雙擊事件
