diff --git a/avr/modules/com2w/com2w.asm b/avr/modules/com2w/com2w.asm index 91f0482..56530ad 100644 --- a/avr/modules/com2w/com2w.asm +++ b/avr/modules/com2w/com2w.asm @@ -352,8 +352,8 @@ com2wSendByte: ldi r17, 8 com2wSendByte_loop: M_COM2WCLKSETLOW - out SREG, r15 ; probably enable irqs - rcall com2wWaitTime1 ; wait for longer time (R22) + out SREG, r15 ; probably enable irqs + rcall com2wWaitTime1 ; wait for longer time (R22) lsr r16 brcs com2wSendByte_send1 M_COM2WDATASETLOW @@ -361,14 +361,16 @@ com2wSendByte_loop: com2wSendByte_send1: M_COM2WDATASETHIGH com2wSendByte_sent: - Utils_WaitNanoSecs 5000, 0, r22 ; wait for very short time to ensure data is stable when clock rises - cli ; ensure time period by disabling irqs + Utils_WaitNanoSecs 5000, 0, r22 ; wait for very short time to ensure data is stable when clock rises + cli ; ensure time period by disabling irqs M_COM2WCLKSETHIGH - rcall com2wWaitTime2 ; wait for shorter time (R22) + rcall com2wWaitTime2 ; wait for shorter time (R22) dec r17 brne com2wSendByte_loop out SREG, r15 pop r15 + rcall com2wWaitTime2 ; wait for shorter time (R22) + M_COM2WDATASETHIGH ; ensure data line is high ret ; @end @@ -435,6 +437,7 @@ com2wRecvMsg_eIo: ldi r16, NET_IFACE_OFFS_ERR_IO_LOW com2wRecvMsg_incCounterRet: rcall NET_Interface_IncCounter16 ; (R24, R25) + rcall com2wRecvByteWaitForQuietClk ; (r18, r20, r22) com2wRecvMsg_clcRet: clc 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 ; @@ -455,10 +484,10 @@ com2wRecvByte: clr r16 com2wRecvByte_loop: ldi r20, 50 ; wait up to 500us for clock low - rcall com2wWaitForClockLowMulti10Us ; (R16, R20, R22) + rcall com2wWaitForClockLowMulti10Us ; (R20, R22) brcc com2wRecvByte_end - ldi r20, 50 ; wait up to 500us for clock high - rcall com2wWaitForClockHighMulti10Us ; (R16, R20, R22) + ldi r20, 100 ; wait up to 1ms for clock high + rcall com2wWaitForClockHighMulti10Us ; (R20, R22) brcc com2wRecvByte_end ; handle received bit inr r18, COM_DATA_INPUT diff --git a/avr/modules/flash/io_com2w.asm b/avr/modules/flash/io_com2w.asm index fe92966..08c835f 100644 --- a/avr/modules/flash/io_com2w.asm +++ b/avr/modules/flash/io_com2w.asm @@ -12,9 +12,8 @@ - -.equ COM2W_WAITTIME1 = 17000 -.equ COM2W_WAITTIME2 = 10000 +.equ COM2W_WAITTIME1 = 25000 +.equ COM2W_WAITTIME2 = 15000 @@ -206,7 +205,7 @@ com2wSendByte: ldi r17, 8 com2wSendByte_loop: rcall com2wClkSetLow - rcall com2wWaitTime2 ; shorter wait period (R22) + rcall com2wWaitTime2 ; shorter wait period (R22) lsr r16 brcs com2wSendByte_send1 rcall com2wDataSetLow @@ -214,11 +213,13 @@ com2wSendByte_loop: com2wSendByte_send1: rcall com2wDataSetHigh com2wSendByte_sent: - Utils_WaitNanoSecs 5000, 0, r22 ; wait for very short time to ensure data is stable when clock rises + Utils_WaitNanoSecs 5000, 0, r22 ; wait for very short time to ensure data is stable when clock rises rcall com2wClkSetHigh - rcall com2wWaitTime2 ; shorter wait period (R22) + rcall com2wWaitTime2 ; shorter wait period (R22) dec r17 brne com2wSendByte_loop + rcall com2wWaitTime2 ; shorter wait period (R22) + rcall com2wDataSetHigh ret ; @end