S32DS S32K312 LPSPI + DMA配置异步SPI

开发环境:S32DS V3.4

RTD版本:S32K3XX 2.0.3

一、配置LPSPI的Pin脚

首先配置SPI的Pin脚,此处使用的是LPSPI_1

       LPSPI_1与Pin脚的对应关系

pin脚方向

Pin名字配置方向
lpspi_pcs(片选)OUTPUT
lpspi_sck(时钟)OUTPUT
lpspi_sin(主机输入)INPUT
lpspi_sout(主机输出)OUTPUT

二、配置Drivers中的Lpspi模块

SpiDriver的配置

SpiDriver的配置

SpiBaudrate:配置的该路SPI的波特率。

SpiCsIdentifier:配置的该路SPI的片选ID,此处ID对应配置Pin脚时lpspi_pcs后的下表(本工程此处为PCS3)

SpiHwUnit:配置该路SPI对应的SPI硬件单元ID,本工程配置为Lpspi1,因此配置为CSIB1

SpiDataWidth:Spi数据宽度

SpiDefaultData:SPI通信的默认数据

SpiTransferStart:SPI传输数据的端序

SpiGeneral的配置

SpiGlobalDmaEnable:勾选以使能DMA

SpiPhyUnitMapping:将该配置Mapping到某一路Spi,此工程配置为Spi1,遂选择LPSPI_1

SpiPhyUnitAsyncUseDma:勾选异步使用DMA选项,开启DMA配置

对应的Tx和Rx的DMA通道在后续配置。

三、配置Drivers中的Dma_Ip模块

在Drivers中添加Dma_Ip模块。

配置SPI_Tx的DMA通道

配置DMA->Specific Configuration->Dma Logic Channel

将Name修改为容易辨识的名字:如SPIx_用途_Tx/Rx的形式

Hardware Instance:此处配置为硬件节点0

Hardware Channel:此处配置为硬件通道0

Interrupt Callback:此处必须使用要使用的Lpspi中断Dma处理函数。

Error Interrupt Callback:DMA error中断函数,根据需求决定是否需要配置(需要用户实现该callback)

配置DMA->Specific Configuration->Dma Logic Channel->Configuration->Global

勾选Enable DMAMUX Source

DMAMUX Source:选择DMA_IP_REQ_MUX0_LPSPI1_TX

勾选Enable Error Interruot

DMA的Rx通道类似

在Drivers中添加Cache_Ip模块

勾选Enable CACHE Support

四、配置Drivers中的IntCtrl_Ip模块

在Driver中添加IntCtrl_Ip模块

配置IntCtrl_Ip->Interrupt Controller

配置DMA模块的中断

由于在配置DMA Tx和Rx通道时,选择的是节点0的ch0和ch1

所以此处使能DMATCD0_IRQn和DMATCD1_IRQn

然后再后边配置中断的优先级为9,此处根据项目调整

配置IntCtrl_Ip->Generic Interrupt Settings

最后在SPI配置中关联DMA的Tx和Rx通道。

  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我无法确定您需要的是哪个厂家的S32K312芯片的Lpspi通信例子。但是,我可以为您提供一个通用的Lpspi通信例子,您可以根据自己的需要进行修改。 ```c #include "fsl_lpspi.h" #include "fsl_debug_console.h" #define EXAMPLE_LPSPI_MASTER_BASEADDR (LPSPI1) #define EXAMPLE_LPSPI_MASTER_IRQN (LPSPI1_IRQn) #define EXAMPLE_LPSPI_MASTER_IRQHandler (LPSPI1_IRQHandler) #define EXAMPLE_LPSPI_MASTER_PCS_FOR_INIT (kLPSPI_Pcs0) #define EXAMPLE_LPSPI_MASTER_PCS_FOR_TRANSFER (kLPSPI_MasterPcs0) #define EXAMPLE_LPSPI_DEALY_COUNT 0xfffffU #define TRANSFER_SIZE 64U /*! Transfer dataSize */ /******************************************************************************* * Prototypes ******************************************************************************/ /* LPSPI user callback */ void LPSPI_MasterUserCallback(LPSPI_Type *base, lpspi_master_handle_t *handle, status_t status, void *userData); /******************************************************************************* * Variables ******************************************************************************/ uint8_t masterRxData[TRANSFER_SIZE] = {0}; uint8_t masterTxData[TRANSFER_SIZE] = {0}; volatile bool isMasterTransferCompleted = false; lpspi_master_handle_t g_m_handle; SemaphoreHandle_t lpspi_sem; /******************************************************************************* * Code ******************************************************************************/ void EXAMPLE_LPSPI_MASTER_IRQHandler(void) { LPSPI_MasterTransferHandleIRQ(EXAMPLE_LPSPI_MASTER_BASEADDR, &g_m_handle); } void LPSPI_MasterUserCallback(LPSPI_Type *base, lpspi_master_handle_t *handle, status_t status, void *userData) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; if (status == kStatus_Success) { PRINTF("LPSPI master transfer completed successfully.\r\n"); } else { PRINTF("LPSPI master transfer completed with error.\r\n"); } isMasterTransferCompleted = true; xSemaphoreGiveFromISR(lpspi_sem, &xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } /*! * @brief Main function */ int main(void) { lpspi_master_config_t masterConfig; uint32_t sourceClock = 0U; lpspi_transfer_t masterXfer; BOARD_InitPins(); BOARD_BootClockRUN(); BOARD_InitDebugConsole(); PRINTF("LPSPI one board master example started!\r\n"); /* Initialize LPSPI master */ /* * masterConfig->baudRate_Bps = 500000U; * masterConfig->bitsPerFrame = 8U; * masterConfig->cpol = kLPSPI_ClockPolarityActiveHigh; * masterConfig->cpha = kLPSPI_ClockPhaseFirstEdge; * masterConfig->direction = kLPSPI_MsbFirst; * masterConfig->pinCfg = kLPSPI_SdiInSdoOut; * masterConfig->dataOutConfig = kLpspiDataOutRetained; * masterConfig->txFifoWatermark = 0; * masterConfig->rxFifoWatermark = 0; * masterConfig->txDmaSrc = kLpspiDmaSrcDMA; * masterConfig->rxDmaSrc = kLpspiDmaSrcDMA; * masterConfig->whichPcs = kLPSPI_Pcs0; * masterConfig->polarityFlags = kLPSPI_MasterPolarity0; * masterConfig->isPcsContinuous = false; */ LPSPI_MasterGetDefaultConfig(&masterConfig); masterConfig.baudRate_Bps = 500000U; masterConfig.whichPcs = EXAMPLE_LPSPI_MASTER_PCS_FOR_INIT; sourceClock = LPSPI_MASTER_CLK_FREQ; LPSPI_MasterInit(EXAMPLE_LPSPI_MASTER_BASEADDR, &masterConfig, sourceClock); /* Create Semaphore for communication*/ lpspi_sem = xSemaphoreCreateBinary(); /* Set up transfer */ masterXfer.txData = masterTxData; masterXfer.rxData = masterRxData; masterXfer.dataSize = TRANSFER_SIZE; masterXfer.configFlags = kLPSPI_MasterPcsContinuous | kLPSPI_MasterByteSwap; /* Start master transfer */ isMasterTransferCompleted = false; LPSPI_MasterTransferNonBlocking(EXAMPLE_LPSPI_MASTER_BASEADDR, &g_m_handle, &masterXfer); /* Wait for transfer to complete */ if (xSemaphoreTake(lpspi_sem, portMAX_DELAY) == pdTRUE) { PRINTF("LPSPI master transfer completed.\r\n"); } /* Deinit the LPSPI. */ LPSPI_Deinit(EXAMPLE_LPSPI_MASTER_BASEADDR); while (1) { } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值