PIC24F32KA304-关于UART轮训发送数据出现数据发送不全问题的解决

来源:互联网 发布:政务数据资源管理平台 编辑:程序博客网 时间:2024/05/19 18:46

出现问题的代码:

while(U2STAbits.UTXBF && !U2STAbits.TRMT) continue;

代码中涉及到了两个寄存器:UxSTA<9>UTXBF:UARTx发送缓冲器满状态位(只读)和UxSTA<8>TRMT:UARTx发送移位寄存器空位(只读)

数据手册对这两个寄存器位的描述为:

UTXBF:UARTx 发送缓冲器满状态位(只读)
1 = 发送缓冲器满
0 = 发送缓冲器未满,至少还可写入一个字符TRMT:UARTx 发送移位寄存器空位(只读)
1 = 发送移位寄存器为空,同时发送缓冲器为空(上一次发送已完成)
0 = 发送移位寄存器非空,发送正在进行或等待发送

对于PIC24F32系列的PIC单片机的UART,都具有一个4级深度的FIFO加一个发送移位寄存器(UxTSR),组合起来实际上就有五级深度。


第一次开始发送的时候,由于UxTSR寄存器为空,这样传输数据到UxTXREG寄存器会导致该数据立即传输到UxTSR,但是在第二次及以后的发送则不会。

如果采用上述轮询方式同时查询上述两个寄存器位的话,首先

  • TRMT会变为1,表明发送移位寄存器为空,同时发送缓冲器为空(上一次发送已完成),这个时候其实就可以向UxTXREG(UARTx发送寄存器)写入新的数据了。

  • 但是还需要判断UTXBF,当这个满足判断条件,即该寄存器为1的时候,表明发送缓冲器未满,至少还可写入一个字符。这会导致其传送出现越过数据位的情况。比如说发送40位数据,就会有40 ÷ 5 = 8个数据位可能丢失(实际测试,8位全丢了)

所以,正确的轮训方式为:

while(!U2STAbits.TRMT) continue;



0 1
原创粉丝点击