diff --git a/avr/modules/flash/io_com2w.asm b/avr/modules/flash/io_com2w.asm index 08c835f..cfc9fe1 100644 --- a/avr/modules/flash/io_com2w.asm +++ b/avr/modules/flash/io_com2w.asm @@ -270,7 +270,7 @@ com2wRecvMsg_loop: rjmp com2wRecvMsg_end com2wRecvMsg_eBadSize: com2wRecvMsg_eIo: -com2wRecvMsg_clcRet: + rcall com2wRecvByteWaitForQuietClk ; (r18, r20, r22) clc com2wRecvMsg_end: ret @@ -278,6 +278,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 ;