Assembly 带PIC16F18326的背对背UART传输-跳过字节

Assembly 带PIC16F18326的背对背UART传输-跳过字节,assembly,pic,uart,microchip,Assembly,Pic,Uart,Microchip,我正在使用a通过UART(异步,250k波特率)传输一些数据。MCU以32MHz运行,实际指令频率为8MHz 我使用以下汇编代码发送4个字节(从0xAA到0xAD-不要介意无用的重复银行掩码): 逻辑分析仪的结果是只发送了0xAA和0xAD(第一个字节和最后一个字节) 我知道我不能背靠背地发送4个字节(没有任何延迟,或者对UART寄存器进行一些检查),但我希望发送0xAA和0xAB(前2个字节) 根据数据表,如果TX1REG和TSR寄存器为空(这是我的情况,因为我从未传输任何内容),我可以写入T

我正在使用a通过UART(异步,250k波特率)传输一些数据。MCU以32MHz运行,实际指令频率为8MHz

我使用以下汇编代码发送4个字节(从0xAA到0xAD-不要介意无用的重复银行掩码):

逻辑分析仪的结果是只发送了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的(最后一个)内容。

我不认为这是缓冲区溢出,原因有二:如您所述,UART支持两个字符的输入缓冲区;请参阅第371页的背对背传输。@HBv6:但您不是在使用输出方向吗?您是对的,我误解了。。。但我认为371页仍然有效,“在至少一个时钟周期之后”。。。这可能是指UART时钟周期,它可能远长于CPU时钟周期。可能是在UART将数据从TX1REG传输到TSR之前写入第二个字节。UART通常使用16×时钟,因此您的UART时钟可能为4 MHz,这可以解释为什么TX1REG在第四次写入时最终为空。@prl数据表上显示“Tcy”,其中Tcy是指令时间。很高兴您理解了这个问题。这和我的答案有什么不同?@wallyk我想我压力太大了,没有完全理解你的答案(尤其是缓冲区溢出)。对不起,我同意你的答案为最佳解决方案。谢谢!你看起来没有压力,但很高兴结束了。有时候,思考可能导致问题的原因比收集更多信息更有效率。不管好坏
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