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.
工具与软件:
您好:
我、了28377s 的 spib 和 dma5从闪存读取1024个字并触发 DMA 中断。 然后继续下一个读数。
我的 DMA 初始化代码如下所示:
void sInitDma(void) { // refer to dma.c for the descriptions of the following functions. //Initialize DMA DMAInitialize(); DMA4Addr = (volatile INT16U *)Test4; DMA5Addr = (volatile INT16U *)Test2; DMA6Addr = (volatile INT16U *)Test1; // configure DMACH4 for spib TX DMACH4AddrConfig(&SpibRegs.SPITXBUF, DMA4Addr); // DMACH4BurstConfig(7, 1, 0); // Burst size, src step, dest step DMACH4TransferConfig(127, 1, 0); // transfer size, src step, dest step DMACH4ModeConfig(DMA_SPIBTX,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,\ SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE); // configure DMACH5 for spib RX DMACH5AddrConfig(DMA5Addr, &SpibRegs.SPIRXBUF); // DMACH5BurstConfig(7, 0, 1); // size, src step, dest step DMACH5TransferConfig(127, 0, 1); // transfer size, src step, dest step DMACH5ModeConfig(DMA_SPIBRX,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,\ SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE); // configure DMA CH6 for spia TX DMACH6AddrConfig(&SpiaRegs.SPITXBUF, DMA6Addr); DMACH6BurstConfig(7, 1, 0); DMACH6TransferConfig(127, 1, 0); DMACH6ModeConfig(DMA_SPIATX,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,\ SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE); // Ensure DMA is connected to Peripheral Frame 2 bridge (EALLOW protected) EALLOW; CpuSysRegs.SECMSEL.bit.PF2SEL = 1; EDIS; EALLOW; DmaRegs.CH4.CONTROL.bit.RUN = 0; DmaRegs.CH5.CONTROL.bit.RUN = 0; DmaRegs.CH6.CONTROL.bit.RUN = 0; EDIS; //Enable DMA interrupt PieCtrlRegs.PIEIER7.bit.INTx4 = 0; // Disable INT7.4 PieCtrlRegs.PIEIER7.bit.INTx5 = 1; // Enable PIE Group 7, INT 5 (DMA CH5) PieCtrlRegs.PIEIER7.bit.INTx6 = 1; // Enable PIE Group 7, INT 6 (DMA CH6) IER |= M_INT7; // Enable CPU INT6 }
我的 SPI FIFO 初始化代码如下所示:
void SpiBFifo(void) { INT16U m; // FIFO configuration SpibRegs.SPIFFCT.all=0x0; // place SPI in reset for(m=0;m<3;m++); SpibRegs.SPIFFRX.all=0x2040; // RX FIFO enabled, clear FIFO int SpibRegs.SPIFFRX.bit.RXFFIL = 8; // Set RX FIFO level SpibRegs.SPIFFTX.all=0xE040; // FIFOs enabled, TX FIFO released, SpibRegs.SPIFFTX.bit.TXFFIL = 8; // Set TX FIFO level // SPI configuration SpibRegs.SPICCR.all = 0x0007;//0x000F; //Reset off, rising edge, 16-bit char bits SpibRegs.SPICTL.all = 0x000e; //Enable master mode, delayed phase, enable talk, and SPI int disabled. SpibRegs.SPIBRR.all = 0x0006; SpibRegs.SPISTS.all = 0x0000; SpibRegs.SPIPRI.bit.FREE = 0x0001; //Transmission not affected by emulator SpibRegs.SPICCR.bit.SPISWRESET=1; }
DMA ISR:
// INT7.5 void DMAIntCh5ISR(void) // DMA Ch5 { EALLOW; // NEED TO EXECUTE EALLOW INSIDE ISR !!! DmaRegs.CH5.CONTROL.bit.HALT=1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP7; // ACK to receive more interrupts from this PIE group EDIS; }
我通过在 DMA 中断内执行 Halt=1、在中断外执行 run=1来重新启动。
在大多数情况下、它运行正常、但在最新的测试中、DMA 一直卡住
DmaRegs.CH5.CONTROL.bit.RUNSTS 保持1、但接收未完成、且不会产生中断。 SPI RXFFOVF=1。
此问题在特定情况下可能100%重现、并且似乎与硬件无关。 运行 OK 和运行 NG 条件下的特定寄存器数据如下。
您能否说明出现此问题的可能原因?
您好!
该专家目前不在办公室、直至节假日结束。 请预计响应会有延迟。 感谢您的耐心。
此致、
Aishwarya.
感谢您的答复。 期待您的指导。
我要补充一点、这一问题非常敏感。
在我的 CCS 项目中、我已经对几个地方进行了测试:添加一行代码、问题不会100%发生、删除这行代码会导致问题100%发生。
添加的代码与 SPI 和 DMA 无关、例如变量 a++;
任何人都可以帮助回答这个问题
你好,专家从假期回来了吗?
您好!
很抱歉耽误你的时间。 我现在正在关注您的问题、明天会回复您的问题。
此致、
Delaney
您好!
注意:
[报价 userid="478764" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1442843/tms320f28377s-spi-and-dma-receive-stuck ]spib 和 dma5从闪存读取1024个字DMA 模块无权访问闪存。 它只能访问 GSRAM 和特定外设(包括 SPI 寄存器)的寄存器。 我假设、如果在某些运行期间传输正在工作、则 Test4、 Test2和 Test1位于 GSRAM 中、这意味着这不是问题。
我怀疑问题是:是否在错误的情况下在代码中的任何位置设置断点? 有时这会扰乱 DMA 的时序、因为它暂停 CPU 执行、但 DMA 仍在运行(DMA 被设置为即使在您调用时设定了断点也是自由运行 DMAInitialize() 函数)。 在没有任何断点的情况下运行时、问题是否已解决?
此致、
Delaney
您好:
"spib 和 dma5从闪存读取1024个字",闪存意味着外部闪 存,而不是内部闪存,所以 这不是问题。
这不会在调试期间发生、因此没有断点。 然后、我在5个不同的芯片上测试了相同的代码、其中一个芯片的可重现性100%。 其他四个是正常的。 那么、这是否意味着它只是一个芯片外壳?
您好!
在故障芯片上、您是否发现除了 SPI 和 DMA 外、其他外设的功能存在问题? 如果是、则可能是硬件问题。
如果不是、那么看起来会与 DMA 操作的时序有关。
此致、
Delaney
否、其它 外围设备 似乎 工作 正常。
"如果没有、这似乎与 DMA 操作的时序有关。"
DMA 接收到1016字节、小于1024、因此不产生 DMA 中断。 这应该正常吗?
但为什么 SPI 的 RX FIFO 会卡住? 这似乎是 SPI RX FIFO 的问题
我们需要做些什么来快速识别、确定和解决问题
您好!
我需要更深入地了解您的配置;首先、我看不到任何问题。 不幸的是,我将在假期离开办公室,直到下星期一12/30 ,所以我不能看,直到那之后。 现在、我建议查看 C2000ware 中的 SPI DMA 示例并对照检查配置。 此示例可在 SDK 路径中找到:[C2000ware install]/driverlib/f28p65x/examples/cpu1/spi/spi_ex5_loopback_dma. 该示例针对不同的 C2000器件(F28P65x)、但器件之间的 SPI 和 DMA 模块是相同的。
此致、
Delaney
您好!
我很抱歉我的答复延迟了、因为假期我还在赶时间。 问题是否仍然存在? 如果是、请告知我、我将尽快深入了解您的配置。
此致、
Delaney
您好!
是的、 问题仍然存在。 感谢您花时间关注此问题!
您好!
为延迟、我再次表示歉意。 我已经查看了您的设置、您的配置看起来不错。
然后在中断之外运行=1
在您的代码中的哪个位置(在什么条件下)重新启用 DMA 通道? 可能是在 SPIB RX FIFO 溢出之前未重新启用 DMA、在这种情况下、DMA CH 5永远不会获得触发信号。 我不建议使用这种方法。
如果 SPIB 正在接收连续数据、我建议 在 ISR 结束时重新启用通道、避免触发缺失。 对先前传输的数据的任何数据处理都可以在该线路之前在 ISR 内部完成、以防止数据丢失。
此外、另请注意、如果禁用连续模式、则没有理由暂停 ISR 内的 DMA 通道。 这将在传输结束时自动完成。
此致、
Delaney