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.

[参考译文] TMS320F28377S:SPI 和 DMA 接收卡滞

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1442843/tms320f28377s-spi-and-dma-receive-stuck

器件型号:TMS320F28377S
主题中讨论的其他器件:TEST2C2000WARE

工具与软件:

您好:

我、了28377s 的 spib 和 dma5从闪存读取1024个字并触发 DMA 中断。 然后继续下一个读数。

我的 DMA 初始化代码如下所示:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我的 SPI FIFO 初始化代码如下所示:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

DMA ISR:

Fullscreen
1
2
3
4
5
6
7
8
// 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;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我通过在 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