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.

[参考译文] RTOS/TMDSEVM572X:UART 在中断模式下使用

Guru**** 2554840 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/607954/rtos-tmdsevm572x-uart-use-in-interrupt-mode

您好!

我在 UART 回调模式下初始化 UART 3

char scanPrompt_try[256];

UART_Params uartParams;
/* UART SoC 初始化配置*/
UART_HwAttrs UART_cfg;

UART_INIT();
/********* UART_IN_Callback();******* /
/*创建回叫信标*/

/*获取默认的 UART 初始化配置*/
UART_socGetInitCfg (UART_instance、&UART_cfg);
UART_cfg.edmaHandle =空;
UART_cfg.dmaMode = false;
UART_cfg.loopback = false;

UART_socSetInitCfg (UART_instance、&UART_cfg);

/*为读取设置回调模式*/
UART_PARAMS_INIT (uartParams);
uartParams.readCallback = UART_callback;
uartParams.readMode = UART_MODE_CALLACK;
UART = UART_OPEN (UART_Instance、&uartParams);

while (1)

COUNT_ENCODER=UART_READ (UART、&scanPrompt_try、1);
if (Count_Encoder!=UART_ERROR)

ACNT=ACNT+1;
UART_putNum_Anjana (ACnt);


if (ACnt>=196)

ACNT=0;
UART_WRITE (UART、&scanPrompt_try、3);

UART_Read 返回-1和0、但不返回读取的字节数。 请告诉我为什么会这样?

在读取一些字节后、许多情况下会给出运行时错误。 运行时错误为  CortexA15_0:未处理的 ADP_Stopped 异常0x20023

谢谢、

Anjana Pathak

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我对代码进行了一些更改、并删除了运行时错误。

    因为我在中断/回调模式下使用 UART 3。 我正在初始化函数中的 UART 参数、如下所示。 主文件中的一个回调函数。 当两个字节之间的时间差为100ms 时、此回调函数正常工作、但如果时间差降至7.5ms、则停止接收字节、回调函数不被调用。  

    请告诉我、我缺少一些编译过程或网络来执行一些其他设置。

     

    UART_Params uartParams;
    /* UART SoC 初始化配置*/
    UART_HwAttrs UART_cfg;
    SemaphoreP_Params semParams;
    UART_INIT();
    /********* UART_IN_Callback();******* /
    /*创建回叫信标*/
    UART_osalSemParamsInit (semParams);
    semParams.mode = SemaphoreP_Mode_binary;
    callbackSem = UART_osalCreateBlockingLock (0、semParams);
    /*获取默认的 UART 初始化配置*/
    UART_socGetInitCfg (UART_instance、&UART_cfg);
    UART_cfg.edmaHandle =空;
    UART_cfg.dmaMode = false;
    UART_cfg.loopback = false;

    UART_socSetInitCfg (UART_instance、&UART_cfg);

    /*为读取设置回调模式*/
    UART_PARAMS_INIT (uartParams);
    uartParams.baudrate = 76800;
    uartParams.parityType=UART_PAR_even;
    uartParams.readCallback = UART_callback;
    uartParams.readMode = UART_MODE_CALLACK;
    /*uartParams.writeCallback =空;
    uartParams.writeMode = UART_MODE_CALLBACK;*/
    UART = UART_OPEN (UART_Instance、&uartParams);
    如果(UART == NULL)

    转至 Err;


    addrScanPrompt=(int32_t) scanPrompt;
    if (UART_READ (UART、(void *) addrScanPrompt、input_length)==UART_ERROR)

    转至 Err;

    while (1)

    if (NextSerialData)

    NextSerialData=0;
    HeadingMark=scanPrompt[0];
    UART_putNum_Anjana (AzimuthCnt);
    UART_WRITE (UART、&scanPrompt、5);
    memset (scanPrompt、0、sizeof (scanPrompt));
    UART_READ (UART、(void *) addrScanPrompt、input_length);
    if (ACnt>=96)

    ACNT=0;


    void UART_callback (UART_Handle handle、void *buf、size_t count)

    ACNT=ACNT+COUNT;
    NextSerialData=1;
    //memset (buf、0、input_length);
    UART_osalPostLock (callbackSem);

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

    请回复。。

    是否存在与 UART 中断可写性相关的任何内容。

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

    我正在与 UART LLD 开发人员联系、以了解导致此驱动程序问题的原因。 我们在另一个器件上遇到了类似的问题、并通过调整该器件上的 UART FIFO 触发电平来解决该问题。 我正在检查 AM57xx 器件上是否也提交了此补丁。

    您是否尝试使用基于 EDMA 的实现来查看问题是否仍然存在。 我将在收到开发人员关于此问题的回复后尽快回复您。

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

    好的、谢谢、等待解决方案。

    不、我没有尝试使用基于 EDMA 的实现。

    我想我需要为此进行设置  

    UART_cfg.dmaMode  =真;

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

    您好、Rahul、

    在主文件中的以下设置的帮助下、我尝试更改 UART 参数的奇偶校验

    UART_PARAMS_INIT (uartParams);
    uartParams.baudrate = 76800;
    uartParams.parityType= UART_PAR_even;
    uartParams.readCallback = UART_callback;
    uartParams.readMode = UART_MODE_CALLACK;
    /*uartParams.writeCallback =空;
    uartParams.writeMode = UART_MODE_CALLBACK;*/

    UART = UART_OPEN (UART_Instance、&uartParams);

    但驱动程序具有相同的奇偶校验、即无。 它不会将 parityType 更改为奇数或 偶数。

    如何根据我的要求更改 parityType 以建立正确的通信。

    谢谢、

    Anjana Pathak

     

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

    UART 驱动程序开发人员认为您最初报告的问题可能是由 RX FIFO 触发级别大小引起的。 当前默认的 RX FIFO 触发深度设置为8个字符、如果 UART 读取大小在每次读取事务中都较大、我建议设置更大的触发级别(UART_RXTRIGLVL_16或 UART_RXTRIGLVL_56)

    您能否尝试更新文件中的参数并重新构建驱动程序并进行尝试。

    对于奇偶校验问题、 我能够创建一个测试用例并看到参数正在更新、但当我将主机上的奇偶校验配置为偶校验时、它确实能够正确检测串行传输、并显示吉位数据、但当我将主机设置为奇偶校验无时、 它显示了正确的数据。
    我将需要更多时间来调试此问题并返回给您。

    此致、
    Rahul

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

    我将驱动程序设置为使用偶校验、然后将主机串行连接配置为也使用偶校验、但当发生传输时、主机无法正确解释数据、但当我将主机设置为无奇偶校验时、 正确检测到传输、表明驱动器仍在使用无奇偶校验设置进行传输。 请参阅以下屏幕截图:

    在进一步分析中、我查看了 UART_LCR 寄存器、即使驱动程序调用、奇偶校验也不会被启用

    如果我手动启用奇偶校验类型1和奇偶校验使能、则驱动程序工作正常、因此我认为问题出在 UARTLineCharacConfig CSL 函数上。  

    我提出了申请并发出了问题、并将在明天着手解决问题。

    此致、

    Rahul

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

    非常感谢 Rahul 的分析。

    因此,我需要在代码中进行更改...

    平路机、

    Anjana Pathak

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

    Anjana、

    我可以修复您的问题、以解决您的 UART 奇偶校验问题。

    请对 UART 驱动程序进行以下更新以解决此问题:

    diff --git a/UART.h b/UART.h
    index 09861f0..526f874 100644
    ---- a/UART.h
    ++ b/UART.h
    @@-294,10+294,10 @@ typedef enum UART_STOP_e{
    */
    typedef enum UART_PAR_e{
    UART_PAR_NONE = 0、/*!<无奇偶校验*/
    - UART_PAR_EVEN = 1、/*!<奇偶校验位是偶校验*/
    - UART_PAR_ODD = 2、/*!<奇偶校验位是奇数*/
    - UART_PAR_ZERO = 3、 /*!<奇偶校验位始终为零*/
    - UART_PAR_ONE = 4 /*!<奇偶校验位始终为1 */
    + UART_PAR_ODD = 1、/*!<奇偶校验位为
    偶数*/
    + UART_PAR_ONE = 5、 /*!<奇偶校验位始终为1 */
    + UART_PAR_ZERO = 7 /*!<奇偶校验位始终为零*/
    }UART_PAR;
    
    /*!
    

    diff --git a/src="/v1/UART_v1.c b/src="/v1/UART_v1.c
    index 01e4fe9..772def5 100644
    -- a/src/v1/UART_v1.c
    ++ b/src="/v1/UART_v1.c
    @@-8457 +8457 @@ UART_Handle v1.c +++ UART_params * gore_handle v1.v1.c (UART_params)
    /*配置 UART 线路特性*/
    UARTLineCharacConfig (hwAttrs->baseAddr、
    (object->params.dataLength | object->params.stopbits)、
    - object->params.parityType);
    + (object->params.parityType << CSL_UART_LCR_paracy_EN_shift);
    

    我已附加修复此问题的两个文件的更新版本。

    e2e.ti.com/.../uart_2D00_lld_2D00_updates.zip

    请告诉我们这是否解决了您的奇偶校验问题

    此致、

    Rahul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于触发电平变化、您可以在 pdk_am57xx_1_0_7\packages/ti\drv\uart\test\src\main_UART_test.c 下提供的 UART 测试示例中查看 UART_test_fifo_trglvl 和 UART_test_trglvl 函数

    我们提供了此测试的 DMA 版本和非 DMA 版本供您参考。

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

    非常感谢 Rahul

    现在它正在使用偶校验...

    此致、

    Anjana Pathak