Testing 如何测试位碰撞通信';汇编程序
对于一个MCU,我已经编写了一些汇编例程,以一种比特爆炸的方式执行专有协议(基于UART)的接收和发送。我如何测试它们 TX可以通过发送数据进行测试,同时,在逻辑分析仪的帮助下,检查所有采样的计时是否正确(手动或使用一些脚本) 另一方面,RX则更为困难。一方面,我可以检查我是否接收到其他人发送的信息,但另一方面,我如何知道RX采样是否正确(按时序)?Testing 如何测试位碰撞通信';汇编程序,testing,assembly,embedded,microcontroller,uart,Testing,Assembly,Embedded,Microcontroller,Uart,对于一个MCU,我已经编写了一些汇编例程,以一种比特爆炸的方式执行专有协议(基于UART)的接收和发送。我如何测试它们 TX可以通过发送数据进行测试,同时,在逻辑分析仪的帮助下,检查所有采样的计时是否正确(手动或使用一些脚本) 另一方面,RX则更为困难。一方面,我可以检查我是否接收到其他人发送的信息,但另一方面,我如何知道RX采样是否正确(按时序)? 例如,我的RX例程可以通过在“位窗口”的边缘而不是中间进行采样来返回正确的数据。 我曾想过切换一个“debug pin”来指示采样实际发生的时间,
例如,我的RX例程可以通过在“位窗口”的边缘而不是中间进行采样来返回正确的数据。
我曾想过切换一个“debug pin”来指示采样实际发生的时间,但这会在采样过程中引入延迟,因此我不会测试我原来的例程 阅读评论后,有一些事情值得澄清:
- 我知道硬件UART更好(但要看情况而定),但我不能使用它。这不是一个“你试过这个吗…”的问题李>
- 我知道如何进行位碰撞(我已经编写了组装例程)李>
- 我无法将TX连接到RX,因为我只使用1根电线(通信为半双工)李>
- 我问的是如何测试RX采样定时,而不是如何实现UART。
问题已更新。如果输入和输出指令的运行时间完全相同(循环计数),则可以修改接收代码以传输数据以验证位时间,并确认处理器的运行速度 对于感测开始位和执行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
我想切换一个“调试引脚”来指示采样的时间
实际上正在发生,但这会导致采样延迟
程序,因此我不会测试我原来的例程
使用插装代码进行测试,然后将插装-或接近实际上不会旋转硬件的等效代码留在原位
我想到了托格林