【发布时间】: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