TI论坛
直播中

刘雅真

7年用户 195经验值
私信 关注
[问答]

为什么CC2541的串口波特率自己定义都没问题,一旦设置为一个特殊的波特率就出错?

       由于我特殊应用,串口波特率需要设置为6000,所以就按照用户手册,计算了UXbaud=137,UxGCR=7. 添加到程序里面以后,用串口调试软件进行通信,数据总是出错的,串口调试软件为accessport,我已经验证串口调试助手是没有任何问题的,我在程序中修改如下:
static void HalUARTOpenDMA(halUARTCfg_t *config)
[
  dmaCfg.uartCB = config->callBackFunc;
  // Only supporting subset of baudrate for code size - other is possible.
  HAL_ASSERT((config->baudRate == HAL_UART_BR_9600) ||
                  (config->baudRate == HAL_UART_BR_19200) ||
                  (config->baudRate == HAL_UART_BR_38400) ||
                  (config->baudRate == HAL_UART_BR_57600) ||
                  (config->baudRate == HAL_UART_BR_115200) ||
                  (config->baudRate == HAL_UART_BR_6144));
  if((config->baudRate == HAL_UART_BR_6144))
  [
      UxBAUD = 137;
      UxGCR = 7;

  else
    [
        if (config->baudRate == HAL_UART_BR_57600 ||
            config->baudRate == HAL_UART_BR_115200)
        [
          UxBAUD = 216;
        ]
        else
        [
          UxBAUD = 59;
        ]
      
        switch (config->baudRate)
        [
          case HAL_UART_BR_9600:
            UxGCR = 8;
            break;
          case HAL_UART_BR_19200:
            UxGCR = 9;
            break;
          case HAL_UART_BR_38400:
          case HAL_UART_BR_57600:
            UxGCR = 10;
            break;
          default:
            // HAL_UART_BR_115200
            UxGCR = 11;
            break;
        ]
    ]
  
  if (DMA_PM || config->flowControl)
  [
    UxUCR = UCR_FLOW | UCR_STOP;      // 8 bits/char; no parity; 1 stop bit; stop bit hi.
    PxSEL |= HAL_UART_Px_CTS;         // Enable Peripheral control of CTS flow control on Px.
  ]
  else
  [
    UxUCR = UCR_STOP;                 //2013年8月9日15:44:17 修改  为了适应iso7816
  ]
  UxCSR = (CSR_MODE | CSR_RE);
  if (DMA_PM)
  [
    PxIFG = 0;
    PxIF = 0;
    IENx |= IEN_BIT;
  ]
  else if (UxUCR & UCR_FLOW)
  [
    // DMA Rx is always on (self-resetting). So flow must be controlled by the S/W polling the
    // circular Rx queue depth. Start by allowing flow.
    HAL_UART_DMA_SET_RDY_OUT();
    PxDIR |= HAL_UART_Px_RTS;
  ]
#if HAL_UART_TX_BY_ISR
  UTXxIF = 1;  // Prime the ISR pump.
#endif
]

其它规范的波特率如1200,2400,4800等均没有问题,一旦设置为特殊波特率,就出现问题。

请TI工程师帮助下!谢谢!

回帖(4)

吴纯英

2019-9-29 15:05:36
Are you target to have Baud Rate 6144 instead of 6000
You may try  UxBAUD = 147;UxGCR = 7;
举报

刘雅真

2019-9-29 15:22:22
多谢了,问题找到了,不是单片机的问题,是我程序问题,谢谢~
举报

陈玉英

2019-9-29 15:33:45
請教一下,我用 TI CC2541 BLE 1.3.2 protocol stack, 並且用了 http://processors.wiki.ti.com/index.php/SimpleBLEPeripheral_SerialInterface 當範本參考,加入了 serial port 的功能,在 115200 bps 的時候傳送出來的資料是正確的,但是 19200 bps 就有一堆錯誤,不知道可能是哪裡有問題?謝謝!

我的 e-mail 是 alberthuang314@gmail.com 

這是我設定的 code:

HalUARTInit();
// configure UART
uartConfig.configured = TRUE;
uartConfig.baudRate = HAL_UART_BR_19200;
uartConfig.flowControl = HAL_UART_FLOW_OFF;
uartConfig.flowControlThreshold = 0;
uartConfig.rx.maxBufSize = 128;
uartConfig.tx.maxBufSize = 256;
uartConfig.idleTimeout = 6;
uartConfig.intEnable = TRUE;
uartConfig.callBackFunc = (halUARTCBack_t)cSerialPacketParser;
// start UART
// Note: Assumes no issue opening UART port.
(void)HalUARTOpen( HAL_UART_PORT_0, &uartConfig );
举报

蒋美燕

2019-9-29 15:44:13
引用: yangwenzhen 发表于 2019-9-29 22:26
請教一下,我用 TI CC2541 BLE 1.3.2 protocol stack, 並且用了 http://processors.wiki.ti.com/index.php/SimpleBLEPeripheral_SerialInterface 當範本參考,加入了 serial port 的功能,在 115200 bps 的時候傳送出來的資料是正確的,但是 19200 bps 就有一堆錯誤,不知道可能是哪裡有問題?謝謝!

我的 e-mail 是 albe ...

试下把这条语句注释掉:HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT );
举报

更多回帖

发帖
×
20
完善资料,
赚取积分