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

时间:2019-03-14 18:20:13

标签: assembly pic uart microchip

我正在使用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个字节)。 / p>

根据数据表,如果TX1REG和TSR寄存器为空(这是我的情况,因为我从未发送过任何东西),则可以写入TX1REG以开始发送第一个字节,然后至少经过1个时钟周期我可以排队第二个字节。根据下面的代码,两次写入之间有3个时钟周期。

那么,怎么了?

2 个答案:

答案 0 :(得分:4)

请查看this的第367页有关功能列表的信息:

  • 全双工异步发送和接收
  • 两个字符的输入缓冲区
  • 一个字符的输出缓冲区
  • 可编程的8位或9位字符长度
  • 9位模式下的地址检测
  • 输入缓冲区溢出错误检测
  • 接收字符成帧错误检测
  • (等)

您遇到的问题就像缓冲区溢出一样。如果这是关于正确的USART,那么您将得到期望。

更通用的软件位对于循环每个字符并在将下一个字符加载到缓冲区之前等待“缓冲区就绪位”(或称为“缓冲区就绪位”)很有用。

答案 1 :(得分:1)

找到原因。写入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的(最后)内容。