关于CC2541的串口问题
你好,在使用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
果然这样,这个问题也困惑我很久,明明设置了没有流控,实际使用时候没有流控就不输出。