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:UART 复位

Guru**** 2524550 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/736855/msp432p401r-uart-reset

器件型号:MSP432P401R

您好!

我在 MSP432和另一个器件之间进行了 UART 通信。 我观察到、当另一个 UART 器件在 UART 传输过程中关闭时、MSP432会挂起、无法进行更多通信。 MSP432运行 FreeRTOS 并使用 simplelink UART 驱动程序。 当另一个器件重新启动时、我尝试按 以下顺序重置 UART:

UART_Params uartParams;

UART_Close (UART0);

UART_Params_init (&uartParams);
uartParams.writeDataMode = UART_DATA_binary;
uartParams.readDataMode = UART_DATA_binary;
uartParams.readReturnMode = UART_return_full;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.波特 率= 115200;
uartParams.parityType = UART_PAR_even;

UART = UART_OPEN (UART0、 uartParams (&U) 

应 遵循哪个正确的 UART 重新初始化序列?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    在我看来、您不应重置 UART、但在任何违反协议的情况下都应使用超时。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我同意 Tomasz。 是否使用了超时设置的读取方法?
    -Bob L.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们的设置如下:

    1) 1)我们在开发板上安装了 FPGA 和 MSP432、它们都通过 UART 进行通信

    2) 2) FPGA 和 MSP 之间没有其他信号/引脚告诉我们 FPGA 何时开始通信。

    3) 3)我们在 MSP432上运行 FreeRTOS

    ------------------------------------------------------- +
    | 开发板 |
    | --------------- + --------------- + |
    | | | | | |
    | | FPGA TX +--- >|RX MSP432 | |
    | | | | | |
    | | RX |<---------- TX | |
    | | | | | |
    | +-++-++---- + --------------- + |
    | |+---
    +-++-++---------------- --------------- + 

    我们面临的问题是:

    1) 1)在 MSP432上、我们已将 UART 设置为以115200波特运行并处于阻塞模式。

    2)热重启:当 MSP 和 FPGA 均通电且 FPGA 短暂复位时、然后当 FPGA 开始与尚未重新启动的 MSP 通信时。 此时、我们看到 MSP UART 读取调用被卡住、通信不起作用。

    3)冷重启:FPGA 和 MSP 均关闭并通电时。 MSP UART 通信再次受阻、在我们复位/重新刷新 MSP432之前无法正常工作。

    在这两种情况下、我们都看到 FPGA 发送0xFF。 我们在示波器和 MSP UART 缓冲器上看到了这一点(使用调试器)。 但是、UART 读取调用永远不会返回。

    我们尝试切换到基于回调的 UART 通信、以查看它是否有用、即使有数据传入 MSP、回调读取也会超时。 这是我们的回调实现

    /* UART 读取回调函数*/
    
    void UARTCmdReadCallback (UART_Handle handle、void *buf、size_t count){
    
    if (count!= 0)
    
    {
    
    SEM_POST (&cmd_UART_Rx_sem);
    
    }
    
    //
    
    线程进行的 UART 读取调用。*/ int32_t UART_Cmd_read (char *读取缓冲区、uint8_t ByteCount){
    
    int32_t Retimespec、temp;
    
    struct &wait_time;
    
    clock_gettime (clock_gettime、wait_time;wait_time)
    
    wait_time.tv_sec += 1;
    
    while (1)
    
    {
    
    RetVal = UART_Read (UART_cmd、ReadBuffer、ByteCount);
    
    //if (!Semaphore_pend (&cmd_UART_Rx_sem、500))
    
    temp = SEM_timedwait (&cmd_UART_Rx_sem、&wait_time)
    
    log_info_MSG ("\n\r Sem_timed wait returned %d \n"temp);
    
    如果 temp = 0
    
    {
    
    返回 RetVal;
    
    }
    
    UART_readCancel (UART_cmd);
    
    //log_error_MSG ("\n\r UART RX 超时");
    
    //RetVal = UART_STATUS_ERROR;
    
    }
    
    }
    

    我们需要以下方面的帮助:

    1) 1)为什么即使有数据传入 MSP、UART 回调也会超时(我们已通过范围验证了这一点)?

    2) 2)如果读取被阻止、为什么 UART 读取没有完成(我们尝试读取1字节)?

    3) 3)我们有一个信号可以知道重新启动何时发生、并且重新初始化 UART 是否有助于我们的原因?

    我们使用的是 simplelink_msp432p4_sdk_2_20_00_12 SDK。 我们看到一些带有2_30 SDK 的散射:

    -- ti/drivers/uart/UARTMSP432.c 2018-07-24 17:11:10.112853350 -0700

    ++/home/manjukum/patches/source/ti/drivers/uart/UARTMSP432.c 2018-09-21 12:00:36.000000000 -0700

    @@-565、9 +565、14 @@

      bufferEnd =(无符号字符*) object->readBuf + object->readSize;

      while (object->ReadCount){

    +    键= Hwip_disable();

        if (RingBuf_get (&object->ringBuffer、readin)< 0){

    +       /*并非所有数据都已读取*/

    +       object->state.drafByISR = true;

    +       Hwip_restore (key);

          中断;

        }

    +    Hwip_restore (key);

        DebugP_log2 ("UART:(%p)读取'0x%02x"、

          (((UARTMSP432_HWAttrsV1 const *)(handle->hwAttrs))->baseAddr、@@-576,12+581,8 @@

        *(unsigned char *)(bufferEnd - object->ReadCount *

          sizeof (unsigned char)= readin;

    -    KEY = Hwip_disable();

    -

        object->ReadCount--;

    -    Hwip_restore (key);

    -

        if ((object->state.readDataMode = UART_DATA_text)&&

          (object->state.readReturnMode = UART_return_NEWLINE)&&

          (readin ='\n'){

    @@-605、9 +606、6 @@

          }

        }

      }

      -否则{

    -object->state.drafByISR    = true;

      -}

      返回(0);

    我们将尝试将此更改添加到2_20 SDK、然后再次尝试更新该帖子。

    这是否足以重新初始化 UART?

    UART_Params uartParams;
    
    LOG_ERROR_MSG ("\n\n\r 重新初始化 UART\n");
    
    UART_CLOSE (UART_cmd);
    
    /*创建一个数据处理关闭的 UART。 *
    UART_PARAMS_INIT (uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.readDataMode = UART_DATA_BINARY;
    uartParams.readReturnMode = UART_return_full;
    uartParams.readEcho = UART_ECHO_OFF;
    uartParams.baudrate = 115200;
    
    uartParams.parityType = UART_PAR_even;
    uartParams.readMode = UART_MODE_CALLACK;
    uartParams.readCallback = UARTCmdReadCallback;
    
    HWREG16 ((((UARTMSP432_HWAttrsV1 *)(UART_cmd->hwAttrs))->baseAddr)|= 0x1;
    usleep(500);
    HWREG16 ((((UARTMSP432_HWAttrsV1 *)(UART_cmd->hwAttrs))->baseAddr)&&~0x1;
    usleep(500);
    
    memset (UART_cmd->object、0x0、sizeof (UARTMSP432_Object));
    
    UART_cmd = UART_OPEN (UART1、uartParams); 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您有一个未完成的 UART 回调、那么我建议您继续使用 UART_readCancel() )。
    -Bob