微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 关于CC2541的串口问题

关于CC2541的串口问题

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

你好,在使用CC2541时目前遇到一个很困惑的问题,我的程序希望通过串口发送,同样的程序在开发板上运行能够正常的收发,将程序下载到我们自己的目标板上,就没法发送出去了,跟踪到HalUARTWriteDMA函数体,

if (HAL_UART_DMA_TX_AVAIL() < len)
{
return 0;
}

发现总是在这个地方就返回了,感觉不知是DMA还是UART中断没有产生,DMA缓存满了

不能理解的就是在开发板上就可以。

请问您的目标板的硬件连接和开发板是一样的吗?

串口那个地方没有特殊处理,我用直接端口输出,

P0SEL &= 0xF3; // P1.4、P1.5 选择通用IO

P0DIR |= 0x0C; // P1.4、P1.5 设置输出

P0 ^= 0x0C; // P1.4、P1.5 输出置

在P0.3能看到正常波形

目标板的其他功能都是正常的

会不会是单片机内核中的串口或者DMA有问题了?

单片机?你应该使用的是CC2541本身的DMA吧?是有使用协议栈还是没有使用协议栈?

感觉DMA出问题的可能性很低,但如果有多个板子可以换个板子试一下

开发板上默认使用的是P0_2 P0_3 P_4 P_5做的串口

感觉您应该是把CC2541作为8051在编程,请参考TI已经提供的代码http://www.ti.com/lit/zip/swrc257

里面有UART_DMA的例程

跟踪到了串口中断服务程序HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR ),中断进入了,第一个字符发送后就在没有中断了,是否可以进一步判定是串口问题?

如果使用ISR的模式,根据例程看起来是要有清空标志位的操作的。

/***********************************************************************************
* @fn          UART0_TX_ISR
*
* @brief       Function which completes the UART transmit session, that is it
*              sends the rest of the UART0 packet.
*
* @param       void
*
*/
#pragma vector = UTX0_VECTOR
__interrupt void UART0_TX_ISR(void)
{
    // Clear UART0 TX Interrupt Flag (IRCON2.UTX0IF = 0).
    UTX0IF = 0;

    // Send next UART byte.
    U0DBUF = uartTxBuffer[uartTxIndex++];

    // If no UART byte left to transmit, stop this UART TX session
    if (uartTxIndex >= SIZE_OF_UART_TX_BUFFER)
    {
    // Note:
    // In order to start another UART TX session the application just needs
    // to prepare the source buffer, and trigger the TX isr.
    uartTxIndex = 0;
    IEN2 &= ~IEN2_UTX0IE;
    }
}

困惑啊,我用的是TI的协议栈,串口部分的代码为协议栈自带的,同样的程序,在开发板上能否正常的串口收发,目标板已经精简到只有一个CPU和调试接口了,依然问题存在。

#if (HAL_UART_DMA == 1)
HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR )
#else
HAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR )
#endif
{
HAL_ENTER_ISR();

if (dmaCfg.txHead == dmaCfg.txTail)
{
IEN2 &= ~UTXxIE;
dmaCfg.txMT = 1;
}
else
{
UTXxIF = 0;
UxDBUF = dmaCfg.txBuf[dmaCfg.txHead++];

if ((HAL_UART_DMA_TX_MAX != 256) && (dmaCfg.txHead >= HAL_UART_DMA_TX_MAX))
{
dmaCfg.txHead = 0;
}
}

HAL_EXIT_ISR();
}
#endif

第一次调用HalUARTWrite,能进入以上中断服务程序,UxDBUF = dmaCfg.txBuf[dmaCfg.txHead++]; 向UxDBUF 写入一个字符后,就再也进不了中断,感觉移位寄存器没有工作一样,请问有哪些情况下会导致移位寄存器不工作呢?

请问目标板和开发板的硬件设计不同在哪里?

感觉这个时候要查一下有没有因为硬件设计不同而导致的问题。

 

 

辛苦啊,终于找到原因了,原来是在POWER_SAVING模式下那个流控设置没有起作用

halUARTCfg_t uartConfig;

// configure UART
uartConfig.configured = TRUE;
uartConfig.baudRate = HAL_UART_BR_115200;
uartConfig.flowControl = HAL_UART_FLOW_OFF;
uartConfig.flowControlThreshold = 48;
uartConfig.rx.maxBufSize = DEFAULT_UART_BUF_SIZE;
uartConfig.tx.maxBufSize = DEFAULT_UART_BUF_SIZE;
uartConfig.idleTimeout = 6;
uartConfig.intEnable = TRUE;
uartConfig.callBackFunc = (halUARTCBack_t) GprsSerial_ProcessEvent;
// Note: Assumes no issue opening UART port.
(void)HalUARTOpen(APP_SERIAL_PORT , &uartConfig );

uartConfig.flowControl = HAL_UART_FLOW_OFF;未能起作用,导致移位寄存器没工作

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; // 8 bits/char; no parity; 1 stop bit; stop bit hi.
}

把条件判断改为if (DMA_PM &&config->flowControl)就可以了

您好 能麻烦您把主从机程序给我发一下吗?  我现在主从机通信出现了乱码的问题不知道怎么解决了 。。。谢谢了 1310618698@qq.com

果然这样,这个问题也困惑我很久,明明设置了没有流控,实际使用时候没有流控就不输出。

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

网站地图

Top