微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > CC2540 ble1.4.1 uart dma 接收假死

CC2540 ble1.4.1 uart dma 接收假死

时间:10-02 整理:3721RD 点击:

使用ble1.4.1编写CC2540uart基于dma的通信程序时,串口接收正常一段时间后出现不再进入回调函数的现象,感觉像是串口DMA不再触发。但是此时的串口打印是好用,也就是说串口接收挂了发送没有问题,这让我很困惑。

IAR工程的宏配置如下:

IAR宏配置如下

INT_HEAP_LEN=3072
HALNODEBUG
OSAL_CBTIMER_NUM_TASKS=1
HAL_AES_DMA=TRUE
HAL_DMA=TRUE
xPOWER_SAVING
xPLUS_BROADCASTER
HAL_LCD=FALSE
HAL_LED=FALSE
HAL_KEY=FALSE
HAL_UART=TRUE
HAL_ADC=TRUE
HAL_UART_ISR=FALSE
HAL_UART_DMA=TRUE

串口初始化配置如下:

void serialInit( )
{
  halUARTCfg_t uartConfig;

  uartConfig.configured           = TRUE;
  uartConfig.baudRate             = SBP_UART_BR;//波特率
  uartConfig.flowControl          = SBP_UART_FC;//流控制
  uartConfig.flowControlThreshold = SBP_UART_FC_THRESHOLD;//流控制阈值
  uartConfig.rx.maxBufSize        = SBP_UART_RX_BUF_SIZE;//uart接收缓冲区大小
  uartConfig.tx.maxBufSize        = SBP_UART_TX_BUF_SIZE;//uart发送缓冲区大小
  uartConfig.idleTimeout          = SBP_UART_IDLE_TIMEOUT;
  uartConfig.intEnable            = SBP_UART_INT_ENABLE;//开启中断
  uartConfig.callBackFunc         = sbpSerialAppCallback;//uart接收回调函数,在该函数中读取可用uart数据

  // start UART
  // Note: Assumes no issue opening UART port.
  (void)HalUARTOpen( SBP_UART_PORT, &uartConfig );

  return;
}

回调函数如下:

void sbpSerialAppCallback(uint8 port, uint8 event)
{
uint8 *ptempBuf;
uint8 numBytes;

ptempBuf = tempBuf[Line];//指定信息存储地址
interface.led2 = 4;//调试用指示灯闪烁

if ( (numBytes = Hal_UART_RxBufLen(port)) > 0 )//返回串口缓存内可读的字节数
{
(void)HalUARTRead (port, pktBuffer, numBytes);
osal_memcpy(ptempBuf, pktBuffer, numBytes);//DMA拷贝至任务数据存储内存

}
}


你先在callback中直接回送串口收到的数据测试试试,注意你的pkBuffer要设大点,大于你最大可能收到的数据。

我这样侧过几百万次收发,没有问题。

if ( (numBytes = Hal_UART_RxBufLen(port)) > 0 )//返回串口缓存内可读的字节数
{
(void)HalUARTRead (port, pktBuffer, numBytes);
 HalUARTWrite(port, pktBuffer, numBytes)

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top