TI中文支持网
TI专业的中文技术问题搜集分享网站

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谢谢

ROSS ROSS:

         往上顶一下。

         个人感觉问题出在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的函数,就像没有升级一样,还是得找出原因才行。

Aries Lord:

回复 ROSS ROSS:

IAR编译器抽风,把优化关掉,我也遇到过,串口收不到。

jason jason1:

回复 ROSS ROSS:

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

圈圈:

回复 ROSS ROSS:

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

haha haha2:

回复 ROSS ROSS:

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

赞(0)
未经允许不得转载:TI中文支持网 » CC2540,BLE协议栈程序从1.21升级到1.3后,串口DMA部分问题请教。 dmaCfg.rxTail总是小与dmaCfg.rxHead,少1或少2
分享到: 更多 (0)