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.
你好、Delaney
我的客户也遇到了这个问题、我们之前在 E2E 主题中讨论过: 链接。
SPIA 被分配给 CPU2、并测试 SPI 内部环回以显示 DMA 设置正确。
但是、当禁用内部环回并与 SPI 从器件进行通信时、 数据地址具有 如下所示的错误偏移量、第一个字0x0001应该位于[0]中、但现在它位于[16]中:
目标字数量为80个字、SPI 以10M 为单位。
我发现这个错误数据地址偏移的根本原因是 SPI 溢出、当设置 RXFFOVF 时、数据地址偏移为16字、但当 未设置 RXFFOVF 时、数据地址偏移为0字、这是正确的。
我进行以下检查:
1.在 SPI 主器件启用数据传输之前、先初始化 DMA 并将其设置为待机模式。 问题未解决。
2.在 DSP 运行时尝试手动重置 SPI---没有 RXFFOVF、数据地址正确。
我怀疑在产生第一个导致 RXFFOVF 的 RXFFIL 时 DMA 没有就绪。
谢谢
Joe
您好、Joe。
我已将此回复移至新主题、因此我可以区分问题。
如果设置了 SPISTS.OVERRIDE_FLAG、则从器件将在 DMA 完成先前数据的传输之前发送新数据。 我不会在软件中清除标志、而是建议解决发生这种情况的更大问题、以便不会丢失数据。 几个问题:
此致、
Delaney
仅为了验证-是否仍使用 DMA_SPIARX 触发器来触发 DMA CH6传输? 并且 DMA 通道的突发大小仍与设置的 SPI RX FIFO 级别匹配?[/QUOT]是的、当代码仅运行 SPI 时、也会验证 DMA 和 SPI 合作、该函数正确而不会溢出。
[/quote][/quote]您是否为 CPU 2 DMA 启用了其他 DMA 通道? 如果是、正在使用哪个通道优先级方案(轮询或 CH1优先级)? DMA CH6可能会被阻止、等待其他通道完成其传输、因此无法及时通过数据进行传输。[/QUOT]SPI TX 有另一个 DMA5、我想这可能是重点、因为 SPI 是全双工的(如果 TX DMA 具有优先级并同时发送/接收)、可能会导致 RX 溢出。 因此、我将让客户将 DMA1用于 SPI RX 并启用 CH1优先级模式、以了解是否可以解决过流问题。
[/quote]使用的 SPI 波特率是多少? 从设备发回的数据格式是什么(逐个发送的字是否超过16个)?[/QUOT]波特率为10MHz、一个数据包中有80个字一个接一个地发送。
谢谢
Joe
你好、 Delaney
SPI+DMA Rx 问题 仍未解决。
我 、28377D CPU2进行通信 Δ I SPIA 和 dma1从主器件(28377D)读取44个字并触发 DMA 中断。
SPI 波特率为10MHz、一个数据包中有44个字逐个发送。 200us 相互发送。以下代码是 28377D :的配置
从器件 SPI 初始化代码如下:
//DSP1 To DSP 2 void InitSpia(void) { //Initial *** FIFO Length SpiaRegs.SPICCR.bit.SPISWRESET = 0; SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; SpiaRegs.SPICCR.bit.SPICHAR = 15; SpiaRegs.SPICCR.bit.HS_MODE = 0; //High Speed Mod SPIClK = 200M SpiaRegs.SPICCR.bit.SPILBK = 0; // SPI interrupts are disabled SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0; //SPI Running in slave Mode SpiaRegs.SPICTL.bit.TALK = 1; SpiaRegs.SPICTL.bit.CLK_PHASE = 0; //SpiaRegs.SPICTL.bit.SPIINTENA = 0; SpiaRegs.SPICTL.bit.SPIINTENA = 1; // Set the baud rate SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 4; // Hmode = 0 50M/5= 10M // Set FREE bit // Halting on a breakpoint will not halt the SPI SpiaRegs.SPIPRI.bit.FREE = 1; // Release the SPI from reset SpiaRegs.SPICCR.bit.SPISWRESET = 1; }
主 SPI 配置:
void InitSpia(void) { //Initial *** FIFO Length SpiaRegs.SPICCR.bit.SPISWRESET = 0; SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; SpiaRegs.SPICCR.bit.SPICHAR = 15; SpiaRegs.SPICCR.bit.HS_MODE = 0; //High Speed Mod SPIClK = 200M SpiaRegs.SPICCR.bit.SPILBK = 0; // SPI interrupts are disabled SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; //SPI Running in slave Mode SpiaRegs.SPICTL.bit.TALK = 1; SpiaRegs.SPICTL.bit.CLK_PHASE = 0; //SpiaRegs.SPICTL.bit.SPIINTENA = 0; SpiaRegs.SPICTL.bit.SPIINTENA = 1; // Set the baud rate SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 4; // Hmode = 0 50M/5 = 10M // Set FREE bit // Halting on a breakpoint will not halt the SPI SpiaRegs.SPIPRI.bit.FREE = 1; // Release the SPI from reset SpiaRegs.SPICCR.bit.SPISWRESET = 1; }
从电流和 。FIFO 级别均设置为8 μ A
从器件使用 DMA CH1连接到 RX。主器件使用 DMA CH5连接到 TX
从器件 DMA 初始化代码
{ DMACH1AddrConfig(DMADest,&SpiaRegs.SPIRXBUF); DMACH1BurstConfig(0,0,1); DMACH1TransferConfig(43,0,1); DMACH1WrapConfig(0,0,43,0); DMACH1ModeConfig(DMA_SPIARX,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE, SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT, CHINT_END,CHINT_ENABLE); }
主 DMA 配置:
{ DMACH5AddrConfig(&SpiaRegs.SPITXBUF,DMASource); DMACH5BurstConfig(0,1,0);// Burst size, src step, dest step DMACH5TransferConfig(43,1,0);// transfer size, src step, dest step DMACH5WrapConfig(43,0,0,0); DMACH5ModeConfig(DMA_SPIATX,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE, SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT, CHINT_END,CHINT_ENABLE); }
当主机发送 数据(0x01 0xFC ...)时 CRC)、 如下所示的 RX 结果:
我们可以发现、第一个词 将 放在第十六个词上。
当 BurstConfig 编号大于1个字时、第一个字的 位置是随机的。 如下 :
有时我们发现 原始数据传输未完成。
主机 发送数据:
9884 8884 7884 6884 5884 3884 2884 1884 884 10117 9117 8117 7117 6117 5117 3117 2117 1117 9884 8884 7884 6884 5884 3884 2884 1884 10117 9117 8117 7117 6117 5117 3117 2117 1117
从机检索数据:
9884 8884 7884 6884 5884 3884 2884 1884 884 10117 9117 8117 7117 6117 5117 3117 2117 1117 9883 8883 7883 6883 5883 3883 2883 1883 883 10116 9116 8116 7116 5116 3116 2116 1116
"9883 8883 7883 6883 5883 3883 2883 1883 883 10116 9116 8116 7116 6116 5116 3116 2116 1116 "是前一帧中接收到的数据
RX 数据如下:
在大多数情况下、我发现 SPI RXFFOVF 已设置为1。
我进行以下检查:
SPI 寄存器 为:
上述 DMA 和 SPI 配置是否有错误?
您好、Joe。
查看配置后、以下是可能出现的问题:
两个通道都配置的 DMA 突发大小 为 1、正确吗? 如果是、您需要将 SPI FIFO 配置为每1个字触发一次、以便正确同步 SPI 和 DMA (在两个通道/器件上)。 下面应该是要使用的 SPI 配置:
SpiaRegs.SPIFFRX.bit.RXFFIL = 0x1; // Set RX FIFO level (1 or more words present -> 1 word can be read by DMA)
SpiaRegs.SPIFFTX.bit.TXFFIL = 0xF; // Set TX FIFO level (15 words or fewer present -> 1 word can be written by DMA)
请告诉我、这是否可以解决该问题。 你也可以改变突发大小为8、但是这不适用于发送44个字、因为44/8不能均匀除法。
此致、
Delaney
你好、 Delaney。
我是提出这个问题的人。
我根据你的建议对它进行了测试,但问题仍然存在。
我已经阅读了这篇文章。
在 DMA Rx 中断函数中。i 重新启动 DMA 通道。
// // local_D_INTCH6_ISR - DMA Channel 6 ISR receive // __interrupt void local_D_INTCH6_RX_ISR(void) { EALLOW; // NEED TO EXECUTE EALLOW INSIDE ISR !!! // DmaRegs.CH1.CONTROL.bit.HALT = 1; DmaRegs.CH1.CONTROL.bit.RUN = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP7; // ACK to receive more interrupts // from this PIE group EDIS; GetSPIDMARecData(); }
从器件端上的 SPI 上溢问题已经被解决。 但使用同样的方法,问题的 主机侧仍然存在。
你有什么其他建议吗?
你好、 Delaney
Neil LAN 是我的客户的工程师、他向我提出了这个问题、并继续与您沟通。 请您继续关注该主题的问题吗?
谢谢
Joe
嗨、Neil 和 Joe:
您在主设备方面看到了什么问题? 主器件端代码上的 SPI 模块是否设置了任何错误标志? 是否缺少应该传输的数据?
请解释当前问题、如果可能、请分享更新后的代码、以便我可以查看。
此致、
Delaney
你好、Delaney
主器件侧配置为:
SPI 配置:
void InitSpia (void)
{
//初始 *** FIFO 长度
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICCR.bit.SPICHAR = 15;
SpiaRegs.SPICCR.bit.HS_MODE = 0; //高速模块 SPIClK = 200m
SpiaRegs.SPICCR.bit.SPILBK = 0;
//禁用 SPI 中断
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//SPI 在从模式下运行
SpiaRegs.SPICTL.bit.talk = 1;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
//SpiaRegs.SPICTL.bit.SPIINTENA = 0;
SpiaRegs.SPICTL.bit.SPIINTENA = 1;
//设置波特率
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 4;// Hmode = 0 50m/5 = 10M
//设置自由位
//在断点上停止不会使 SPI 暂停
SpiaRegs.SPIPRI.bit.free = 1;
//将 SPI 从复位状态释放
SpiaRegs.SPICCR.bit.SPISWRESET = 1;
}
主 DMA 配置:
{
DMACH5AddrConfig (&SpiaRegs.SPITXBUF、DMASource);
DMACH5BurstConfig (0、1、0);// Burst Size、src step、dest step
DMACH5TransferConfig (43、1、0);//传输大小、src 步长、目标步长
DMACH5WrapConfig (43、0、0、0);
DMACH5ModeConfig (DMA_SPIATX、PERINT_ENABLE、Oneshot_disable、CONT_disable、
SYNC_DISABLE、SYNC_SRC、OVRFLOW_DISABLE、CHEIN_BIT、
CHINT_END、CHINT_ENABLE);
}
主器件 RX 问题与从器件 RX 问题相同、SPI 寄存器报告溢出错误:
当 从器件发送 数据时(0x01 0xFC … CRC)、主机 RX 结果 如下:
我们可以发现、第一个词 将 放在第十六个词上。
当 BurstConfig 编号大于1个字时、第一个字的 位置是随机的。 如下 :
有时我们发现 原始数据传输未完成。
从机 发送数据:
9884 8884 7884 6884 5884 3884 2884 1884 884 10117 9117 8117 7117 6117 5117 3117 2117 1117 9884 8884 7884 6884 5884 3884 2884 1884 10117 9117 8117 7117 6117 5117 3117 2117 1117
主机 接收数据:
9884 8884 7884 6884 5884 3884 2884 1884 884 10117 9117 8117 7117 6117 5117 3117 2117 1117 9883 8883 7883 6883 5883 3883 2883 1883 883 10116 9116 8116 7116 5116 3116 2116 1116
"9883 8883 7883 6883 5883 3883 2883 1883 883 10116 9116 8116 7116 6116 5116 3116 2116 1116 "是前一帧中接收到的数据
RX 数据如下:
在大多数情况下、我发现 SPI RXFFOVF 已设置为1。
我进行以下检查:
SPI 寄存器 为:
谢谢
Joe
您好、Joe。
这看起来与我之前提到的问题相同。 SPI FIFO 级别设置为8、但它们使用的 DMA 突发大小为1。 这些引脚必须匹配才能正常运行。 需要将 DMA 突发大小更改为8、或者需要将 SPI FIFO 级别更改为1。
此致、
Delaney