对于一个MCU,我已经编写了一些汇编例程,这些汇编例程以逐位方式执行专有协议(基于UART)的RX和TX。我该如何测试它们?
可以通过发送数据来测试TX,同时在逻辑分析仪的帮助下,检查所有采样时序是否正确(手动或使用某些脚本)。
另一方面,RX更加困难。一方面,我可以检查我是否正在接收其他人发送的邮件,但另一方面,我如何才能知道RX采样是否正确进行(按时间排列)?阅读评论后,有些事情值得澄清:
答案 0 :(得分:2)
我考虑过要切换一个“调试引脚”以指示何时采样 实际上正在发生,但这会导致采样延迟 程序,因此我不会测试我的原始例程。
使用检测代码进行测试,然后保留检测-或实际上并没有扭曲硬件的近似等效代码-就位。
答案 1 :(得分:0)
您需要一些东西来将数据发送到MCU,也许是第二个MCU。对于旧的8位Atari外设,我已经为6502和Z80编写了类似的代码。这些是半双工协议,因此,每当设备空闲时,都在轮询起始位。检测到起始位后,它将延迟1.5位时间,然后接收8位,位之间的时间为1位。数据例程的接收和发送都经过编码,以获取准确的计时周期数。这些都是旧设备,即使最快的比特率也相对较慢,为每比特19微秒〜= 52600波特。
问题已更新。如果输入和输出指令的运行时间完全相同(周期计数),则可以修改接收代码以传输数据以验证位时间,并确切确认处理器的运行速度。
对于检测起始位并进行1.5位时间等待的时序,您必须计算出检测起始位的最小和最大周期数。最大周期数将是一条输入指令,只是错过了起始位的后沿,测试指令以及返回到输入的循环,然后进行另一次测试,然后掉落到循环中以继续接收。最小周期数应该是一个输入,它刚好抓住了起始位的前沿,进行了测试,然后落入了循环。然后,其余接收代码需要尽可能接近数据位周期的中间进行采样。
以下是4mhz Z80的代码示例,该代码以19微秒== 76循环/数据位的速度接收数据。注释包括每个指令的周期数。起始位到第一个数据位的理想等待时间为114个周期。起始位循环的最小,最大循环时间为20,50个循环。使用额外的延迟加上79个周期的第一个数据位的输入,因此在76,152个周期的最小,最大范围内,检测开始接收第一个数据位的最小,最大周期时间为99,129个周期。其余数据位每位正好以76个周期读取。
LD E,0 ;SET UP
; ; START BIT TO DATA BIT=114
NRXF0: LD A,(FBS) ;(13) WAIT FOR START BIT
AND FBSRXD ;(7)
JP NZ,NRXF0 ;(10)
; ; NOTE: 20 MIN, 50 MAX, 35 AVG
EX (SP),HL ;(19) DELAY
EX (SP),HL ;(19)
LD A,(HL) ;(7)
NRXF1: LD A,(HL) ;(7)
LD A,(HL) ;(7)
LD D,8 ;(7) 8 BITS PER BYTE
; ; 76 CYCLES PER DATA BIT
NRXF2: LD A,(FBS) ;(13) GET DATA BIT
AND FBSRXD ;(7)
ADD A,0FFH ;(7)
RR C ;(8)
PUSH BC ;(11) DELAY
POP BC ;(10)
NOP ;(4)
DEC D ;(4) LP TIL BYTE DONE
JR NZ,NRXF2 ;(12/7)
RET NZ ;(5) DELAY
NRXF4: LD A,(FBS) ;(13) WAIT FOR NEXT START BIT
AND FBSRXD ;(7)
JP NZ,NRXF4 ;(10)
; ; START BIT TO DATA BIT=114
LD (HL),C ;(7) STORE BYTE
LD A,C ;(4) DO CKSUM
ADD A,E ;(4)
ADC A,0 ;(7)
LD E,A ;(4)
INC HL ;(6) ADV ADR
DJNZ NRXF1 ;(13/8) LP IF MORE BYTES