工具/软件: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);
}