您好
z-stack 預設使用DMA 方式,baudRate 2400~115200
但我周邊裝置是
baudRate = 1200
EVEN
8 bit
stop bit = 1
我修改_hal_uart_dma.c
增加了
case HAL_UART_BR_1200:
UxGCR = 5;
dmaCfg.txTick = 274; UxUCR = UCR_STOP | UCR_PARITY | UCR_D9 | UCR_BIT9; break;
UART 結構參數
halUARTCfg_t uartConfig;
uartConfig.configured = TRUE; // 2×30 don't care – see uart driver.
uartConfig.baudRate = SERIAL_APP_BAUD;
uartConfig.flowControl = FALSE;
uartConfig.flowControlThreshold = 64; // 2×30 don't care – see uart driver.
uartConfig.rx.maxBufSize = 128; // 2×30 don't care – see uart driver.
uartConfig.tx.maxBufSize = 128; // 2×30 don't care – see uart driver.
uartConfig.idleTimeout = 6; // 2×30 don't care – see uart driver.
uartConfig.intEnable = TRUE; // 2×30 don't care – see uart driver.
uartConfig.callBackFunc = BZ530_SerialApp_CallBack;
都只能收 到前面 幾個字元
請問是否哪邊我沒注意到呢?
謝謝~~
gancheng:
HI,我不是TI的工程师,但这个问题我可以回答你,我想TI 的工程师在设计Z-STACK的时候并没有把1200的波特率考虑进去,而Z-STACK中串口接收数据有一个超时时间,而这个超时时间对1200的波特率来说太短了,所以接收数据不完整。
lihua jia:
回复 gancheng:
请教高人
我是用CC2530 的usart0外接了MAX3485芯片,用P0.1作为发送接收使能控制,P0.2、P0.3作为Rx和Tx,做了一个485的接口,发送数据用了协议栈的HalUARTWrite函数,每次在调用HalUARTWrite之前将P0.1拉高(Tx使能),调用后在DMA的TX完成中断函数中将P0.1拉低。
我遇到的问题是发送一个数组的数据时,如果在DMA的TX完成中断函数中设置断点运行,接收结果是对的;如果全速运行,总会丢掉最后一个字节,而且倒数第二个字节会变成FF。
如果发送字符串,会在最后多一个FF的字节
这是什么原因呢?有设置不对的地方吗?我的波特率是115200的
luo qi:
回复 lihua jia:
根据这个现象,可以确定二楼说的是正确的。
cpu发送数据到fifo或者uart串并转换部分后,关闭485芯片的发送使能
但是实际情况是,cpu运行速度很快,uart串化部分还没把数据都发走,这时你关闭了485芯片的发送使能,就是强行把最后一次数据给切断了,接收方会在数据尾部发现错误
解决方法很简单,uart寄存器里一般有LSR,里边有一个TEMT的(omapl138是这个名字,你的应该也接近),该寄存器会检测fifo和串化状态,
该寄存器为1的时候才可以关闭485芯片的发送使能,这样就没问题了