查看: 8472|回复: 2

[求助] RT1052使用LPSPI时,中断和DMA方式如何处理

[复制链接]

该用户从未签到

1

主题

3

帖子

0

新手上路

Rank: 1

积分
32
最后登录
2020-9-23
发表于 2020-7-8 10:51:52 | 显示全部楼层 |阅读模式
我想通过DMA方式处理操作SPI,但没有找到相关的例程.于是参考串口的DMA例程,配置了SPI和DMA,程序如下:

  1.     CLOCK_SetMux(kCLOCK_LpspiMux, 1);
  2.     CLOCK_SetDiv(kCLOCK_LpspiDiv, 7);

  3.     masterConfig.baudRate = 500000;
  4.     masterConfig.bitsPerFrame = 8;
  5.     masterConfig.cpol = kLPSPI_ClockPolarityActiveHigh;
  6.     masterConfig.cpha = kLPSPI_ClockPhaseFirstEdge;
  7.     masterConfig.direction = kLPSPI_MsbFirst;

  8.     masterConfig.pcsToSckDelayInNanoSec = 1000000000 / masterConfig.baudRate;
  9.     masterConfig.lastSckToPcsDelayInNanoSec = 1000000000 / masterConfig.baudRate;
  10.     masterConfig.betweenTransferDelayInNanoSec = 1000000000 / masterConfig.baudRate;

  11.     masterConfig.whichPcs = kLPSPI_Pcs0;
  12.     masterConfig.pcsActiveHighOrLow = kLPSPI_PcsActiveLow;

  13.     masterConfig.pinCfg = kLPSPI_SdiInSdoOut;
  14.     masterConfig.dataOutConfig = kLpspiDataOutRetained;

  15.     LPSPI_MasterInit(LPSPI3, &masterConfig, CLOCK_GetFreq(kCLOCK_Usb1PllPfd0Clk) / (7 + 1U));
复制代码
  1.    edma_transfer_config_t transferConfig;
  2.     edma_config_t userConfig;
  3. #if defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT
  4.     DMAMUX_Init(DMAMUX);
  5.     DMAMUX_SetSource(DMAMUX,0,kDmaRequestMuxLPSPI3Tx);
  6.     DMAMUX_SetSource(DMAMUX,1,kDmaRequestMuxLPSPI3Rx);
  7.     DMAMUX_EnableChannel(DMAMUX,0);
  8.     DMAMUX_EnableChannel(DMAMUX,1);
  9. #endif
  10.     /* Configure EDMA one shot transfer */
  11.     /*
  12.      * userConfig.enableRoundRobinArbitration = false;
  13.      * userConfig.enableHaltOnError = true;
  14.      * userConfig.enableContinuousLinkMode = false;
  15.      * userConfig.enableDebugMode = false;
  16.      */
  17.     EDMA_GetDefaultConfig(&userConfig);
  18.     EDMA_Init(DMA0, &userConfig);
  19.     EDMA_CreateHandle(&g_EDMA_Handle_0, DMA0, 0);
  20.     EDMA_CreateHandle(&g_EDMA_Handle_1, DMA0, 1);
  21.    
  22.     LPSPI_MasterTransferCreateHandleEDMA(LPSPI3,\
  23.                                         &g_LPSPI3_Master_Edma_handle,\
  24.                                         LPSPI3_Master_Edma_Transfer_Callback,\
  25.                                         0,\
  26.                                         &g_EDMA_Handle_0,\
  27.                                         &g_EDMA_Handle_1);
复制代码

然后在函数中调用LPSPI_MasterTransferEDMA函数进行发送,但是没有在对应的管脚测到相关的信号,并且第二次调用该发送函数时,返回kStatus_LPSPI_Busy.目前没有找到具体原因,希望有相关经验的大佬给指条明路.

另外,还尝试用第一部分的初始化函数初始化之后,调用
  1.     LPSPI_MasterTransferCreateHandle(LPSPI3,&g_spi_master_handle,LPSPI3_Master_Transfer_Callback,0);
复制代码
然后在主循环中调用LPSPI_MasterTransferNonBlocking发送数据,结果程序卡死.在看驱动程序时,在fsl_lpspi.c文件的最后部分,看到有如下代码:
  1. #if defined(LPSPI3)
  2. void LPSPI3_DriverIRQHandler(void)
  3. {
  4.     assert(s_lpspiHandle[3]);
  5.     LPSPI_CommonIRQHandler(LPSPI3, s_lpspiHandle[3]);
  6. }
  7. #endif
复制代码
并且在.s文件中有如下定义:
  1. LPSPI3_IRQHandler\
  2.                 PROC
  3.                 EXPORT  LPSPI3_IRQHandler         [WEAK]
  4.                 LDR     R0, =LPSPI3_DriverIRQHandler
  5.                 BX      R0
  6.                 ENDP
  7. *******
  8. Default_Handler\
  9.                 PROC
  10.                 EXPORT  LPSPI3_DriverIRQHandler         [WEAK]
复制代码
根据百度搜到前人经验,推测SPI中断函数如果没有自己重写中断函数,会默认调用LPSPI3_DriverIRQHandler函数,不知道这样理解是否正确.
尝试自己重写中断函数,能够正常进入自定义中断函数,但是在第二次发送时同样会返回kStatus_LPSPI_Busy状态,并且虽然能够发送,但是发送的数据经示波器查看并不是我想要发送的数据.


以上,是我在调试SPI的过程中碰到的还未能处理的问题,如果有朋友碰到过类似情况或是有相关经验,能够指点一二,谢谢.
回复

使用道具 举报

该用户从未签到

734

主题

6393

帖子

0

超级版主

Rank: 8Rank: 8

积分
26002
最后登录
2025-10-24
发表于 2020-7-9 11:52:27 | 显示全部楼层
SDK中的DMA配置不太友好,参数和函数调用有时过于复杂了,但是逻辑搞清楚后配置起来会很简单,建议楼主先创建一个只作发生的DMA与LPSPI工程,然后慢慢丰富代码。
如何还未成功,你可以介绍一下代码移植过程,我这边帮忙看看
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

3

帖子

0

新手上路

Rank: 1

积分
32
最后登录
2020-9-23
 楼主| 发表于 2020-7-9 14:57:00 | 显示全部楼层
小恩GG 发表于 2020-7-9 11:52
SDK中的DMA配置不太友好,参数和函数调用有时过于复杂了,但是逻辑搞清楚后配置起来会很简单,建议楼主先创 ...

谢谢,目前已经解决中断方式无法发送的问题,似乎是由于main.c中缺少包含fsl_common.h导致的.DMA方式我后面再试下.
另外,例程中有没有关于USB操作U盘实现文件管理的例程,我没有找到相关的资料,只知道已经提供了很多底层的驱动函数,但是实在是不清楚如何调用来实现响应功能.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-10-25 04:01 , Processed in 0.130640 second(s), 20 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表