X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/5f363996e3b6fc66017ff02eb2de6f477e0f328e..3702ba1fb31f265360a0e4cf1736465e44389103:/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c?ds=inline diff --git a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c index c9822d0a6..b657758e9 100644 --- a/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c +++ b/Projects/AVRISP-MKII/Lib/ISP/ISPTarget.c @@ -111,7 +111,7 @@ void ISPTarget_ChangeTargetResetLine(const bool ResetTarget) uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint16_t PollAddress, const uint8_t PollValue, const uint8_t DelayMS, const uint8_t ReadMemCommand) { - uint8_t ProgrammingStatus = STATUS_CMD_OK; + uint8_t ProgrammingStatus = STATUS_CMD_OK; /* Determine method of Programming Complete check */ switch (ProgrammingMode & ~(PROG_MODE_PAGED_WRITES_MASK | PROG_MODE_COMMIT_PAGE_MASK)) @@ -124,11 +124,18 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint1 case PROG_MODE_PAGED_VALUE_MASK: do { - SPI_SendByte(ReadMemCommand); - SPI_SendByte(PollAddress >> 8); - SPI_SendByte(PollAddress & 0xFF); + /* Manage software timeout */ + if (TIFR0 & (1 << OCF0A)) + { + TIFR0 |= (1 << OCF0A); + TimeoutMSRemaining--; + } + + SPI_Send(ReadMemCommand); + SPI_Send(PollAddress >> 8); + SPI_Send(PollAddress & 0xFF); } - while ((SPI_TransferByte(0x00) == PollValue) && TimeoutMSRemaining); + while ((SPI_Transfer(0x00) == PollValue) && TimeoutMSRemaining); if (!(TimeoutMSRemaining)) ProgrammingStatus = STATUS_CMD_TOUT; @@ -140,6 +147,9 @@ uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode, const uint1 break; } + if (ProgrammingStatus == STATUS_CMD_OK) + TimeoutMSRemaining = COMMAND_TIMEOUT_MS; + return ProgrammingStatus; } @@ -152,17 +162,28 @@ uint8_t ISPTarget_WaitWhileTargetBusy(void) { do { - SPI_SendByte(0xF0); - SPI_SendByte(0x00); - - SPI_SendByte(0x00); + /* Manage software timeout */ + if (TIFR0 & (1 << OCF0A)) + { + TIFR0 |= (1 << OCF0A); + TimeoutMSRemaining--; + } + + SPI_Send(0xF0); + SPI_Send(0x00); + SPI_Send(0x00); } - while ((SPI_ReceiveByte() & 0x01) && TimeoutMSRemaining); + while ((SPI_Receive() & 0x01) && TimeoutMSRemaining); - if (!(TimeoutMSRemaining)) - return STATUS_RDY_BSY_TOUT; + if (TimeoutMSRemaining) + { + TimeoutMSRemaining = COMMAND_TIMEOUT_MS; + return STATUS_CMD_OK; + } else - return STATUS_CMD_OK; + { + return STATUS_RDY_BSY_TOUT; + } } /** Sends a low-level LOAD EXTENDED ADDRESS command to the target, for addressing of memory beyond the @@ -171,10 +192,10 @@ uint8_t ISPTarget_WaitWhileTargetBusy(void) */ void ISPTarget_LoadExtendedAddress(void) { - SPI_SendByte(LOAD_EXTENDED_ADDRESS_CMD); - SPI_SendByte(0x00); - SPI_SendByte((CurrentAddress & 0x00FF0000) >> 16); - SPI_SendByte(0x00); + SPI_Send(LOAD_EXTENDED_ADDRESS_CMD); + SPI_Send(0x00); + SPI_Send((CurrentAddress & 0x00FF0000) >> 16); + SPI_Send(0x00); } #endif