com2w: added some recovery code, improved protocol.

after sending a byte wait for the same time when sending the last bit as
with the other bits (otherwise the last bit might get lost by slower
devices).
This commit is contained in:
Martin Preuss
2025-08-20 23:27:17 +02:00
parent 6a3f6be8a9
commit 3a7951be16
2 changed files with 44 additions and 14 deletions

View File

@@ -369,6 +369,8 @@ com2wSendByte_sent:
brne com2wSendByte_loop brne com2wSendByte_loop
out SREG, r15 out SREG, r15
pop r15 pop r15
rcall com2wWaitTime2 ; wait for shorter time (R22)
M_COM2WDATASETHIGH ; ensure data line is high
ret ret
; @end ; @end
@@ -435,6 +437,7 @@ com2wRecvMsg_eIo:
ldi r16, NET_IFACE_OFFS_ERR_IO_LOW ldi r16, NET_IFACE_OFFS_ERR_IO_LOW
com2wRecvMsg_incCounterRet: com2wRecvMsg_incCounterRet:
rcall NET_Interface_IncCounter16 ; (R24, R25) rcall NET_Interface_IncCounter16 ; (R24, R25)
rcall com2wRecvByteWaitForQuietClk ; (r18, r20, r22)
com2wRecvMsg_clcRet: com2wRecvMsg_clcRet:
clc clc
com2wRecvMsg_end: com2wRecvMsg_end:
@@ -443,6 +446,32 @@ com2wRecvMsg_end:
; ---------------------------------------------------------------------------
; @routine com2wRecvByteWaitForQuietClk
;
; Wait until the clock line is consistently high for 1ms.
;
; @clobbers r18, r20, r22
com2wRecvByteWaitForQuietClk:
ldi r18, 200
com2wRecvByteWaitForQuietClk_loop:
ldi r20, 100 ; wait up to 1ms for clock high (R20, R22)
rcall com2wWaitForClockLowMulti10Us
brcs com2wRecvByteWaitForQuietClk_waitForLow
dec r18
brne com2wRecvByteWaitForQuietClk_loop
rjmp com2wRecvByteWaitForQuietClk_ret
com2wRecvByteWaitForQuietClk_waitForLow:
ldi r20, 100 ; wait up to 1ms for clock low (R20, R22)
rcall com2wWaitForClockLowMulti10Us
brcc com2wRecvByteWaitForQuietClk_ret ; not low within 1ms, assume line is quiet
brne com2wRecvByteWaitForQuietClk_loop
com2wRecvByteWaitForQuietClk_ret:
ret
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine com2wRecvByte ; @routine com2wRecvByte
; ;
@@ -455,10 +484,10 @@ com2wRecvByte:
clr r16 clr r16
com2wRecvByte_loop: com2wRecvByte_loop:
ldi r20, 50 ; wait up to 500us for clock low ldi r20, 50 ; wait up to 500us for clock low
rcall com2wWaitForClockLowMulti10Us ; (R16, R20, R22) rcall com2wWaitForClockLowMulti10Us ; (R20, R22)
brcc com2wRecvByte_end brcc com2wRecvByte_end
ldi r20, 50 ; wait up to 500us for clock high ldi r20, 100 ; wait up to 1ms for clock high
rcall com2wWaitForClockHighMulti10Us ; (R16, R20, R22) rcall com2wWaitForClockHighMulti10Us ; (R20, R22)
brcc com2wRecvByte_end brcc com2wRecvByte_end
; handle received bit ; handle received bit
inr r18, COM_DATA_INPUT inr r18, COM_DATA_INPUT

View File

@@ -12,9 +12,8 @@
.equ COM2W_WAITTIME1 = 25000
.equ COM2W_WAITTIME1 = 17000 .equ COM2W_WAITTIME2 = 15000
.equ COM2W_WAITTIME2 = 10000
@@ -219,6 +218,8 @@ com2wSendByte_sent:
rcall com2wWaitTime2 ; shorter wait period (R22) rcall com2wWaitTime2 ; shorter wait period (R22)
dec r17 dec r17
brne com2wSendByte_loop brne com2wSendByte_loop
rcall com2wWaitTime2 ; shorter wait period (R22)
rcall com2wDataSetHigh
ret ret
; @end ; @end