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.

[参考译文] MSP432P401R:DMA 收集散射设置问题、请清除

Guru**** 2589280 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/628615/msp432p401r-dma-gather-scatter-setup-question-please-clear

器件型号:MSP432P401R

大家好、同事、

我在项目中进行了以下硬件设置。

MSP432通过2个 UART UART0和 UART2与其他组件通信。

其中一种情况是 MSP 必须通过 UATRT0进行咨询并通过 UART2进行应答。

到目前为止、这一点很清楚。 我尝试使用 DMA、恰好是 DMA 散聚模式来实现这一点。

我的第一次尝试失败了

我定义了一个数组 DMA 控制表。 这种方式

DMA_ControlTable configExchange[2]=
{
DMA_TaskStructEntry (header_length + CONFIG_PAYLOAD_LENGTH、UDMA_SIZE_8、
UDMA_SRC_INC_8、txBuff、
UDMA_DST_INC_NONE、&EUSCI_A0->TXBUF、
UDMA_ARB_1、UDMA_MODE_BASIC)、

DMA_TaskStructEntry (header_length + CONFIG_PAYLOAD_LENGTH、UDMA_SIZE_8、
UDMA_SRC_INC_NONE、&EUSCI_A2->RXBUF、
UDMA_dst_INC_8、rxBuff、
UDMA_ARB_1、UDMA_MODE_BASIC)
}; 

以及如何设置 DMA gath scatt。 ? 我必须分配哪个 DMA 通道?

dma_setChannelScatterGather (/*dma_channel*/、1、(void*)、configExchange、1); 


其余的 DMA 设置是显而易见的、我对此没有疑问。 只有这家酒店……

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

    Yuliy、

      您在任务中设置的"模式"也应该是散聚模式、但最后一种模式可以是基本模式。  

    请在此处查找示例:

    此致、

    Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >您在任务中设置的"模式"也应该是散聚模式、但最后一种模式可以是基本模式。
    哦、是的、我已经在代码中执行了它...
    核心问题又如何?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以通过几种不同的方法来实现此目的。

    (1)您可以让一个通道从 RX (CH5)触发、另一个通道从 TX (CH0)触发。  这意味着您必须手动清除 txifg、然后等待 RX。  从 RX (CH5)触发的任务列表将根据外设散聚模式接收数据、但接收到的下一个到最后一个字节将使用存储器散聚模式、以便启动发送序列的下一个任务将自动启动。  当 TXBUF 可用时、另一个 DMA 通道(CH0)将开始将数据移动到 TX 中。  请参阅前面提到的演示、了解如何混合使用存储器和外设散聚。

    (2)您可以使所有内容都从 RX (CH5)触发。  您仍需要混合存储器和外设散聚以在 RX 和 TX 之间转换。  密钥在 TX 机制中输入"虚拟"任务、这样 DMA 写入 TXBUF 的速度就不会比实际发送数据的速度快。

    Chris

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

    您好 Chris、

    您写道

    这意味着您必须手动清除 txifg、然后等待 RX。  从 RX (CH5)触发的任务列表将根据外设散聚模式接收数据、但接收到的下一个到最后一个字节将使用存储器散聚模式、以便启动发送序列的下一个任务将自动启动。  当 TXBUF 可用时、另一个 DMA 通道(CH0)将开始将数据移动到 TX 中


    很抱歉没有得到您的建议

    >这意味着您必须手动清除 txifg,然后等待 RX

    手动表示 CPU、菜单无散聚自动化。 对吧?  

    >启动发送序列的下一个任务将自动启动状态良好,

    这就是我想要的、问题是、我必须在哪个通道中使用  

    DMA_setChannelScatterGather? 第一个参数? 

    将研究示例、
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尤利
    当 eUSCI 外设从复位状态释放时(您保持复位状态以进行配置)、TXIFG 会自动置1。 如果您要启用一个由 TXIFG 触发的 DMA 通道,则 DMA 将自动开始移动数据。 因此、作为配置的一部分、CPU 将在设置 DMA 之前清除 TXIFG。 希望这更有意义。

    Chris

    map_dma_setChannelScatterGather (dma_ch4_EUSCIA2TX、TX_tasks、(void*)&txData[0]、false);
    map_dma_setChannelScatterGather (dma_CH1_EUSCIA0RX、RX_tasks、(void*)&rxData[0]、false);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Chris、

    我将对此进行调查、但只有在温德斯日、我们才会在德国度假。

    很抱歉耽误你的时间、我希望我不会让你在未回答的话题上取得太大的平衡...

    :-)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很棒
    dma_setChannelScatterGather (..、uint32_tisPeriphSG)
    根据文档...,最后一个参数正在说明 '标志 bIsPeriphSG 应用于指示是否应针对外设或存储器操作配置散聚模式。'
    另一方面、它已经在 dma_TaskStructEntry 宏最后一个 param - udma_mode_mem_s散 射_收集中定义。

    为什么? 或者我是否误解了参数的含义?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Chris:

    另一个小问题..

     ADC DMA 示例

    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、&EUSCI_B2_SPI->RXBUF、
    UDMA_DST_INC_NONE、&dummyRX、
    UDMA_ARB_4、(UDMA_MODE_MEM_SP散 射_收集+ UDMA_MODE_ALT_SELECT)、
    /*任务2,清除芯片选择*/
    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、outputLow、
    UDMA_DST_INC_NONE、&P3->OUT、
    UDMA_ARB_4、(UDMA_MODE_MEM_SP散 射_收集+ UDMA_MODE_ALT_SELECT)、
    /*任务3、加载 TX 缓冲区以启动 SPI */
    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、&dummyTX、
    UDMA_DST_INC_NONE、&EUSCI_B2_SPI->TXBUF、
    UDMA_ARB_4、(UDMA_MODE_PER_SP散 射_收集+ UDMA_MODE_ALT_SELECT)、 

    当我们从外围设备(UART)读取数据时、我们使用 UDMA_MODE_MEM_SP散 射_收集

    当我们写入 Po 外设时、我们使用 UDMA_MODE_PER_散 射收集

    为什么? 第二点很明显、我首先不理解...两者都与外围设备一起工作...

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

    很抱歉、今天还有另外一个问题。
    在理论上、在 DMA 任务中是否可以切换 UART 设置?
    我是说、由于硬件限制、UART TX 可在8MHz 下完成、UART RX 可在1MHz 下完成。
    那么、我想使用一个 UART、但切换速度、并在 DMA setter 收集任务中切换它吗?
    有可能吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尤利
    这取决于您是希望从外设触发器触发任务还是自动触发任务。 例如、对于 RX 通道、从 UART 到 SRAM 的每次传输都由 UART RX 触发。 一旦所有字节被接收、一个任务应该被自动触发以写入 TX 缓冲区。 一旦该字节被移入移位寄存器、TX IFG 被置位并触发另一个 DMA 通道来将另一个字节移入 TX 缓冲区、随后移动到 TXBUF 由 TX IFG 触发。 请记住您需要的触发器和触发时间(自动触发与手动触发||存储与外设触发)。

    是的、您可以使用 DMA 重新配置外设。 Amit 的一个例子是:

    dev.ti.com/.../

    在此示例中、任务在外设(本例中为 ADC)和存储器之间移动。 内存任务重新配置相关的外设。

    /* 9. 传输1024个40KHz */的样本
    DMA_TaskStructEntry (ABF_SAples、UDMA_SIZE_32、
    UDMA_SRC_INC_NONE、&ADC14->MEM[1]、
    UDMA_DST_INC_32、(void *)&ui32ABFArray[0]、
    UDMA_ARB_1、UDMA_MODE_PER_散 射_收集
    )、
    /* 10. 停止 Timer-A0 */
    DMA_TaskStructEntry (1、UDMA_SIZE_16、
    UDMA_SRC_INC_NONE、(void *)&TimerStopCommand、
    UDMA_DST_INC_NONE、&TIMER_A0->CTL、
    UDMA_ARB_1、UDMA_MODE_MEM_散 射_收集
    )、
    /* 11. 将 Timer-A0 CCR 重新配置为400 KHz */
    DMA_TaskStructEntry (1、UDMA_SIZE_16、
    UDMA_SRC_INC_NONE、(void *)&TimerCCR1Update400K、
    UDMA_DST_INC_NONE、&TIMER_A0->CCR[0]、
    UDMA_ARB_1、UDMA_MODE_MEM_散 射_收集
    )、
    /* 12. 停止 ADC */
    DMA_TaskStructEntry (1、UDMA_SIZE_32、
    UDMA_SRC_INC_NONE、(void *)&ADCStopCommand、
    UDMA_DST_INC_NONE、&ADC14->CTL0、
    UDMA_ARB_1、UDMA_MODE_MEM_散 射_收集
    )、

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

    谢谢 Chris、你真的能帮我。

    我希望其他人也能从我们的对话中得到良好的信息。

    另一个小问题

    我明白了

    DMA_TaskStructEntry (1、UDMA_SIZE_8、
    UDMA_SRC_INC_NONE、&dummyTX、
    UDMA_DST_INC_NONE、&EUSCI_B2_SPI->TXBUF、
    UDMA_ARB_4、(UDMA_MODE_PER_SP散 射_收集+ UDMA_MODE_ALT_SELECT)
     

    我很好奇、为什么我们使用  UDMA_MODE_PER_SP散 射收集+UDMA_MODE_ALT_SELECT

    我是指'+'符号,通常我们使用逻辑或。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尤利

      我很高兴这对我有所帮助。  从 MSP430的背景来看、我不认为散聚非常直观、但我认为这只是因为我对它很陌生。

     没有理由使用'+'而不是逻辑 OR。  我认为,在这方面,逻辑上或更合适。  此外、不需要 UDMA_MODE_ALT_SELECT、因为根据定义、任务在副通道中执行、而主通道用于在散聚模式中将任务加载到副通道中。  在最近的示例中、省略了此定义。

    此致、

    Chris  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >此外,不需要 UDMA_MODE_ALT_SELECT,因为根据定义,任务在备用通道中执行。
    这对我来说也有点奇怪。

    请不要关闭主题、因为我处于散聚函数的中间位置、可能会询问一些建议。

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

    尊敬的 Chris:

    硬件对实现方面存在困难

    MSP432 (具有 DMA 集中散射功能的 UART TX)--- > Tiva TM4C129 (UART RX TI RTOS DMA)

    测试显示以下问题

    RX 正确接收第一个 TX 发送、但随后都发送了一定量的垃圾。 它看起来像是重叠的... 首先发生丢失2或4个字节的情况、然后 REST 被重叠或移位。

    因为我预计 TX 电报大小固定。 我清楚地看到它。 无随机字节、但正确字节、但错误位置。 我希望您理解我的意思。

    这是我的 DMA 任务数组

    静态 dma_ControlTable dmaControlTablesConfigTX[1]=
    {
       dma_TaskStructEntry (header_length + CONFIG_PAYLOAD_LENGTH、Udma_size_8、
                           Udma_SRC_INC_8、txBuff、
                           Udma_dst_INC_none、 &EUSCI_A0->TXBUF、
                           UDMA_ARB_1、UDMA_MODE_BASIC)
    };
    
    //这是我的 DMA 集代码
    
    静态 void prepareDMA_散 射收集()
    {
    map_dma_enableModule();
    MAP_DMA_setControlBase (dmaControlTable);
    
    MAP_DMA_赋 值通道(DMA_CH0_EUSCIA0TX);
    MAP_DMA_赋 值通道(DMA_CH5_EUSCIA2RX);
    MAP_DMA_clearInterruptFlag (DMA_CHANNEL 0);
    MAP_DMA_clearInterruptFlag (DMA_CHANNEL 5);
    
    MAP_DMA_赋 值中断 (INT_DMA_INT0、DMA_CHANGE_0);
    MAP_DMA_赋 值中断 (INT_DMA_INT0、DMA_CHANGE_5);
    MAP_DMA_enableInterrupt (INT_DMA_INT0);
    
    MAP_Interrupt_enableInterrupt (INT_DMA_INT0);
    
    MAP_DMA_enableInterrupt (INT_DMA_ERR);
    MAP_Interrupt_enableInterrupt (INT_DMA_ERR);
    }
    
    //这是 IRQ
    
    void DMA_INT0_IRQHandler (void)
    {
    const uint32_t DMA_status = DMA_getInterruptStatus ();
    
    if (dma_status &(1 << dma_channel_0))
    )}{
    MAP_DMA_disableChannel (dma_channel_0);
    MAP_DMA_clearInterruptFlag (DMA_CHANNEL 0);
    ch0Fn (true);
    }
    
    if (dma_status &(1 << dma_channel_5))
    {
    MAP_DMA_disableChannel (dma_channel_5);
    MAP_DMA_clearInterruptFlag (DMA_CHANNEL 5);
    ch5Fn (真);
    }
    } 

    我感觉我在 IRQ 处理程序中漏掉了一些相关的 UART。

     

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

    我发送以下代码



    MAP_DMA_setChannelScatterGather (DMA_CH0_EUSCIA0TX、1、(void*) dmaControlTablesConfigTX、1); MAP_DMA_enableChannel (DMA_CHANGE_0);