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.

CC2531 USB CDC稳定性问题

Other Parts Discussed in Thread: CC2531

CC2531 USB CDC 运行一段时间之后会断开,之后必须重新拔USB或者芯片复位才能重新正常,不然PC上的端口一直显示被占用。

这样的话一些长时间使用的设备就很麻烦。

  • 是cc2531dongle抓包器吗?
  • 请使用下面的固件测试,也有可能是您的系统的问题,在使用CC2531 最为usb dongle 未发现此问题.
    www.ti.com/.../getliterature.tsp
  • 不是是我自己用CC2531做的硬件
  • USB外面有一个1.5米的延长线。代码使用的是MAC层代码包。
  •  我怀疑是你的硬件的问题,我在使用CC2531USB Dongle时没有出现你这样的问题,你可以用ZNP或者下面的demo 去测试一下。

  • 好的,还有一个问题,打开双串口时,一段时间之后,双串口都有数据接收和发送,一段时间之后就卡死。回调是同一个函数。下面是初始化代码。
    #define MASTER_UART HAL_UART_PORT_0
    #define SLAVE_UART HAL_UART_PORT_1
    /*********************************************************************************************************

    *********************************************************************************************************/
    void SerialApp_Init(void)
    {
    halUARTCfg_t uartConfig;

    if(USE_MAX_UART > 0)
    {
    uartConfig.configured = TRUE; // 2x30 don't care - see uart driver.
    uartConfig.baudRate = HAL_UART_BR_38400;
    uartConfig.flowControl = FALSE;
    uartConfig.flowControlThreshold = 64; // 2x30 don't care - see uart driver.
    uartConfig.rx.maxBufSize = 64; // 2x30 don't care - see uart driver.
    uartConfig.tx.maxBufSize = 64; // 2x30 don't care - see uart driver.
    uartConfig.idleTimeout = 6; // 2x30 don't care - see uart driver.
    uartConfig.intEnable = TRUE; // 2x30 don't care - see uart driver.
    uartConfig.callBackFunc = SerialApp_CallBack;
    HalUARTOpen (MASTER_UART, &uartConfig);

    if(USE_MAX_UART > 1)
    {
    uartConfig.configured = TRUE; // 2x30 don't care - see uart driver.
    uartConfig.baudRate = HAL_UART_BR_38400;
    uartConfig.flowControl = FALSE;
    uartConfig.flowControlThreshold = 64; // 2x30 don't care - see uart driver.
    uartConfig.rx.maxBufSize = 64; // 2x30 don't care - see uart driver.
    uartConfig.tx.maxBufSize = 64; // 2x30 don't care - see uart driver.
    uartConfig.idleTimeout = 6; // 2x30 don't care - see uart driver.
    uartConfig.intEnable = TRUE; // 2x30 don't care - see uart driver.
    uartConfig.callBackFunc = SerialApp_CallBack;
    HalUARTOpen (SLAVE_UART, &uartConfig);
    }
    }
    }
  • 参考下面如何使用UART:
    e2echina.ti.com/.../526637
    不建议在一个回调中处理,可能会有出现中断不能及时释放的等问题。
  • 看代码不是所有的接收回调都是在主循环中查询吗,没有放到中断中处理啊。
  • 不懂你什么意思,请看hal_uart.c

  • Hal_ProcessPoll ->HalUARTPoll -> HalUARTPollDMA -> dmaCfg.uartCB 我看代码是这么一个调用过程,没有看到在中断中处理,您上面说“不建议在一个回调中处理,可能会有出现中断不能及时释放的等问题。”
  • dma是poll 你也可以用ISR看你怎么配置。

    /******************************************************************************
     * @fn      HalUARTOpen
     *
     * @brief   Open a port according tp the configuration specified by parameter.
     *
     * @param   port   - UART port
     *          config - contains configuration information
     *
     * @return  Status of the function call
     *****************************************************************************/
    uint8 HalUARTOpen(uint8 port, halUARTCfg_t *config)
    {
      (void)port;
      (void)config;
    
    #if (HAL_UART_DMA == 1)
      if (port == HAL_UART_PORT_0)  HalUARTOpenDMA(config);
    #endif
    #if (HAL_UART_DMA == 2)
      if (port == HAL_UART_PORT_1)  HalUARTOpenDMA(config);
    #endif
    #if (HAL_UART_ISR == 1)
      if (port == HAL_UART_PORT_0)  HalUARTOpenISR(config);
    #endif
    #if (HAL_UART_ISR == 2)
      if (port == HAL_UART_PORT_1)  HalUARTOpenISR(config);
    #endif
    #if (HAL_UART_USB)
      HalUARTOpenUSB(config);
    #endif
      
      return HAL_UART_SUCCESS;
    }