在线时间9 小时
UID3259407
注册时间2016-4-8
NXP金币0
该用户从未签到
新手上路

- 积分
- 32
- 最后登录
- 2020-9-23
|
我想通过DMA方式处理操作SPI,但没有找到相关的例程.于是参考串口的DMA例程,配置了SPI和DMA,程序如下:
- CLOCK_SetMux(kCLOCK_LpspiMux, 1);
- CLOCK_SetDiv(kCLOCK_LpspiDiv, 7);
- masterConfig.baudRate = 500000;
- masterConfig.bitsPerFrame = 8;
- masterConfig.cpol = kLPSPI_ClockPolarityActiveHigh;
- masterConfig.cpha = kLPSPI_ClockPhaseFirstEdge;
- masterConfig.direction = kLPSPI_MsbFirst;
- masterConfig.pcsToSckDelayInNanoSec = 1000000000 / masterConfig.baudRate;
- masterConfig.lastSckToPcsDelayInNanoSec = 1000000000 / masterConfig.baudRate;
- masterConfig.betweenTransferDelayInNanoSec = 1000000000 / masterConfig.baudRate;
- masterConfig.whichPcs = kLPSPI_Pcs0;
- masterConfig.pcsActiveHighOrLow = kLPSPI_PcsActiveLow;
- masterConfig.pinCfg = kLPSPI_SdiInSdoOut;
- masterConfig.dataOutConfig = kLpspiDataOutRetained;
- LPSPI_MasterInit(LPSPI3, &masterConfig, CLOCK_GetFreq(kCLOCK_Usb1PllPfd0Clk) / (7 + 1U));
复制代码- edma_transfer_config_t transferConfig;
- edma_config_t userConfig;
- #if defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT
- DMAMUX_Init(DMAMUX);
- DMAMUX_SetSource(DMAMUX,0,kDmaRequestMuxLPSPI3Tx);
- DMAMUX_SetSource(DMAMUX,1,kDmaRequestMuxLPSPI3Rx);
- DMAMUX_EnableChannel(DMAMUX,0);
- DMAMUX_EnableChannel(DMAMUX,1);
- #endif
- /* Configure EDMA one shot transfer */
- /*
- * userConfig.enableRoundRobinArbitration = false;
- * userConfig.enableHaltOnError = true;
- * userConfig.enableContinuousLinkMode = false;
- * userConfig.enableDebugMode = false;
- */
- EDMA_GetDefaultConfig(&userConfig);
- EDMA_Init(DMA0, &userConfig);
- EDMA_CreateHandle(&g_EDMA_Handle_0, DMA0, 0);
- EDMA_CreateHandle(&g_EDMA_Handle_1, DMA0, 1);
-
- LPSPI_MasterTransferCreateHandleEDMA(LPSPI3,\
- &g_LPSPI3_Master_Edma_handle,\
- LPSPI3_Master_Edma_Transfer_Callback,\
- 0,\
- &g_EDMA_Handle_0,\
- &g_EDMA_Handle_1);
复制代码
然后在函数中调用LPSPI_MasterTransferEDMA函数进行发送,但是没有在对应的管脚测到相关的信号,并且第二次调用该发送函数时,返回kStatus_LPSPI_Busy.目前没有找到具体原因,希望有相关经验的大佬给指条明路.
另外,还尝试用第一部分的初始化函数初始化之后,调用
- LPSPI_MasterTransferCreateHandle(LPSPI3,&g_spi_master_handle,LPSPI3_Master_Transfer_Callback,0);
复制代码 然后在主循环中调用LPSPI_MasterTransferNonBlocking发送数据,结果程序卡死.在看驱动程序时,在fsl_lpspi.c文件的最后部分,看到有如下代码:
- #if defined(LPSPI3)
- void LPSPI3_DriverIRQHandler(void)
- {
- assert(s_lpspiHandle[3]);
- LPSPI_CommonIRQHandler(LPSPI3, s_lpspiHandle[3]);
- }
- #endif
复制代码 并且在.s文件中有如下定义:
- LPSPI3_IRQHandler\
- PROC
- EXPORT LPSPI3_IRQHandler [WEAK]
- LDR R0, =LPSPI3_DriverIRQHandler
- BX R0
- ENDP
- *******
- Default_Handler\
- PROC
- EXPORT LPSPI3_DriverIRQHandler [WEAK]
复制代码 根据百度搜到前人经验,推测SPI中断函数如果没有自己重写中断函数,会默认调用LPSPI3_DriverIRQHandler函数,不知道这样理解是否正确.
尝试自己重写中断函数,能够正常进入自定义中断函数,但是在第二次发送时同样会返回kStatus_LPSPI_Busy状态,并且虽然能够发送,但是发送的数据经示波器查看并不是我想要发送的数据.
以上,是我在调试SPI的过程中碰到的还未能处理的问题,如果有朋友碰到过类似情况或是有相关经验,能够指点一二,谢谢.
|
|