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.

[参考译文] AM62P:具有 DMA 模式的 UART:与 GMSL 通信时无法接收数据

Guru**** 2974170 points

Other Parts Discussed in Thread: AM62P, SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1658504/am62p-uart-with-dma-mode-cannot-receive-data-when-communicating-with-gmsl

部件号: AM62P
主题: SysConfig 中讨论的其他器件

您好、

我尝试在 AM62P 与目标电路板上的 GMSL 芯片和我使用的 MCU+SDK 版本之间建立通信、版本为 11.01.08。  

当前情况是我可以 成功实现 uart_echo 示例。 在这个工程中、我使用自封装 API 进行 UART 传输。 下面附上了嗅探代码。   

 status = SemaphoreP_constructBinary(&gUartWriteDoneSem_gmsl1, 0);
  status = SemaphoreP_constructBinary(&gUartReadDoneSem_gmsl1, 0);

uint8_t gUartTxBuffer[200] __attribute__((aligned(CacheP_CACHELINE_ALIGNMENT)));
    uint8_t gUartRxBuffer[8] __attribute__((aligned(CacheP_CACHELINE_ALIGNMENT)));
    strncpy(&gUartTxBuffer[0],"[MCU] uart DMA test. Please enter\r\n", 200);
    length = strlen(&gUartTxBuffer[0]);
    status = uart_txEncap(0, gUartTxBuffer, length);

    status = uart_rxEncap(0, gUartRxBuffer, 8);

    status = uart_txEncap(0, gUartRxBuffer, 8);
    
    strncpy(&gUartTxBuffer[0],"\r\n[MCU] At the end of test... \r\n", 200);
    length = strlen(&gUartTxBuffer[0]);
    status = uart_txEncap(0, gUartTxBuffer, length);

下面显示了自封装 API 的嗅探代码。

int32_t uart_txEncap(uint8_t u8_core_sel, uint8_t *tx_AppBuffer, uint32_t tx_bufSize)
{
    int32_t status;
    UART_Transaction uartTrans;

    /* Cache write-back before DMA - ensures DMA reads updated data from memory */
    CacheP_wb((void *)&tx_AppBuffer[0], tx_bufSize, CacheP_TYPE_ALL);

    UART_Transaction_init(&uartTrans);
    uartTrans.count = tx_bufSize;
    uartTrans.buf = &tx_AppBuffer[0U];


    status = UART_write(gUartHandle[u8_core_sel], &uartTrans);
    UART_flushTxFifo(gUartHandle[u8_core_sel]);

    if (u8_core_sel == 0) 
    {
        SemaphoreP_pend(&gUartWriteDoneSem_gmsl1, SystemP_WAIT_FOREVER);
    }
    else if (u8_core_sel == 1)
    {
        SemaphoreP_pend(&gUartWriteDoneSem_gmsl2, SystemP_WAIT_FOREVER);
    } 

    if (SystemP_SUCCESS != (status))
    {
        return status;
    }
    else
    {
        return SystemP_SUCCESS;
    }
}

int32_t uart_rxEncap(uint8_t u8_core_sel, uint8_t *rx_AppBuffer, uint32_t rx_bufSize, uint32_t semaPend_us)
{
    int32_t status;
    UART_Transaction uartTrans;
    uint32_t lineStatus, atLeastCharInFifo = 0;

    /* Cache write-back before DMA - ensures DMA reads updated data from memory */
    CacheP_wbInv((void *)&rx_AppBuffer[0], rx_bufSize, CacheP_TYPE_ALL);

    UART_Transaction_init(&uartTrans);
    uartTrans.count = rx_bufSize;
    uartTrans.buf = &rx_AppBuffer[0U];

    status = UART_read(gUartHandle[u8_core_sel], &uartTrans);

    if (u8_core_sel == 0) 
    {
        SemaphoreP_pend(&gUartReadDoneSem_gmsl1, SystemP_WAIT_FOREVER);
    }
    else if (u8_core_sel == 1)
    {
        SemaphoreP_pend(&gUartReadDoneSem_gmsl2, SystemP_WAIT_FOREVER);
    } 

    if (SystemP_SUCCESS != (status))
    {
        return status;
    }
    else
    {
        return SystemP_SUCCESS;
    }
}

下面证明了测试结果、我认为一切都运行良好。 对于 SysConfig 配置、波特率为 115200、UART 配置为 DMA+回调模式、我使用的外设硬件为 USART3。  
screenshot-20260625-141439.png
screenshot-20260625-181157.png
直到现在,一切都正常工作,我尝试使用这些封装的 API 来与 GMSL 通信。 SysConfig 不需要进行任何更改、只是其波特率为 1M Hz。 但我发现我无法收到 GMSL 的响应。 进行调试时、我发现 UART_TX 的状态成功、程序在 UART_rxEncap 中阻塞、 这意味着 soc 不会收到 GMSL 的响应。 但是、我可以在 UART_RX 线路上测量正确的信号、如下所示。 我想知道为什么会发生这种情况?

uint8_t tx_buf1[4] __attribute__((aligned(CacheP_CACHELINE_ALIGNMENT)))= {0x79, 0xC5, 0x08, 0x01};
    uint8_t rx_buf1[2] __attribute__((aligned(CacheP_CACHELINE_ALIGNMENT)))= { 0 };
    status = uart_txEncap(0, tx_buf1, 4);
    status = uart_rxEncap(0, rx_buf1, 2);

screenshot-20260625-134548.png

此致、

Bomiao

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

    您好、

    让我通读一下、然后返回给您。

    此致、

    Vaibhav

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

    尊敬的 Fan:

    在我调试时、我发现 UART_TX 的状态成功、程序在 uart_rxEncap 中被阻止、 这意味着 soc 不会收到 GMSL 的响应。 但是、我可以在 UART_RX 线路上测量正确的信号、如下所示。 我想知道为什么会发生这种情况?

    我有几个问题。

    是否先前的发送和接收操作工作正常?

    如果是、那么您是否在随机应用程序运行(例如第 n 次运行)中发现没有发生接收?

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    (1)。  

    以前发送和接收操作是否正常工作?

    以前、UART 配置为回调模式下的中断、此时发送和接收工作正常。 切换到 DMA+回调模式时、就会出现问题。 对于这两种情况、它们使用相同的协议配置(波特率=1M、数据长度=8、停止位=1、奇偶校验=偶数)。

    (2)。

    如果是、那么您是否在随机应用程序运行(例如 n 次运行)中发现没有发生接收?

    不、我不是随机跑的。 每次使用 UART DMA+回调模式与 GMSL 通信时都会出现此问题。

    由于 GMSL 信号(即{0xC3、0x0B})的响应可在物理线路上测量、因此我认为 DMA 传输存在问题。  

    顺便说一下、我使用的 MCU+SDK 版本是 11.01.01.08。 我想检查此版本是否正常。

    此致、

    Bomiao

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

    尊敬的 Fan:

    Btw、我正在使用的 MCU+SDK 版本为 11.01.08。 我想检查此版本是否正常。

    此版本正常。

    您能解释一下如何调用您的读数吗? 也是在回调中再次调用读取,就像在循环格式中一样?

    我正在检查您在上面分享的分段代码、但希望对上述查询稍作澄清。

    【更新的编辑:】您是否确保应用层的 UART 的 RX 缓冲区符合所有这些要求?

    -使用以下方法将 RX 缓冲区与高速缓存行边界对齐:
    UINT8_t uartReceiveBuffer[APP_UART_RECEIVE_BUFSIZE]__attribute__(aligned (CacheP_CACHELINE_ALIZATION));
    -这是强制性的 DMA 传输,以防止部分缓存行共享(假共享),这可能会破坏相邻的数据。

    -在启动 UART_read () 之前,对 RX 缓冲区执行高速缓存 writeback-invalid :
    CacheP_wbInv ((void *)&uartReceiverveBuffer[0U]、APP_UART_RECEIVE_BUFSIZE、CacheP_TYPE_ALL);
    -这确保:
    -任何脏缓存行都被写回内存(写回)。
    -缓存行随后失效,因此在 DMA 填充缓冲区后 CPU 不会提供过时的数据。

    -所有缓存操作都使用 CacheP_TYPE_ALL,这意味着它们适用于所有缓存级别(L1、L2 等),确保 DMA 的完全一致性。

    期待您的回答。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    很抱歉晚回复。

    这个问题已经解决。 问题 与我放置断点的位置有关、这会导致时间序列不一致。  

    非常感谢您的建议和耐心。 该主题可能已关闭。

    此致、

    Bomiao