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:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user