如何测试位域通信的汇编例程

时间:2019-04-20 08:00:39

标签: testing assembly embedded microcontroller uart

对于一个MCU,我已经编写了一些汇编例程,这些汇编例程以逐位方式执行专有协议(基于UART)的RX和TX。我该如何测试它们?

可以通过发送数据来测试TX,同时在逻辑分析仪的帮助下,检查所有采样时序是否正确(手动或使用某些脚本)。

另一方面,RX更加困难。一方面,我可以检查我是否正在接收其他人发送的邮件,但另一方面,我如何才能知道RX采样是否正确进行(按时间排列)?
例如,我的RX例程可以通过在“位窗口”的边缘而不是中间进行采样来返回正确的数据。
我曾想过要触发一个“调试销”来指示实际何时进行采样,但是这会导致采样过程出现延迟,因此我不会测试我的原始例程。

阅读评论后,有些事情值得澄清:

  • 我知道硬件UART更好(但是要看情况),但是我不能使用它。这不是“您是否尝试过此……?”的问题;
  • 我知道怎么做(我已经编写了汇编例程);
  • 我无法使用TX连接到RX,因为我仅使用1条线(通信是半双工的);
  • 我在问如何测试RX采样时序,而不是如何实现UART。

2 个答案:

答案 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