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.

[参考译文] CC2340R5-Q1:关于 UART 功能的事件回调功能

Guru**** 2833925 points

Other Parts Discussed in Thread: CC2340R5-Q1

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1627894/cc2340r5-q1-about-event-callback-function-for-uart-function

器件型号: CC2340R5-Q1

您好:

我将使用 CC2340R5-Q1 并使用 SDK 版本 9.14 开发软件。 目前、我正在为客户开发一款产品并实现/验证 UART 功能。 作为异常条件检查的一部分、我特意输入格式错误的数据并想决定当 CC2340R5-Q1 检测到错误时软件应如何响应。 为此、我正在调查 CC2340R5-Q1 如何检测 UART 错误。 我观察到以下行为:

  • 当接收到没有 STOP 位的 UART 数据时、不会调用事件回调函数。 而是调用读取回调函数。
  • 在读取回调函数中、状态报告为正常/正常。

我的问题是:

  1. 如果接收到格式错误的数据(在本例中为没有 STOP 位的数据)、是否应该调用事件回调函数?
  2. 如何在软件中将此情况检测为错误?

 

void Isr_Uart_Rx(UART2_Handle handle, void *buf, size_t count, void *userArg, int_fast16_t status)
{

    GPIO_toggle(CONFIG_GPIO_DIO13);
    uart_status = status;
    UART2_read(uart2_handle, &uart2_buf[0], (size_t)5, NULL);
}

void Isr_Uart_Event(UART2_Handle handle, uint32_t event, uint32_t data, void *userArg)
{

    GPIO_toggle(CONFIG_GPIO_DIO0);
    uart_event = event;
    uart_event_data = data;
}


void Uart_Setup(void) 
{
    UART2_Params uart2_params;

    UART2_Params_init(&uart2_params);
    uart2_params.readMode = UART2_Mode_CALLBACK;
    uart2_params.readCallback = Isr_Uart_Rx;
    uart2_params.readReturnMode = UART2_ReadReturnMode_PARTIAL;
    uart2_params.eventCallback = Isr_Uart_Event;
    uart2_params.eventMask = UART2_EVENT_FRAMING | UART2_EVENT_PARITY | UART2_EVENT_BREAK | UART2_EVENT_OVERRUN;
    uart2_params.baudRate = 500000;
    uart2_handle = UART2_open(CONFIG_UART2_0, &uart2_params);
    UART2_read(uart2_handle, &uart2_buf[0], (size_t)5, NULL);
}

 

Fig1.png

 我会附上我检查过的代码和示波器波形以供参考。谢谢您的帮助。

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

    您好:

    我目前正在研究这一问题、并将尽快作出答复。

    感谢您的耐心。

    此致、
    Josh Alderson  

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

    您好:

    是的、根据 API 设计、对于组帧错误、应调用事件回调、但由于 UART 驱动程序中的限制、中断当前不起作用。

    RX 回调是由于 RX 超时事件而触发的、因此是的、这是预期的行为。

    要检测此错误、我建议在 RX 回调中创建自己的错误检查。
    您可以使用 API UARTGetRxError 检查 UART 寄存器错误状态。 这将在 UART_O_RSR_ECR 寄存器中返回错误状态。 uart.h 中列出了该可能返回的值

    这样做将使您能够根据需要处理错误。

    一个简单的例子是:
     

    #include

    #include DeviceFamily_constructPath (driverlib/uart.h)

     

    UART2LPF3_HWAttrs const *hwAttrs = handle->hwAttrs;

    uint32_t errStatus;

     

    errStatus = UARTGetRxError (hwAttrs->baseAddr);

     

       if (errStatus!= 0)

       {

           /*检测到错误 — 确定类型*/

           IF (errStatus 和 UART_RXERROR_FRAME)

           {

               /*检测到组帧错误(缺少停止位)*/

               uart_event = UART2_event_framing;

               GPIO_TOGGLE (CONFIG_GPIO_DIO0); /*指示检测到错误*/

           }

           IF (errStatus & UART_RXERROR_PARITY)

           {

               UART_EVENT = UART2_EVENT_PARITY;

           }

           IF (errStatus & UART_RXERROR_BREAK)

           {

               UART_EVENT = UART2_EVENT_BREAK;

           }

           

           /*清除错误*/

           UARTClearnRxError (hwAttrs->baseAddr);

           

           /*处理错误条件*/

           /*...您的错误处理代码...*/

       }

    请尝试这样的方法、如果可以、请告诉我。

    此致、
    Josh Alderson

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

    您好、Josh、

    谢谢你。 按照您的说明并更改您建议的代码、我能够检测异常状态并在读取回调函数内识别错误详细信息。 但是、我有两个问题需要确认:

    1. 我知道接收事件回调当前不运行。 即使这个回调记录在 API 引用中、是否预计这个回调仍然无法正常工作?
    2. 传输事件回调是否也无法以相同的方式运行?

    感谢您的持续帮助。

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

    您好:

    1. 不,这似乎是 SDK 中的一个限制。 接收错误事件
      针对组帧错误 (UART2_EVENT_FRAME)、奇偶校验错误的回调
      (UART2_EVENT_PARITY) 和中断错误 (UART2_EVENT_BREAK) 当前不存在
      触发是因为驱动器中未启用所需的硬件中断。
      请注意、UART2_EVENT_OVERLAR 可正常运行。 感谢您的提问
      这一点引起了我的注意。 我会向驾驶员团队提出这个问题。

    2. 不可以、发送事件回调 (UART2_EVENT_TX_BEGIN 和 UART2_EVENT_TX_FINISED) 工作正常。

    我建议在您的读取中使用权变措施(轮询 UARTGetRxError ())

    回调)、因为任何驱动程序更改都将在未来的 SDK 版本中进行。

    
    

    此致、

    Josh Alderson