X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/9a5ae36a4f62e0cda37972401c61727c6804a985..2a2de8fea94d2a524e988725585b17746cd30dba:/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c?ds=sidebyside diff --git a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c index c0f04c6bd..817f22347 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c @@ -81,18 +81,19 @@ bool TINYNVM_WaitWhileNVMBusBusy(void) { /* Send the SLDCS command to read the TPI STATUS register to see the NVM bus is active */ XPROGTarget_SendByte(TPI_CMD_SLDCS | TPI_STATUS_REG); - if (XPROGTarget_ReceiveByte() & TPI_STATUS_NVM) + + uint8_t StatusRegister = XPROGTarget_ReceiveByte(); + + /* We might have timed out waiting for the status register read response, check here */ + if (!(TimeoutMSRemaining)) + return false; + + /* Check the status register read response to see if the NVM bus is enabled */ + if (StatusRegister & TPI_STATUS_NVM) { TimeoutMSRemaining = COMMAND_TIMEOUT_MS; return true; } - - /* Manage software timeout */ - if (TIFR0 & (1 << OCF0A)) - { - TIFR0 |= (1 << OCF0A); - TimeoutMSRemaining--; - } } return false; @@ -111,19 +112,18 @@ bool TINYNVM_WaitWhileNVMControllerBusy(void) /* Send the SIN command to read the TPI STATUS register to see the NVM bus is busy */ TINYNVM_SendReadNVMRegister(XPROG_Param_NVMCSRRegAddr); + uint8_t StatusRegister = XPROGTarget_ReceiveByte(); + + /* We might have timed out waiting for the status register read response, check here */ + if (!(TimeoutMSRemaining)) + return false; + /* Check to see if the BUSY flag is still set */ - if (!(XPROGTarget_ReceiveByte() & (1 << 7))) + if (!(StatusRegister & (1 << 7))) { TimeoutMSRemaining = COMMAND_TIMEOUT_MS; return true; } - - /* Manage software timeout */ - if (TIFR0 & (1 << OCF0A)) - { - TIFR0 |= (1 << OCF0A); - TimeoutMSRemaining--; - } } return false; @@ -150,14 +150,14 @@ bool TINYNVM_ReadMemory(const uint16_t ReadAddress, uint8_t* ReadBuffer, uint16_ /* Send the address of the location to read from */ TINYNVM_SendPointerAddress(ReadAddress); - while (ReadSize--) + while (ReadSize-- && TimeoutMSRemaining) { /* Read the byte of data from the target */ XPROGTarget_SendByte(TPI_CMD_SLD | TPI_POINTER_INDIRECT_PI); *(ReadBuffer++) = XPROGTarget_ReceiveByte(); } - return true; + return (TimeoutMSRemaining != 0); } /** Writes word addressed memory to the target's memory spaces.