This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/PROCESSOR-SDK-AM335X:McSPI 接收问题

Guru**** 2927270 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/667250/rtos-processor-sdk-am335x-mcspi-receive-issue

器件型号:PROCESSOR-SDK-AM335X

工具/软件:TI-RTOS

系统设置:

GCC:GCC-ARM-NONE - eabi-6-2017-Q1-update
BIOS:BIOS_6_52_00_12
NDK:NDK_2_26_00_08
PDK:pdk_am335x_1_0_9
PSDK:PROCESSOR_SDK_RTOS_AM335x_4_02_00_09
XDC:xdctools_3_50_03_33_core
Sitara:Sitara_1_02_00_00
EDMA:EDMA3_LLD_2_12_05_30B

问题:

我以13MHz 的频率连续接收 SPI 数据、并通过 FIFO 和 DMA 将 Beagle Bone Black 作为从属设备。 一切都可以正常工作大约10分钟。 但是、FIFO 数据似乎已损坏。 对我来说、它看起来像是位移。 我将 FIFORX 配置为16、因为每次传输都是16位值。 我没有在每次事务后完全关闭 SPI 和 DMA 通道以提高性能。 我只是在 DMA 回调例程中调用 SpiStartTransfer 函数来触发下一个传输。 是否有任何提示、为什么这在几分钟后失败?

update_1:将波特率降低至5MHz 没有改变任何东西。 数据每200us 发送一次、因此每次传输之间的时间应该足够。 降低至5MHz 仅用于实际应用中的测试目的我需要它以13MHz 的频率工作、但第一步是使它以较低的要求工作。

代码提取:

静态空 SpiEdmaRxParamInit()
{
/*用接收特定信息填写参数集。*/

/* srcAddr 保存 SPI Rx FIFO 的地址。*/
rxparam.srcAddr = SOC_SPI_1_regs + MCSPI_CHRX (0);

/* destAddr 是名为 buffer 的内存位置的地址。*/
rxParam.destAddr =(unsigned int) rxPtr;

/* aCnt 保存数组中的字节数。*/
rxparam.aCnt = 2;

/* bcnt 保存要传输的此类数组的数量。*/
rxparam.bcnt = FIFORX >> 1;

/* ccnt 保存要传输的 aCnt*bcnt 字节的帧数。*/
rxparam.ccnt = DATALENGTH / rxparam.bcnt;

/*不应递增 srcBidx、因为它是一个 h/w 寄存器。*/
rxparam.srcBIdx = 0;

/*每个字节的 destBidx 应该递增。*/
rxParam.destBIdx = rxParam.aCnt;

/*同步传输模式。 *
/*使用异步模式后,srCIdx 和 destCIdx 均设为零。*/
rxparam.srcCIdx = 0;
/*TODO:rxtrig 或0*/
rxParam.destCIdx = FIFORX;

/*不使用 EDMA3中的链接传输。*/
rxparam.linkAddr = 0xFFFF;

rxparam.bCntReload = rxParam.bCnt;

rxparam.opt &= 0xFFFFFFFCU;
rxparam.opt &= 0xFFFFFFU;
rxparam.opt |= MCSPI_EDMA3CC_opt_SYNC_AB;
rxparam.opt &=(~MCSPI_OPT_TCC_MASK);
/*使用 tccNum.*/在选项中设置 TCC 字段
rxparam.op=((EDMA3_CHA_MCSPI1_CH0_RX << MCSPI_OPT_CCT_SHIFT)
和 MCSPI_OPT_TCC_MASK);

/* EDMA3中断被启用并且中间中断被禁用。*/
rxparam.opT|=(1 << MCSPI_OPT_TCINTE_SHIFT);
} 

静态空 SpiStartTransfer()


   McSPIWordCountSet (SOC_SPI_1_regs、DATALENGTH);

   /*写入 Rx 参数集*/
   EDMA3_DRV_setPaRAM ((EDMA3_DRV_Handle) rxEdmaHandle、
   EDMA3_CHA_MCSPI1_CH0_RX、
                      &rxParam);

   /*对 RX 端进行编程*/
   EDMA3_DRV_enableTransfer (((EDMA3_DRV_Handle) rxEdmaHandle、
   EDMA3_CHA_MCSPI1_CH0_RX、
                            EDMA3_DRV_TRIG_MODE_EVENT);

   /*为事务启用 McSPI DMA
    * MCSPI_CH (chNum) CONF ->用于接收 DMA 的 DMAR 位
    *
   McSPIDMAEnable ((uint32_t)(SOC_SPI_1_regs)、((uint32_t) MCSPI_DMA_RX_EVENT)、
   MCSPI_CH_NUM);

   /*启用通道*/
   McSPIChannelEnable ((uint32_t)(SOC_SPI_1_regs)、MCSPI_CH_NUM);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 David:

    您是否基于支持 DMA 的示例 MCSPI_SlaveMode_SlaveExample_bbbAM335x_armExampleProject 构建应用?

    Lali
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Lali、

    我根据该示例创建了自己的 SPI 驱动器、具有更好的性能。 如果我不想在一段时间后发生 FIFO 移位、我需要重新初始化 SPI DMA 配置。 由于我的性能要求、我不想这么做、但我现在有一个解决方案来满足我的需求。

    David