NXP实战笔记(十二):32K3xx基于RTD-SDK在S32DS上配置LPSPI(同步、异步、DMA、主机、从机、中断、轮询)

本文详细介绍了如何在S32DS上利用RTD-SDK配置NXP S32K3的LPSPI模块,涵盖主从机引脚、时钟、中断、DMA设置,以及代码实现,特别强调了在使用DMA时的数据区域要求和主机从机调度策略。
摘要由CSDN通过智能技术生成

目录

1、概述

2、RTD-SDK配置

2.1、配置目标

2.2、主、从机引脚配置

2.3、时钟配置

2.4、LPSPI配置

2.5、中断配置

2.6、DMA配置(使用DMA才会配置)

2、dma Logic Instance

2.7、RM配置(使用DMA的情况下必须配置此选项)

3、代码实现


1、概述

        S32K3_低功耗LPSPI轮询、中断、同步、异步、DMA等传输方式。

        所有的LPSPI支持最大15MHz数据波特率在增强型管脚上,最大7.5MHz在标准管脚上,高性能的SPI0在回环模式下支持20M速率,普通模式15M。K3系列MCU具有6个独立的SPI模块,序号为SPI0-5。所有SPI均支持DMA。一帧数据可以由一个字或多个字组成,一个字32bit,帧的最小传输长度为4bit,传输FIFO4个字,也就是128bit,发送也有128bit的FIFO。

        可以在master模式下精细化调整SPI同步时钟脉冲的时频特征,如占空比,有效延迟时间。在半双工或者数据匹配功能上支持发送与接收掩码。支持半双工并行传输,允许1/2/4线并行传输, SPI0支持8线传输,可在一定程度上模拟QSPI;

        LPSPI的时钟选择:LPSPI0时钟选择与其他模块不太一样。高型能的SPI0以外设桥平台时钟AIPS_PLAT_CLK为总线时钟源,其他SPI以外设桥时钟作为总线时钟源;总线时钟源输入SPI后,根据SPI预分频值得到用于度量时序参数的功能时钟,最后由功能时钟分频得到输出的SPI同步时钟信号SCK;根据时钟源的配置SPI0回环模式下支持20M波特率,普通引脚下15M;其他SPI模块回环模式下15M,普通模式下7.5M;

        低功耗SPI模块硬件功能框图如右图所示,整个模块按功能可分为4部分;

        1.控制逻辑:负责管理模块工作参数与通信参数,通过配置寄存器与TXFIFO写入参数;

        2. 移位寄存器:将传输数据移出到总线与将数据移入RXFIFO;

        3.FIFO:分为两类,发送FIFO与接收FIFO,总共4字深度。其中传输命令字也通过TXFIFO写入控制逻辑;

        4.SPI外部接口:连接引脚与IO信号;

传输命令字

        为在适应不同的应用场景并在传输中灵活的进行参数修改, K3_LPSPI使用传输命令寄存器TCR存储传输参数,也被称为命令字。该寄存器可为要传输的帧定义不同的属性,包括时钟相位和极性、 PCS引脚选择切换、帧长度等通信参数等。该寄存器的某些位字段可以在传输中动态更改,而无需重新配置所有SPI模块配置。这允许为不同的从机芯片重新配置通信参数,适应多变的应用场景。

        值得注意的是,对传输命令寄存器TCR的修改需要执行32bit写操作,修改的命令字会被送入RX FIFO中,这可能与收到的数据混在一起。所以强烈建议在帧边界或者通信完成后(即模块处于空闲状态)再进行更新命令字的操作。

2、RTD-SDK配置

2.1、配置目标

  • 18
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

剑从东方起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值