avr: tweaked timing for com2w transport layer.
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
|
||||
|
||||
|
||||
.equ COM2W_WAITTIME1 = 30000
|
||||
.equ COM2W_WAITTIME1 = 17000
|
||||
.equ COM2W_WAITTIME2 = 10000
|
||||
|
||||
|
||||
@@ -85,21 +85,17 @@ ioRawSendMsg_loop:
|
||||
|
||||
ioRawWaitForValidMsg:
|
||||
; wait for CLK low
|
||||
ldi r19, 20 ; wait for up to 10s
|
||||
ioRawWaitForValidMsg_waitLowLoop1:
|
||||
ldi r17, 20 ; wait for up to 10s
|
||||
ioRawWaitForValidMsg_waitLowLoop:
|
||||
.ifdef LED_PIN
|
||||
sbi LED_PIN, LED_PINNUM ; toggle
|
||||
sbi LED_PIN, LED_PINNUM ; toggle
|
||||
.endif
|
||||
ldi r18, 5
|
||||
ioRawWaitForValidMsg_waitLowLoop2:
|
||||
ldi r20, 10 ; wait for about 100us for clock low
|
||||
rcall com2wWaitForClockLowMulti10Us ; R20, R22
|
||||
brcs ioRawWaitForValidMsg_recvMsg
|
||||
dec r18
|
||||
brne ioRawWaitForValidMsg_waitLowLoop2
|
||||
dec r19
|
||||
brne ioRawWaitForValidMsg_waitLowLoop1
|
||||
clc ; no msg received
|
||||
ldi r18, 5 ; wait up to 500ms
|
||||
rcall com2wWaitForClockLowMulti100ms ; (r18, r19, r20, r22)
|
||||
brcs ioRawWaitForValidMsg_recvMsg
|
||||
dec r17
|
||||
brne ioRawWaitForValidMsg_waitLowLoop
|
||||
clc ; no msg received
|
||||
rjmp ioRawWaitForValidMsg_end
|
||||
ioRawWaitForValidMsg_recvMsg:
|
||||
; receive message
|
||||
@@ -112,13 +108,38 @@ ioRawWaitForValidMsg_recvMsg:
|
||||
; validate CRC
|
||||
ldi xl, LOW(flashRecvBuffer)
|
||||
ldi xh, HIGH(flashRecvBuffer)
|
||||
rcall NETMSG_CheckMessageInBuffer ; (R16, R17, R18, R19, R20, X)
|
||||
rcall NETMSG_CheckMessageInBuffer ; (R16, R17, R18, R19, R20, X)
|
||||
ioRawWaitForValidMsg_end:
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine com2wWaitForClockLowMulti100ms
|
||||
;
|
||||
; wait for multiple of 100ms
|
||||
;
|
||||
; @param R18 number of 100ms to wait
|
||||
; @return CFLAG set if okay (state reached), cleared on error
|
||||
; @clobbers r18, r19, r20, r22
|
||||
|
||||
com2wWaitForClockLowMulti100ms:
|
||||
com2wWaitForClockLowMulti100ms_loop1:
|
||||
ldi r19, 100
|
||||
com2wWaitForClockLowMulti100ms_loop2:
|
||||
ldi r20, 100 ; wait for 1ms for clock low
|
||||
rcall com2wWaitForClockLowMulti10Us ; (R20, R22)
|
||||
brcs com2wWaitForClockLowMulti100ms_ret
|
||||
dec r19
|
||||
brne com2wWaitForClockLowMulti100ms_loop2
|
||||
dec r18
|
||||
brne com2wWaitForClockLowMulti100ms_loop1
|
||||
clc
|
||||
com2wWaitForClockLowMulti100ms_ret:
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -185,7 +206,7 @@ com2wSendByte:
|
||||
ldi r17, 8
|
||||
com2wSendByte_loop:
|
||||
rcall com2wClkSetLow
|
||||
rcall com2wWaitTime1 ; longer wait period (R22)
|
||||
rcall com2wWaitTime2 ; shorter wait period (R22)
|
||||
lsr r16
|
||||
brcs com2wSendByte_send1
|
||||
rcall com2wDataSetLow
|
||||
@@ -193,9 +214,9 @@ com2wSendByte_loop:
|
||||
com2wSendByte_send1:
|
||||
rcall com2wDataSetHigh
|
||||
com2wSendByte_sent:
|
||||
rcall com2wWaitTime2 ; shorter wait period (R22)
|
||||
Utils_WaitNanoSecs 5000, 0, r22 ; wait for very short time to ensure data is stable when clock rises
|
||||
rcall com2wClkSetHigh
|
||||
rcall com2wWaitTime1 ; longer wait period (R22)
|
||||
rcall com2wWaitTime2 ; shorter wait period (R22)
|
||||
dec r17
|
||||
brne com2wSendByte_loop
|
||||
ret
|
||||
@@ -267,10 +288,10 @@ com2wRecvByte:
|
||||
ldi r17, 8
|
||||
clr r16
|
||||
com2wRecvByte_loop:
|
||||
ldi r20, 30 ; wait up to 300us for clock low
|
||||
ldi r20, 70 ; wait up to 700us for clock low
|
||||
rcall com2wWaitForClockLowMulti10Us ; (R20, R22)
|
||||
brcc com2wRecvByte_end
|
||||
ldi r20, 30 ; wait up to 300us for clock high
|
||||
ldi r20, 70 ; wait up to 700us for clock high
|
||||
rcall com2wWaitForClockHighMulti10Us ; (R20, R22)
|
||||
brcc com2wRecvByte_end
|
||||
; handle received bit
|
||||
@@ -357,30 +378,26 @@ com2wDataSetLow:
|
||||
;
|
||||
; @param R20 multiple of 10us to wait (e.g. "2" for "20" us)
|
||||
; @return CFLAG set if okay (state reached), cleared on error
|
||||
; @clobbers: r16, r20, r22
|
||||
; @clobbers: r20, r22
|
||||
|
||||
com2wWaitForClockLowMulti10Us:
|
||||
.if clock > 1000000
|
||||
; begin version for > 1000000 Hz
|
||||
ldi r20, LOW(clock/1000000)
|
||||
ldi r22, (1<<COM_CLK_PIN)
|
||||
ldi r22, clock/1000000
|
||||
com2wWaitForClockLowMulti10Us_loop0:
|
||||
push r20 ; +2
|
||||
push r20
|
||||
com2wWaitForClockLowMulti10Us_loop: ; 10 cycles per loop
|
||||
inr r16, COM_CLK_INPUT ; +1 (if low port, +2 if high port)
|
||||
and r16, r22 ; +1
|
||||
breq com2wWaitForClockLowMulti10Us_stateReached ; +1 if FALSE, +2 if TRUE
|
||||
|
||||
inr r16, COM_CLK_INPUT ; +1 (if low port, +2 if high port)
|
||||
and r16, r22 ; +1
|
||||
breq com2wWaitForClockLowMulti10Us_stateReached ; +1 if FALSE, +2 if TRUE
|
||||
|
||||
nop ; +1
|
||||
|
||||
dec r20 ; +1
|
||||
brne com2wWaitForClockLowMulti10Us_loop ; +2 if TRUE, +1 if FALSE
|
||||
pop r20 ; +2
|
||||
dec r20 ; +1
|
||||
sbis COM_CLK_INPUT, COM_CLK_PIN ; +2 if skipped, +1 if taken
|
||||
rjmp com2wWaitForClockLowMulti10Us_stateReached ; (+2 if taken)
|
||||
sbis COM_CLK_INPUT, COM_CLK_PIN ; +2 if skipped, +1 if taken
|
||||
rjmp com2wWaitForClockLowMulti10Us_stateReached ; (+2 if taken)
|
||||
sbis COM_CLK_INPUT, COM_CLK_PIN ; +2 if skipped, +1 if taken
|
||||
rjmp com2wWaitForClockLowMulti10Us_stateReached ; (+2 if taken)
|
||||
nop ; +1
|
||||
dec r20 ; +1
|
||||
brne com2wWaitForClockLowMulti10Us_loop ; +2 if TRUE, +1 if FALSE
|
||||
pop r20
|
||||
dec r22 ; +1
|
||||
brne com2wWaitForClockLowMulti10Us_loop0 ; +1 if FALSE, +2 if TRUE
|
||||
clc ; +1
|
||||
ret ; +4
|
||||
@@ -393,18 +410,14 @@ com2wWaitForClockLowMulti10Us_stateReached:
|
||||
.error "Clock speed too low"
|
||||
.else
|
||||
; begin version for 1000000 Hz
|
||||
ldi r22, (1<<COM_CLK_PIN)
|
||||
com2wWaitForClockLowMulti10Us_loop: ; 10 cycles per loop
|
||||
inr r16, COM_CLK_INPUT ; +1 (if low port, +2 if high port)
|
||||
and r16, r22 ; +1
|
||||
breq com2wWaitForClockLowMulti10Us_stateReached ; +1 if FALSE, +2 if TRUE
|
||||
|
||||
inr r16, COM_CLK_INPUT ; +1 (if low port, +2 if high port)
|
||||
and r16, r22 ; +1
|
||||
breq com2wWaitForClockLowMulti10Us_stateReached ; +1 if FALSE, +2 if TRUE
|
||||
|
||||
sbis COM_CLK_INPUT, COM_CLK_PIN ; +2 if skipped, +1 if taken
|
||||
rjmp com2wWaitForClockLowMulti10Us_stateReached ; (+2 if taken)
|
||||
sbis COM_CLK_INPUT, COM_CLK_PIN ; +2 if skipped, +1 if taken
|
||||
rjmp com2wWaitForClockLowMulti10Us_stateReached ; (+2 if taken)
|
||||
sbis COM_CLK_INPUT, COM_CLK_PIN ; +2 if skipped, +1 if taken
|
||||
rjmp com2wWaitForClockLowMulti10Us_stateReached ; (+2 if taken)
|
||||
nop ; +1
|
||||
|
||||
dec r20 ; +1
|
||||
brne com2wWaitForClockLowMulti10Us_loop ; +2 if TRUE, +1 if FALSE
|
||||
clc ; +1
|
||||
@@ -425,33 +438,29 @@ com2wWaitForClockLowMulti10Us_stateReached:
|
||||
;
|
||||
; @param R20 multiple of 10us to wait (e.g. "2" for "20" us)
|
||||
; @return CFLAG set if okay (state reached), cleared on error
|
||||
; @clobbers: r16, r20, r22
|
||||
; @clobbers: r20, r22
|
||||
|
||||
com2wWaitForClockHighMulti10Us:
|
||||
.if clock > 1000000
|
||||
; begin version for > 1000000 Hz
|
||||
ldi r20, LOW(clock/1000000)
|
||||
ldi r22, (1<<COM_CLK_PIN)
|
||||
ldi r22, clock/1000000
|
||||
com2wWaitForClockHighMulti10Us_loop0:
|
||||
push r20 ; +2
|
||||
com2wWaitForClockHighMulti10Us_loop: ; 10 cycles per loop
|
||||
inr r16, COM_CLK_INPUT ; +1 (if low port, +2 if high port)
|
||||
and r16, r22 ; +1
|
||||
breq com2wWaitForClockHighMulti10Us_stateReached ; +1 if FALSE, +2 if TRUE
|
||||
|
||||
inr r16, COM_CLK_INPUT ; +1 (if low port, +2 if high port)
|
||||
and r16, r22 ; +1
|
||||
brne com2wWaitForClockHighMulti10Us_stateReached ; +1 if FALSE, +2 if TRUE
|
||||
|
||||
nop ; +1
|
||||
|
||||
dec r20 ; +1
|
||||
brne com2wWaitForClockHighMulti10Us_loop ; +2 if TRUE, +1 if FALSE
|
||||
pop r20 ; +2
|
||||
dec r20 ; +1
|
||||
brne com2wWaitForClockHighMulti10Us_loop0 ; +1 if FALSE, +2 if TRUE
|
||||
clc ; +1
|
||||
ret ; +4
|
||||
push r20
|
||||
com2wWaitForClockHighMulti10Us_loop: ; 10 cycles per loop
|
||||
sbic COM_CLK_INPUT, COM_CLK_PIN ; +2 if skipped, +1 if taken
|
||||
rjmp com2wWaitForClockHighMulti10Us_stateReached ; (+2 if taken)
|
||||
sbic COM_CLK_INPUT, COM_CLK_PIN ; +2 if skipped, +1 if taken
|
||||
rjmp com2wWaitForClockHighMulti10Us_stateReached ; (+2 if taken)
|
||||
sbic COM_CLK_INPUT, COM_CLK_PIN ; +2 if skipped, +1 if taken
|
||||
rjmp com2wWaitForClockHighMulti10Us_stateReached ; (+2 if taken)
|
||||
nop ; +1
|
||||
dec r20 ; +1
|
||||
brne com2wWaitForClockHighMulti10Us_loop ; +2 if TRUE, +1 if FALSE
|
||||
pop r20
|
||||
dec r22 ; +1
|
||||
brne com2wWaitForClockHighMulti10Us_loop0 ; +1 if FALSE, +2 if TRUE
|
||||
clc ; +1
|
||||
ret ; +4
|
||||
com2wWaitForClockHighMulti10Us_stateReached:
|
||||
pop r20
|
||||
sec ; +1
|
||||
@@ -461,18 +470,14 @@ com2wWaitForClockHighMulti10Us_stateReached:
|
||||
.error "Clock speed too low"
|
||||
.else
|
||||
; begin version for 1000000 Hz
|
||||
ldi r22, (1<<COM_CLK_PIN)
|
||||
com2wWaitForClockHighMulti10Us_loop: ; 10 cycles per loop
|
||||
inr r16, COM_CLK_INPUT ; +1 (if low port, +2 if high port)
|
||||
and r16, r22 ; +1
|
||||
breq com2wWaitForClockHighMulti10Us_stateReached ; +1 if FALSE, +2 if TRUE
|
||||
|
||||
inr r16, COM_CLK_INPUT ; +1 (if low port, +2 if high port)
|
||||
and r16, r22 ; +1
|
||||
brne com2wWaitForClockHighMulti10Us_stateReached ; +1 if FALSE, +2 if TRUE
|
||||
|
||||
com2wWaitForClockHighMulti10Us_loop: ; 10 cycles per loop
|
||||
sbic COM_CLK_INPUT, COM_CLK_PIN ; +2 if skipped, +1 if taken
|
||||
rjmp com2wWaitForClockHighMulti10Us_stateReached ; (+2 if taken)
|
||||
sbic COM_CLK_INPUT, COM_CLK_PIN ; +2 if skipped, +1 if taken
|
||||
rjmp com2wWaitForClockHighMulti10Us_stateReached ; (+2 if taken)
|
||||
sbic COM_CLK_INPUT, COM_CLK_PIN ; +2 if skipped, +1 if taken
|
||||
rjmp com2wWaitForClockHighMulti10Us_stateReached ; (+2 if taken)
|
||||
nop ; +1
|
||||
|
||||
dec r20 ; +1
|
||||
brne com2wWaitForClockHighMulti10Us_loop ; +2 if TRUE, +1 if FALSE
|
||||
clc ; +1
|
||||
|
||||
Reference in New Issue
Block a user