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.

[参考译文] TMS570LS1227:启用 DMA 时、从模式下的 SPI2通信问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1126755/tms570ls1227-spi2-communication-problem-in-slave-mode-when-dma-is-enabled

器件型号:TMS570LS1227
主题中讨论的其他器件: ADS125H02HALCOGEN

我已将 SPI2配置为从器件、MIBSPI1配置为主器件、两者都使用 DMA。 当 MIBSPI1未被使用时、SPI2工作正常、但是当 MIBSPI1开始数据传输时、SPI2通信失败。 据我所见、DMA 缓冲区中的数据被移位了几位。

有3个 ADC 芯片连接到 MIBSPI 端口、MCU 以7.2K 的采样率从每个 ADC 芯片读取数据。 SPI2和 MIBSPI1分别使用 BTC 和 FTC DMA 中断。 我还更改了 sys_dma.c 中的 dmaFTCAInterrupt 函数、并在触发 FTC 中断时调用另一个函数。

另一件事是 SPI2的数据大小不是固定的。 它首先接收3个16位字作为标头。 此报头包含封装尺寸、然后 MCU 将 DMA 缓冲区尺寸更改为发送/接收报头中定义的字节数。

当 SPI2配置为 ISR 模式时、它在高达4MHz 的频率下正常工作。

#define CONFIG_SPI_TX_DMA_CH    DMA_CH13
#define CONFIG_SPI_RX_DMA_CH    DMA_CH12
#define CONFIG_SPI_TX_DMA_REQ   3ul
#define CONFIG_SPI_RX_DMA_REQ   2ul

#define CONFIG_SPI_HEADER_SIZE  3
#define CONFIG_SPI_PORT         spiREG2

#define CONFIG_SPI_TX_ADDR      ((uint32_t)(&(CONFIG_SPI_PORT->DAT1)) + 2)
#define CONFIG_SPI_RX_ADDR      ((uint32_t)(&(CONFIG_SPI_PORT->BUF)) + 2)



void dmaConfigSPICtrlTxPacket(g_dmaCTRL * g_dmaCTRLPKT_TX, uint32 sadd, uint32 dadd, uint16 FrameCnt)
{
    g_dmaCTRLPKT_TX->SADD      = sadd;               /* source address             */
    g_dmaCTRLPKT_TX->DADD      = dadd;               /* destination  address       */
    g_dmaCTRLPKT_TX->CHCTRL    = 0;                  /* channel control            */
    g_dmaCTRLPKT_TX->FRCNT     = FrameCnt;           /* frame count                */
    g_dmaCTRLPKT_TX->ELCNT     = 1;                  /* element count              */
    g_dmaCTRLPKT_TX->ELDOFFSET = 0;                  /* element destination offset */
    g_dmaCTRLPKT_TX->ELSOFFSET = 0;                  /* element source offset      */
    g_dmaCTRLPKT_TX->FRDOFFSET = 0;                  /* frame destination offset   */
    g_dmaCTRLPKT_TX->FRSOFFSET = 0;                  /* frame source offset        */
    g_dmaCTRLPKT_TX->PORTASGN  = 4;                  /* port b                     */
    g_dmaCTRLPKT_TX->RDSIZE    = ACCESS_16_BIT;      /* read size                  */
    g_dmaCTRLPKT_TX->WRSIZE    = ACCESS_16_BIT;      /* write size                 */
    g_dmaCTRLPKT_TX->TTYPE     = FRAME_TRANSFER;     /* transfer type              */
    g_dmaCTRLPKT_TX->ADDMODERD = ADDR_INC1;          /* address mode read          */
    g_dmaCTRLPKT_TX->ADDMODEWR = ADDR_FIXED;         /* address mode write         */
    g_dmaCTRLPKT_TX->AUTOINIT  = AUTOINIT_ON;        /* autoinit                   */
}

void dmaConfigSPICtrlRxPacket(g_dmaCTRL * g_dmaCTRLPKT_RX, uint32 sadd, uint32 dadd, uint16 FrameCnt)
{
    g_dmaCTRLPKT_RX->SADD      = sadd;               /* source address             */
    g_dmaCTRLPKT_RX->DADD      = dadd;               /* destination  address       */
    g_dmaCTRLPKT_RX->CHCTRL    = 0;                  /* channel control            */
    g_dmaCTRLPKT_RX->FRCNT     = FrameCnt;           /* frame count                */
    g_dmaCTRLPKT_RX->ELCNT     = 1;                  /* element count              */
    g_dmaCTRLPKT_RX->ELDOFFSET = 0;                  /* element destination offset */
    g_dmaCTRLPKT_RX->ELSOFFSET = 0;                  /* element source offset      */
    g_dmaCTRLPKT_RX->FRDOFFSET = 0;                  /* frame destination offset   */
    g_dmaCTRLPKT_RX->FRSOFFSET = 0;                  /* frame source offset        */
    g_dmaCTRLPKT_RX->PORTASGN  = 4;                  /* port b                     */
    g_dmaCTRLPKT_RX->RDSIZE    = ACCESS_16_BIT;      /* read size                  */
    g_dmaCTRLPKT_RX->WRSIZE    = ACCESS_16_BIT;      /* write size                 */
    g_dmaCTRLPKT_RX->TTYPE     = FRAME_TRANSFER;     /* transfer type              */
    g_dmaCTRLPKT_RX->ADDMODERD = ADDR_FIXED;         /* address mode read          */
    g_dmaCTRLPKT_RX->ADDMODEWR = ADDR_INC1;          /* address mode write         */
    g_dmaCTRLPKT_RX->AUTOINIT  = AUTOINIT_ON;        /* autoinit                   */
}

void setConfigSPIDMA(void)
{
    g_dmaCTRL g_dmaCTRLPKT;

    dmaEnableInterrupt(CONFIG_SPI_RX_DMA_CH, BTC);     //Block transfer complete
    dmaReqAssign(CONFIG_SPI_RX_DMA_CH, CONFIG_SPI_RX_DMA_REQ);    //SPI2 RX
    dmaReqAssign(CONFIG_SPI_TX_DMA_CH, CONFIG_SPI_TX_DMA_REQ);    //SPI2 TX

    dmaConfigSPICtrlTxPacket(&g_dmaCTRLPKT, (uint32_t)&ResponseData, CONFIG_SPI_TX_ADDR, CONFIG_SPI_HEADER_SIZE);
    dmaSetCtrlPacket(CONFIG_SPI_TX_DMA_CH, g_dmaCTRLPKT);
    dmaConfigSPICtrlRxPacket(&g_dmaCTRLPKT, CONFIG_SPI_RX_ADDR, (uint32_t)&RX_Data.PacketArray, CONFIG_SPI_HEADER_SIZE);
    dmaSetCtrlPacket(CONFIG_SPI_RX_DMA_CH, g_dmaCTRLPKT);
    dmaSetChEnable(CONFIG_SPI_RX_DMA_CH, DMA_HW);    //SPI2 RX, hardware triggering
    dmaSetChEnable(CONFIG_SPI_TX_DMA_CH, DMA_HW);    //SPI2 TX, hardware triggering

    dmaSetPriority(CONFIG_SPI_RX_DMA_CH, HIGHPRIORITY);
    dmaSetPriority(CONFIG_SPI_TX_DMA_CH, HIGHPRIORITY);

    CONFIG_SPI_PORT->GCR1 = (CONFIG_SPI_PORT->GCR1 & 0xFFFFFFFFU) | (0x1 << 24);  //Enable SPI
    CONFIG_SPI_PORT->INT0 = (0x1 << 16); //SPI_DMAREQ; Enable DMA REQ only after setting the SPIEN bit to 1.
}

void sendAndGetSPIData(uint32_t outputBuffer, uint32_t inputBuffer, uint32_t ucDataLength)
{
    dmaRAMREG->PCP[CONFIG_SPI_TX_DMA_CH].ISADDR = outputBuffer;
    dmaRAMREG->PCP[CONFIG_SPI_TX_DMA_CH].IDADDR = CONFIG_SPI_TX_ADDR;
    dmaRAMREG->PCP[CONFIG_SPI_TX_DMA_CH].ITCOUNT = (ucDataLength << 16U) | 1;

    dmaRAMREG->PCP[CONFIG_SPI_RX_DMA_CH].IDADDR = inputBuffer;
    dmaRAMREG->PCP[CONFIG_SPI_RX_DMA_CH].ISADDR = CONFIG_SPI_RX_ADDR;
    dmaRAMREG->PCP[CONFIG_SPI_RX_DMA_CH].ITCOUNT = (ucDataLength << 16U) | 1;

    dmaSetChEnable(CONFIG_SPI_RX_DMA_CH, DMA_HW);    //SPI2 RX, hardware triggering
    dmaSetChEnable(CONFIG_SPI_TX_DMA_CH, DMA_HW);    //SPI2 TX, hardware triggering

    CONFIG_SPI_PORT->GCR1 = (CONFIG_SPI_PORT->GCR1 & 0xFFFFFFFFU) | (0x1 << 24);  //Enable SPI
    CONFIG_SPI_PORT->INT0 = (0x1 << 16); //SPI_DMAREQ; Enable DMA REQ only after setting the SPIEN bit to 1.
    while((dmaREG->PEND & (1ul << 0)) != 0ul);
}

void getConfigSPIData(uint32_t buffer, uint32_t ucDataLength)
{
    dmaRAMREG->PCP[CONFIG_SPI_RX_DMA_CH].IDADDR = buffer;
    dmaRAMREG->PCP[CONFIG_SPI_RX_DMA_CH].ISADDR = CONFIG_SPI_RX_ADDR;
    dmaRAMREG->PCP[CONFIG_SPI_RX_DMA_CH].ITCOUNT = (ucDataLength << 16U) | 1;

    dmaSetChEnable(CONFIG_SPI_RX_DMA_CH, DMA_HW);    //SPI2 RX, hardware triggering
    dmaSetChEnable(CONFIG_SPI_TX_DMA_CH, DMA_HW);    //SPI2 TX, hardware triggering
    CONFIG_SPI_PORT->GCR1 = (CONFIG_SPI_PORT->GCR1 & 0xFFFFFFFFU) | (0x1 << 24);  //Enable SPI
    CONFIG_SPI_PORT->INT0 = (0x1 << 16); //SPI_DMAREQ; Enable DMA REQ only after setting the SPIEN bit to 1.
    while((dmaREG->PEND & (1ul << 0)) != 0ul);
}

void dmaGroupANotification(dmaInterrupt_t inttype, uint32 channel)
{
    CONFIG_SPI_PORT->INT0 &= ~(1ul << 16);
    CONFIG_SPI_PORT->GCR1 &= ~(0x1 << 24);
    ProcessSPI2();
}

void dmaFTCAInterrupt(void)
{
    uint32 offset = dmaREG->FTCAOFFSET;

	if (offset != 0U)
	{
		dmaGroupANotificationFTC(FTC, offset - 1U);
	}
}

void dmaBTCAInterrupt(void)
{
    uint32 offset = dmaREG->BTCAOFFSET;

    if (offset != 0U)
    {
        dmaGroupANotification(BTC, offset - 1U);
    }
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Chihan Kaya、

    在这两个 DMA 中、我们每帧仅传输一个元素、因此在这种情况下为 MibSPI1启用逐帧中断是无效的。 如果 MibSPI1需要逐帧中断、那么最好在中断模式下使用它。

    --

    谢谢、

    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jagadish、

    SPI2和 MIBSPI 的 DMA 配置包不同。 对于 SPI2、元素计数为1、帧计数是我们要发送/接收的字数。 对于 MIBSPI1、元素数量是我们要发送/接收的字数、帧计数为1。 此外、正如我之前提到的、MIBSPI 和 SPI2使用不同的 DMA 中断源。 SPI2使用 BTC、而 MIBSPI1使用 FTC。 更改 DMA 控制包参数会产生什么影响、或者是否有任何方法可以将 DMA 用于 SPI?

    您可以在下面找到 MIBSPI1 DMA 控制包配置:

    void dmaMibSPIConfigCtrlTxPacket(g_dmaCTRL * g_dmaCTRLPKT_TX, uint32_t sadd, uint32_t dadd, uint32_t dsize){
        g_dmaCTRLPKT_TX->SADD      = sadd;              /* source address             */ /*TXDATA_9B*/
        g_dmaCTRLPKT_TX->DADD      = dadd;              /* destination  address       */ /*mibspiRAM1->tx[0].data*/
        g_dmaCTRLPKT_TX->CHCTRL    = 0;                 /* channel control            */
        g_dmaCTRLPKT_TX->FRCNT     = 1;                 /* frame count                */
        g_dmaCTRLPKT_TX->ELCNT     = dsize;             /* element count              */
        g_dmaCTRLPKT_TX->ELDOFFSET = 4;                 /* element destination offset */
        g_dmaCTRLPKT_TX->ELSOFFSET = 0;                 /* element source offset      */
        g_dmaCTRLPKT_TX->FRDOFFSET = 0;                 /* frame destination offset   */
        g_dmaCTRLPKT_TX->FRSOFFSET = 0;                 /* frame source offset        */
        g_dmaCTRLPKT_TX->PORTASGN  = 4;                 /* port B                     */
        g_dmaCTRLPKT_TX->RDSIZE    = ACCESS_16_BIT;     /* read size                  */
        g_dmaCTRLPKT_TX->WRSIZE    = ACCESS_16_BIT;     /* write size                 */
        g_dmaCTRLPKT_TX->TTYPE     = BLOCK_TRANSFER;    /* transfer type              */
        g_dmaCTRLPKT_TX->ADDMODERD = ADDR_INC1;         /* address mode read          */
        g_dmaCTRLPKT_TX->ADDMODEWR = ADDR_OFFSET;       /* address mode write         */
        g_dmaCTRLPKT_TX->AUTOINIT  = AUTOINIT_ON;       /* autoinit                   */
    }
    
    void dmaMibSPIConfigCtrlRxPacket(g_dmaCTRL * g_dmaCTRLPKT_RX, uint32_t sadd, uint32_t dadd, uint32_t dsize){
        g_dmaCTRLPKT_RX->SADD      = sadd;              /* source address             */ /*mibspiRAM1->rx[0].data*/ /*(uint32_t)(&(mibspiRAM1->rx[15].data))*/
        g_dmaCTRLPKT_RX->DADD      = dadd;              /* destination  address       */ /*RXDATA_9B*/
        g_dmaCTRLPKT_RX->CHCTRL    = 0;                 /* channel control            */
        g_dmaCTRLPKT_RX->FRCNT     = 1;                 /* frame count                */
        g_dmaCTRLPKT_RX->ELCNT     = dsize;             /* element count              */
        g_dmaCTRLPKT_RX->ELDOFFSET = 0;                 /* element destination offset */
        g_dmaCTRLPKT_RX->ELSOFFSET = 4;                 /* element source offset      */
        g_dmaCTRLPKT_RX->FRDOFFSET = 0;                 /* frame destination offset   */
        g_dmaCTRLPKT_RX->FRSOFFSET = 0;                 /* frame source offset        */
        g_dmaCTRLPKT_RX->PORTASGN  = 4;                 /* port B                     */
        g_dmaCTRLPKT_RX->RDSIZE    = ACCESS_16_BIT;     /* read size                  */
        g_dmaCTRLPKT_RX->WRSIZE    = ACCESS_16_BIT;     /* write size                 */
        g_dmaCTRLPKT_RX->TTYPE     = BLOCK_TRANSFER;    /* transfer type              */
        g_dmaCTRLPKT_RX->ADDMODERD = ADDR_OFFSET;       /* address mode read          */
        g_dmaCTRLPKT_RX->ADDMODEWR = ADDR_INC1;         /* address mode write         */
        g_dmaCTRLPKT_RX->AUTOINIT  = AUTOINIT_ON;       /* autoinit                   */
    } 

    此致、
    Cihan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cihan、

    您能否尝试设置一次不同的优先级并对其进行测试?

    Tx 和 Rx 具有相同的优先级、如下所示

    您能否将 SPI2设置为高优先级、SPI2在 MibSPI2启用时停止工作、并将低优先级设置为 MibSPI2。 如下所示

    dmaSetPriority (CONFIG_SPI_RX_DMA_CH、高优先级);
    dmaSetPriority (CONFIG_SPI_TX_DMA_CH、低优先级);

    请进行上述修改、并告诉我结果。

    --

    谢谢、

    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jagadish、

    更改中断优先级没有产生任何影响。 当 MIBSPI 处于活动状态时、SPI2停止工作。

    此致、
    Cihan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cihan、

    是否可以通过 zip 共享完整的项目代码?
    --

    谢谢、

    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jagadish、

    我无法共享完整项目、但我可以创建一个最小版本的 projetct、其中包括所有 DMA 控件和所有使用 DMA 的外设。

    此致、
    Cihan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cihan、

    我可以创建一个最小版本的 projetct、其中包括所有 DMA 控件和所有使用 DMA 的外设。

    这对于理解和解决该问题非常有帮助。

    --

    谢谢、

    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jagadish、

    我发送了一条私人消息。 您可以在此处找到该项目。

    此致、
    Cihan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cihan、

    我验证了您的 DMA 通道和请求映射、对我来说很好、我将与我的高级 同事讨论一次、我将会再与您联系。

    --

    谢谢、

    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cihan、

    SPI2使用 DMA 通道12和通道13、与 MibSPI1和 MibSPI5使用的 DMA 通道相比、具有最低优先级(通道编号增加后、优先级将降低)。 如果 MibSPI1使用 DMA 保留 TXing 或 RXing 数据、则 SPI2可能不会得到处理。

    那么、您能否将最少数量的通道分配给 SPI2一次并进行测试?

    --

    谢谢、

    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jagadish、

    根据您的建议、我分别将 CH0和 CH1分配给 SPI TX 和 RX 通道。 但我们仍然存在相同的通信问题。

    BTW、我们也对 I2C 使用 DMA、但我忘记添加 I2C DMA 库。 I2C 使用 DMA 通道 CH14和 CH15。 我可以根据需要发送它。

    此致、
    Cihan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cihan、

    您的 DMA 通道映射现在看起来不错、并且不知道为什么在启用 MibSPI1时失败。

    现在、我正在尝试从我的团队获取意见、这可能需要一些时间。 另外、我最后没有使用 TMS570LS1227板来重现问题

    --

    谢谢、

    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jagadish、

    感谢您的更新。

    此致、
    Cihan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cihan、

    很抱歉耽误你的时间、你是否仍然卡在这个问题上?
    问题是、我无法在我的结尾重现您的问题、您能否共享您的整个代码?  

    以便我可以在我的末尾执行该操作、并且我可以在我的末尾重现该问题

    --

    谢谢、

    Jagadish。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jagadish、

    是的、我们仍然无法解决这个问题。

    很遗憾、我无法共享完整的项目、但我可以生成我发送给您的项目的问题。


    您是否刚刚测试了 SPI2? 问题是、当 MIBSPI1也在使用时、有3个 ADC 芯片连接到 MIBSPI、我们从每个 ADC 以每秒7.200样本的速率读取数据。 另一件事是、当这些 ADC 芯片设置数据就绪引脚时、我们从它们读取数据。 这会在 TMS 和 TMS 读取 ADC 数据时产生中断。 因此、您需要进行类似的设置才能在最后重现问题

    我们使用的 ADC 芯片是 ADS125H02。

    此致、
    Cihan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cihan、

    当 MibSPI1被使用或我们接收到错误的数据时,SPI2是否完全停止工作?

    我没有创建问题的设置、

    我们是否可以在 SPI2和 MibSPI1上使用一些存储器到存储器的传输产生相同的问题?

    我们是否可以计划一次 WebEx 会议、您可以在其中为我们演示该问题?

    我看到 了 ADS125H02数据表、发现该从器件将支持2.5SPS 至40SPS 的范围、您能否从7.2降低采样率并验证 SPI2是否有改进?

    --

    谢谢、此致、

    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jagadish、
    您可以在下面以红色标记我的答案:

    当 MibSPI1被使用或我们接收到错误的数据时,SPI2是否完全停止工作?
    CK:收到错误数据。 据我所见、数据被移位、位移的数量被改变。

    我没有创建问题的设置、

    我们是否可以在 SPI2和 MibSPI1上使用一些存储器到存储器的传输产生相同的问题?
    Ck:你是指 DMA 还是其他东西? 您能提供更多有关这方面的详细信息吗?

    我们是否可以计划一次 WebEx 会议、您可以在其中为我们演示该问题?
    CK:当然、我将创建一个设置结果、并告知您。

    我看到了 ADS125H02数据表、发现该从器件将支持2.5SPS 至40SPS 的范围、您能否从7.2降低采样率并验证 SPI2是否有改进?
    CK:我们通常以7.2K 的速度运行系统。 我还尝试了较低的采样率、例如100SPS、但没有可用。

    此致、
    Cihan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cihan、

    Ck:你是指 DMA 还是其他东西? 您能提供更多有关这方面的详细信息吗?

    JG:我的意思是我们没有 ADC 芯片来触发您的问题、所以我所说的是、在您的情况下、您使用 DMA 将 MibSPI 数据传输到某个内存中、 而不是使用 DMA 在不需要任何 ADC 芯片的情况下使用某些存储器到存储器的传输。 如果即使 在使用 DMA 进行存储器到存储器的传输时也出现问题、那么我们也可以使用相同的代码轻松地在末尾触发该问题。

    CK:当然、我将创建一个设置结果、并告知您。

    JG:谢谢。

    --

    谢谢、此致、

    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jagadish、

    是否有任何用于内存到内存传输的示例项目?

    我还将使用 SPI 环回功能模拟 MibSPI 通信。 因此、我们可以在没有 ADC 芯片的情况下测试系统。

    此致、
    Cihan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cihan、

    e2e.ti.com/.../DMA_5F00_memory_5F00_to_5F00_memory.zip

    附件是示例内存到内存的传输示例、  

    在此示例中、我们有两个存储器 TX_DATA 和 RX_DATA、每个存储器的元件大小为500、DMA 将数据从 TX_DATA 存储器传输到 RX_DATA 存储器。 将数据传输到 RX_DATA 后、它会清除 RX_DATA、并且 DMA 将再次从 TX_DATA 传输数据并连续重复该过程。

    在代码中执行以下步骤:

    删除与 MibSPI1相关的代码并将此示例代码添加到您的项目中(无需在此代码的 HALCoGen 中执行任何其他配置)

    我在这里使用了 DMA_CH0、但在这里 、您可以使用 用于 MibSPI 的通道、甚至您也可以注释清除 RX_DATA 缓冲区、因为这会在传输之间产生一些延迟、如果我们确实注释了这一点、我们可以在 DMA 通道上创建连续流

    执行上述步骤后、只需测试和观察 SPI2 DMA 传输数据是否损坏。

    --

    谢谢、此致、

    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jagadish、

    感谢您提供该代码、我将尝试它。

    此致、
    Cihan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jagadish、

    我在项目中添加了内存到内存传输代码、并进行 了一些更改。 我创建了3个存储器到存储器 DMA 通道、并将数据长度设置为9个元素、而不是500个元素。 我还将 DMA 中断类型更改为 FTC、因为在我们的设计中、FTC 仅供 MibSPI 使用、SPI2、QSPI 和 I2C 使用 BTC。

    在这种配置下、我可以每秒从3个通道中的每个通道生成150K DMA 数据传输、SPI2可以正常工作。

    我对您的 DMA 配置有几个问题。
    -您的设置会使用 DMA_SW 调用 dmaSetChEnable、此配置有效、但当我设置 DMA_HW 时、仅当 MCU 从 SPI2接收数据时才会触发 DMA 传输。 请注意、在 sys_dma.c 中、dmaFTCAInterrupt 和 dmaBTCAInterrupt ISR 会调用不同的函数。 我已将 dmaFTCAInterrupt 函数更改为调用其他函数。 我发送的项目有这个变化。

    -您的代码只有一个 dmaConfigCtrlPacket 调用,但我必须为所有 SPI 和 I2C 的 TX 端和 RX 端设置控制包、DMA 通道和请求分配。 是否可以仅配置 Rx 侧(或仅配置 TX 侧)?

    -您的 dmaConfigCtrlPacket 配置也不同于我的配置。 我的配置是否正确?

    -在我们的设计中、有一个 GPIO 引脚连接到全部3个 ADC 芯片的使能引脚。 这样、我们就可以启动/停止 ADC 采样。 但问题是、由于它们都同时开始测量、因此它们会同时触发 Gio_notification ISR、在该 ISR 中、我们调用一个启动 MibSPI 数据读取的函数。 这是否会使 MCU 过载并使 SPI 混乱? 延迟启动/停止 ADC (例如、在设置第一个 ADC 引脚20us 后设置第二个 ADC 使能引脚)是否会起作用?

    此致、
    Cihan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cihan、

    -您的代码只有一个 dmaConfigCtrlPacket 调用,但我必须为所有 SPI 和 I2C 的 TX 端和 RX 端设置控制包、DMA 通道和请求分配。 是否可以仅配置 Rx 侧(或仅配置 TX 侧)?

    我已经明白了、但在 内存到内存 的传输中、我们无法对 Tx 和 Rx 进行单独的配置、我们只能通过进行更多内存到内存 的传输来增加通道数。

    -您的 dmaConfigCtrlPacket 配置也不同于我的配置。 我的配置是否正确?

    -您的配置正确。

    这是否会使 MCU 过载并使 SPI 混乱?

    是的、这是可能的。

    -延迟启动/停止 ADC (例如、第一个 ADC 引脚设置20us 后、第二个 ADC 使能引脚设置为20us)是否会起作用?

    我认为这将有助于改变局面、请尝试这样做。

    --

    谢谢、此致、

    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jagadish、

    我添加了偏移(延迟)以启动/停止 ADC、但它没有帮助。

    据我了解、TMS570没有嵌套矢量中断。 当 MCU 同时接收2个或更多中断时、它会如何反应? 如前所述、我们有3个 ADC 芯片、可在数据就绪时触发 MCU、由于所有芯片都连接到同一使能引脚、因此它们可能会同时触发 MCU。

    另一个问题是、当 MCU 在从上一个中断运行 ISR 时接收另一个中断、会发生什么情况? 当 MCU 正在监听第二个中断时、第三个中断进入、会发生什么情况? 通常、当接收到中断时、MCU 暂停当前正在处理的函数并跳转到 ISR、然后在 ISR 完成后返回到上一个函数。 但是、当它在完成之前的 ISR 调用之前发现过多的中断时、会发生什么情况?

    此致、
    Cihan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cihan、

    [引用 userid="500049" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1126755/tms570ls1227-spi2-communication-problem-in-slave-mode-when-dma-is-enabled/4380597 #4380597"]据我了解、TMS570没有嵌套矢量中断。 MCU 在同时接收2个或更多中断时会如何反应?[/引述]

    正确、 Cortex R4/5本身不支持中断嵌套。

    TMS570为中断请求提供了两个矢量:FIQ 和 IRQ。 FIQ 的优先级高于 IRQ、FIQ 中断可能会中断 IRQ 中断。

    TMS570使用 VIM 来确定中断源的优先级并对其进行控制。 VIM 支持128个映射到中断源的中断通道。 每个 FIQ 和 IRQ 中编号较小的通道具有较高的优先级。  

    3. ARM Cortex-R4/5处理器不支持硬件中的中断嵌套。  它不支持一次获取多个 IRQ。  

    当两个 IRQ 中断(或2个 FIQ 中断)同时发生时、优先级较高的中断首先被处理。 第2个中断将在第1个中断完成后处理。  

    [引用 userid="500049" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1126755/tms570ls1227-spi2-communication-problem-in-slave-mode-when-dma-is-enabled/4380597 #4380597"]当 MCU 从上一个中断运行 ISR 时、会发生什么情况?[/quot]

    如果在处理第一个中断 ISR 时发生另一个中断、则第二个中断的中断挂起位将被置位、并且在第一个中断的 ISR 完成后、处理器现在将转到第二个中断 ISR 处理程序并开始执行。 在这种情况下永远不会丢失中断。

    [引用 userid="500049" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1126755/tms570ls1227-spi2-communication-problem-in-slave-mode-when-dma-is-enabled/4380597 #4380597"]当 MCU 正在处理第二个中断时、第三个中断进入时会发生什么情况?

    即使发生了第三个或更多中断、中断也不会丢失、只有相应中断的挂起位才会被置位。 在执行第一个中断 ISR 后、处理器将检查哪个中断在挂起的中断中具有高优先级、并根据该情况、处理器  首先执行高优先级中断、然后执行另一个低优先级中断。

    唯一的问题是、我们不应从同一中断源获取多个中断。

    示例:我在应用程序中使用两个不同的中断、一个是计时器、另一个是 Gio。 首先、我获得了计时器中断、我正在处理该中断、在完成该计时器中断的处理之前、我获得了两个 GIO 中断、在本例中、GIO 处理程序只执行一次而不是执行两次、因为每个中断只有一个待处理位。

    我希望它能消除你对 中断的所有怀疑。

    --

    谢谢、此致、

    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jagadish、

    感谢您的详细回答。 它清除了很多东西。 我有一个与中断相关的最后一个问题。

    在您的示例中、您说过如果您有2个 Gio 中断、Gio 处理程序将只执行一次。 如果有一个 GIO 引脚并且它被触发两次、这是有道理的。 如果有多个 GIO 中断源(在我们的案例中有3个 GIO 中断引脚- gioA 5、gioA 6和 gioA 7)、并且这3个引脚同时被触发、 GIO 处理程序将执行最后一个、还是 GIO 处理程序将逐个执行全部3个(请注意、同一个引脚不会被触发两次)? 这些引脚中是否有另一个中断标志? 在 VIM 中、每个引脚没有单独的 ISR 函数。 只有 GIO 高电平和 GIO 低电平中断。

    此致、
    Cihan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cihan、

    [引用 userid="500049" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1126755/tms570ls1227-spi2-communication-problem-in-slave-mode-when-dma-is-enabled/4384021 #4384021"]如果有多个 Gio 中断源(在我们的示例中、有3个 Gio 中断引脚- gioA 5、gioA 6和 gioA 7)、并且同时触发这3个引脚、 GIO 处理程序将执行最后一个还是 GIO 处理程序将逐个执行所有3个(请注意、同一个引脚不会被触发两次)?


    在这种情况下、GIO 处理程序将一个接一个地执行全部三个中断、并且不会丢失中断。

    每当发生 GIO 中断时、相应中断的 GIO 中断位将在"GIO 中断标志寄存器"中置位。 在这里、每个 GIO 引脚都有一 个单独的位、因此如果发生多个中断 、则每个中断的相应位将被置位。  
    因此、在处理当前 GIO 中断处理程序后、处理器再次验证上述寄存器中设置的挂起 GIO 中断、并获取最高优先级的中断并开始执行。  默认优先级类似于较低的 Gio 到较高的 Gio 数。 因此、 在您的情况下、在执行当前处理程序后、处理器会分别再次执行 gioA5、gioA6和 gioA7。

    --

    谢谢、此致、

    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jagadish、

    感谢您的回答。

    我将 DMA BTC 中断更改为 FIQ、优化了代码、这些更改似乎解决了问题。 我们可以在8MHz 下使用 SPI2 DMA。 我将尝试优化代码并测试系统以达到8+MHz 时钟速度。

    非常感谢您的所有帮助和支持。

    此致、
    Cihan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cihan、

    很高兴听到这个消息。

    --

    此致、

    Jagadish。