From 87788fa93cfb30a0a30b91bc8004eae772b4a2a7 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Sat, 23 Aug 2025 00:09:39 +0200 Subject: [PATCH] avr: wait for free CLK line on error when in flash mode --- avr/modules/flash/io_com2w.asm | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) 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 ;