【问题标题】:Back-to-back UART transmission with PIC16F18326 - Skipped bytes使用 PIC16F18326 进行背靠背 UART 传输 - 跳过字节
【发布时间】:2019-03-14 18:20:12
【问题描述】:

我正在使用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 个时钟周期。

那么,出了什么问题?

【问题讨论】:

  • "经过至少 1 个时钟周期"... 这可能是指 UART 时钟周期,它可能比 CPU 时钟周期长得多。在 UART 将数据从 TX1REG 传输到 TSR 之前,您可能正在写入第二个字节。 UART 通常使用 16 倍时钟,因此您的情况下的 UART 时钟可能是 4 MHz,这可以解释为什么 TX1REG 在第四次写入时最终为空。
  • @prl 数据表上写着“Tcy”,其中 Tcy 是指令时间。

标签: assembly pic uart microchip


【解决方案1】:

请查看this 的第 367 页,了解功能列表:

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

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

一个更通用的软件位将有助于循环每个字符并等待“缓冲区就绪位”(或任何它被调用的),然后再加载下一个字符的缓冲区。

【讨论】:

  • 我不认为这是缓冲区溢出,原因有两个:正如您所说,UART 支持两个字符的输入缓冲区;请参阅第 371 页,其中发生了背靠背传输。
  • @HBv6:但是你不是用输出方向吗?
  • 你说得对,我误解了……但我认为第 371 页仍然存在?
【解决方案2】:

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

【讨论】:

  • 很高兴您了解问题所在。这和我的回答有什么不同?
  • @wallyk 我想我压力过大,没有完全理解你的答案(尤其是缓冲区溢出)。抱歉,我同意您的回答为最佳解决方案。
  • 谢谢!你似乎没有压力,但很高兴这一切都结束了。有时思考可能导致问题的原因比收集更多信息更有成效。 FWIW。
猜你喜欢
  • 2013-11-25
  • 1970-01-01
  • 2015-09-08
  • 2021-09-26
  • 2017-07-21
  • 2021-12-27
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
相关资源
最近更新 更多