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**** 2468610 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 初始化代码如下所示:

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