我正在使用PIC16F18326通过UART传输一些数据(异步,250K波特率)。MCU的运行率为32MHz,实际说明频率为8MHz。
我正在使用以下汇编代码发送4个字节(从0xAA到0xAD-不要介意无用的重复bankmask):
movlw 0xAA
banksel TX1REG
movwf BANKMASK(TX1REG)
movlw 0xAB
banksel TX1REG
movwf BANKMASK(TX1REG)
movlw 0xAC
banksel TX1REG
movwf BANKMASK(TX1REG)
movlw 0xAD
banksel TX1REG
movwf BANKMASK(TX1REG)
goto $
逻辑分析仪的结果是仅发送了0xAA和0XAD(第一字节和最后一个字节)。
我知道我无法背靠背发送4个字节(没有任何延迟或对UART寄存器的某些检查),但是我希望发送0xAA和0xAB(前2个字节)。<<<<<<<<<<<<
根据数据表,如果TX1REG和TSR寄存器是空的(这是我的情况(我从未传输过任何东西),我可以写信给TX1REG以启动第一个字节的发送,然后在至少1个时钟周期之后发送我可以排队第二个字节。根据下面的代码,两个写作之间有3个时钟周期。
那么,怎么了?
请查看有关功能列表的第367页:
- 全双工异步传输和接收
- 两个字符输入缓冲区
- 一字符输出缓冲区
- 可编程8位或9位字符长度
- 在9位模式下的地址检测
- 输入缓冲区超支误差检测
- 接收到字符框架错误检测
- (等)
您正在经历的问题就像缓冲区超支一样。如果这是关于正确的usart,那么您会得到您的预期。
在用下一个字符加载缓冲区之前,更通用的软件对于每个字符循环并等待"缓冲区就绪位"(或任何呼叫)很有用。
找到了原因。写入TX1REG覆盖寄存器所包含的任何内容。文字对任何状态位独立进行(在这种情况下为TXIF)。
当UART准备传输时,它将仅获取TX1REG内容并发送。
在上面的示例中:
Write 0xAA
0xAA is sent immediately
Write 0xAB
0xAB is stored, but not sent because the first send has not finished yet
Write 0xAC
0xAC is stored, but not sent because the first send has not finished yet
Write 0xAD
0xAD is stored, but not sent because the first send has not finished yet
一段时间后,0xAA的传输完成,此时UART发送0XAD,因为它是TX1REG的(最后)内容。