X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/5687ac7316335009160ccd7f56fce5e7746c5889..a9e0935a90346beb0c981924becc1f55d969a08b:/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c?ds=sidebyside diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c index 38ccd1149..1671d29ba 100644 --- a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c +++ b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c @@ -76,8 +76,19 @@ bool XMEGANVM_WaitWhileNVMBusBusy(void) { /* Send the LDCS command to read the PDI STATUS register to see the NVM bus is active */ XPROGTarget_SendByte(PDI_CMD_LDCS | PDI_STATUS_REG); - if (XPROGTarget_ReceiveByte() & PDI_STATUS_NVM) - return true; + + 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 & PDI_STATUS_NVM) + { + TimeoutMSRemaining = COMMAND_TIMEOUT_MS; + return true; + } } return false; @@ -97,9 +108,18 @@ bool XMEGANVM_WaitWhileNVMControllerBusy(void) XPROGTarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2)); XMEGANVM_SendNVMRegAddress(XMEGA_NVM_REG_STATUS); + 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))) - return true; + if (!(StatusRegister & (1 << 7))) + { + TimeoutMSRemaining = COMMAND_TIMEOUT_MS; + return true; + } } return false; @@ -149,7 +169,7 @@ bool XMEGANVM_GetMemoryCRC(const uint8_t CRCCommand, uint32_t* const CRCDest) for (uint8_t i = 0; i < XMEGA_CRC_LENGTH; i++) ((uint8_t*)CRCDest)[i] = XPROGTarget_ReceiveByte(); - return true; + return (TimeoutMSRemaining != 0); } /** Reads memory from the target's memory spaces. @@ -181,10 +201,10 @@ bool XMEGANVM_ReadMemory(const uint32_t ReadAddress, uint8_t* ReadBuffer, uint16 /* Send a LD command with indirect access and postincrement to read out the bytes */ XPROGTarget_SendByte(PDI_CMD_LD | (PDI_POINTER_INDIRECT_PI << 2) | PDI_DATSIZE_1BYTE); - while (ReadSize--) + while (ReadSize-- && TimeoutMSRemaining) *(ReadBuffer++) = XPROGTarget_ReceiveByte(); - return true; + return (TimeoutMSRemaining != 0); } /** Writes byte addressed memory to the target's memory spaces.