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

关于CC2541的串口问题

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

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

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

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

Barbara Wu:

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

shiquan wu:

回复 Barbara Wu:

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

P0SEL &= 0xF3; // P1.4、P1.5 选择通用IO
P0DIR |= 0x0C; // P1.4、P1.5 设置输出
P0 ^= 0x0C; // P1.4、P1.5 输出置

在P0.3能看到正常波形

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

shiquan wu:

回复 Barbara Wu:

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

Barbara Wu:

回复 shiquan wu:

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

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

Barbara Wu:

回复 shiquan wu:

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

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

里面有UART_DMA的例程

shiquan wu:

回复 Barbara Wu:

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

Barbara Wu:

回复 shiquan wu:

如果使用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;    }}

shiquan wu:

回复 Barbara Wu:

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

#if (HAL_UART_DMA == 1)HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR )#elseHAL_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 写入一个字符后,就再也进不了中断,感觉移位寄存器没有工作一样,请问有哪些情况下会导致移位寄存器不工作呢?

Barbara Wu:

回复 shiquan wu:

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

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

 

 

赞(0)
未经允许不得转载:TI中文支持网 » 关于CC2541的串口问题
分享到: 更多 (0)