微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > CC2540,BLE协议栈程序从1.21升级到1.3后,串口DMA部分问题请教。 dmaCfg.rxTail总是小与dmaCfg.rxHead,少1或少2

CC2540,BLE协议栈程序从1.21升级到1.3后,串口DMA部分问题请教。 dmaCfg.rxTail总是小与dmaCfg.rxHead,少1或少2

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

           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接收未完成就轮训导致的。

我也出现这个问题 请问你是怎么解决的?

你好,你是怎么解决这个问题的?

请问您的问题怎么解决的,可以指点一下吗?我现在是数据还没接收完就开始轮询其他任务,所以收到的数据会出现乱码不完整的情况

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

网站地图

Top