CC2540,BLE协议栈程序从1.21升级到1.3后,串口DMA部分问题请教。 dmaCfg.rxTail总是小与dmaCfg.rxHead,少1或少2
CC2540MINIDK,串口代码在1.21下运行正常,没开流控制。协议栈代码从1.21升级到1.3.升级完了后,编译时,出现警告:“Warning[w52]: More than one definition for the byte at address 0x6b in common segment INTVEC. It is defined in module "hal_uart" as well as in module "hal_key" ”。经过跟踪,发现是P0端口中断向量0X6B重定义了,HAL_ISR_FUNCTION(port0Isr, P0INT_VECTOR)和按键的一个中断冲突了。#define DMA_PM 0,就没有警告了。
串口函数接收的时候,如果是单步调试情况下,串口接收正确,dmaCfg.rxTail和接收字节数一样。rxBuf里接收字节正确。
但是运行程序时,发送10个字节数据给2540串口,dmaCfg.rxTail变为0x09,rxBuf里接收10个字节正确。uint16 cnt = tail - dmaCfg.rxHead;cnt为9.
读取完字节后,因为是10个字节,dmaCfg.rxHead变为0x0A.接着往后轮询,dmaCfg.rxHead就一直比dmaCfg.rxTail大1,cnt减后就变为了65535,然后整个串口接收就一直轮询时错误,一直调用回调函数。
恳请工程师指点一下,我哪里操作错误了,需要修改什么地方?O(∩_∩)O谢谢
往上顶一下。
个人感觉问题出在static uint16 HalUARTRxAvailDMA(void)函数中,我用1.21版本的函数替换了1.3版本函数中的这个函数后,程序运行正确。
1.3版本中,static uint16 HalUARTRxAvailDMA(void)函数中,
do
{
if (!HAL_UART_DMA_NEW_RX_BYTE(tail))
{
break;
}
HAL_UART_RX_IDX_T_INCR(tail);
} while (tail != dmaCfg.rxHead);
dmaCfg.rxTail = tail;
uint16 cnt = tail - dmaCfg.rxHead;
这几条语句,会导致程序中出现比dmaCfg.rxTail比实际值小的情况。但我还是不明白具体问题出在哪里。
恳请技术支持解答疑问。毕竟版本升级,如果还用1.21的函数,就像没有升级一样,还是得找出原因才行。
IAR编译器抽风,把优化关掉,我也遇到过,串口收不到。
非常感谢你的回复。
只是我是把优化等级调到了none,还是这种情况。接收缓冲区数据正确,但是dmaCfg.rxTail数字不正确。
自己解决了。DMA接收未完成就轮训导致的。
我也出现这个问题 请问你是怎么解决的?
你好,你是怎么解决这个问题的?
请问您的问题怎么解决的,可以指点一下吗?我现在是数据还没接收完就开始轮询其他任务,所以收到的数据会出现乱码不完整的情况