Testing 如何测试位碰撞通信';汇编程序

Testing 如何测试位碰撞通信';汇编程序,testing,assembly,embedded,microcontroller,uart,Testing,Assembly,Embedded,Microcontroller,Uart,对于一个MCU,我已经编写了一些汇编例程,以一种比特爆炸的方式执行专有协议(基于UART)的接收和发送。我如何测试它们 TX可以通过发送数据进行测试,同时,在逻辑分析仪的帮助下,检查所有采样的计时是否正确(手动或使用一些脚本) 另一方面,RX则更为困难。一方面,我可以检查我是否接收到其他人发送的信息,但另一方面,我如何知道RX采样是否正确(按时序)? 例如,我的RX例程可以通过在“位窗口”的边缘而不是中间进行采样来返回正确的数据。 我曾想过切换一个“debug pin”来指示采样实际发生的时间,

对于一个MCU,我已经编写了一些汇编例程,以一种比特爆炸的方式执行专有协议(基于UART)的接收和发送。我如何测试它们

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

另一方面,RX则更为困难。一方面,我可以检查我是否接收到其他人发送的信息,但另一方面,我如何知道RX采样是否正确(按时序)?
例如,我的RX例程可以通过在“位窗口”的边缘而不是中间进行采样来返回正确的数据。
我曾想过切换一个“debug pin”来指示采样实际发生的时间,但这会在采样过程中引入延迟,因此我不会测试我原来的例程

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

  • 我知道硬件UART更好(但要看情况而定),但我不能使用它。这不是一个“你试过这个吗…”的问题
  • 我知道如何进行位碰撞(我已经编写了组装例程)
  • 我无法将TX连接到RX,因为我只使用1根电线(通信为半双工)
  • 我问的是如何测试RX采样定时,而不是如何实现UART。

您需要一些东西将数据发送到MCU,可能是第二个MCU。我为6502和Z80编写了类似的代码,用于旧的8位Atari外围设备。这些是半双工协议,所以每当设备空闲时,它都会轮询开始位。在检测到起始位后,它延迟1.5位时间,然后接收8位,位与位之间有1位时间。对数据例程的接收和发送进行编码,以获得精确的定时周期计数。这些都是旧设备,即使是最快的比特率也相对较慢,每比特19微秒~=52600波特


问题已更新。如果输入和输出指令的运行时间完全相同(循环计数),则可以修改接收代码以传输数据以验证位时间,并确认处理器的运行速度

对于感测开始位和执行1.5位时间等待的计时,您必须计算感测开始位的最小和最大周期数。最大周期计数将是一条输入指令,它刚好错过起始位的后缘、测试指令和返回到输入的循环,然后是另一个测试,然后是一个通过循环的下降,以继续接收。最小循环计数将是一个仅捕获起始位前缘的输入,进行测试,然后通过循环下降。然后,接收代码的其余部分需要尽可能靠近数据位周期的中间进行采样

以下是4mhz Z80的代码示例,该Z80以19微秒==76个周期/数据位的速度接收数据。注释包括每条指令的周期计数。从起始位到第一个数据位的理想等待时间为114个周期。起始位循环的最小和最大循环时间为20,50个循环。使用附加延迟加上79个周期的第一个数据位的输入,因此在76152个周期的最小、最大界限内,检测开始接收第一个数据位的最小、最大周期时间为99129个周期。其余的数据位以每位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

您需要一些东西将数据发送到MCU,可能是第二个MCU。我为6502和Z80编写了类似的代码,用于旧的8位Atari外围设备。这些是半双工协议,所以每当设备空闲时,它都会轮询开始位。在检测到起始位后,它延迟1.5位时间,然后接收8位,位与位之间有1位时间。对数据例程的接收和发送进行编码,以获得精确的定时周期计数。这些都是旧设备,即使是最快的比特率也相对较慢,每比特19微秒~=52600波特


问题已更新。如果输入和输出指令的运行时间完全相同(循环计数),则可以修改接收代码以传输数据以验证位时间,并确认处理器的运行速度

对于感测开始位和执行1.5位时间等待的计时,您必须计算感测开始位的最小和最大周期数。最大周期计数将是一条输入指令,它刚好错过起始位的后缘、测试指令和返回到输入的循环,然后是另一个测试,然后是一个通过循环的下降,以继续接收。最小循环计数将是一个仅捕获起始位前缘的输入,进行测试,然后通过循环下降。然后,接收代码的其余部分需要尽可能靠近数据位周期的中间进行采样

以下是4mhz Z80的代码示例,该Z80以19微秒==76个周期/数据位的速度接收数据。注释包括每条指令的周期计数。从起始位到第一个数据位的理想等待时间为114个周期。起始位循环的最小和最大循环时间为20,50个循环。使用附加延迟加上79个周期的第一个数据位的输入,因此在76152个周期的最小、最大界限内,检测开始接收第一个数据位的最小、最大周期时间为99129个周期。其余的数据位以每位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
我想切换一个“调试引脚”来指示采样的时间 实际上正在发生,但这会导致采样延迟 程序,因此我不会测试我原来的例程

使用插装代码进行测试,然后将插装-或接近实际上不会旋转硬件的等效代码留在原位

我想到了托格林