Fixed AVRISP-MKII Clone failing to start application firmware once a TPI programming...
[pub/USBasp.git] / Projects / AVRISP-MKII / Lib / XPROG / TINYNVM.c
index 49d5766..8d74dd4 100644 (file)
@@ -43,9 +43,9 @@ static void TINYNVM_SendPointerAddress(const uint16_t AbsoluteAddress)
 {
        /* Send the given 16-bit address to the target, LSB first */
        XPROGTarget_SendByte(TPI_CMD_SSTPR | 0);
-       XPROGTarget_SendByte(((uint8_t*)&AbsoluteAddress)[0]);
+       XPROGTarget_SendByte(AbsoluteAddress & 0xFF);
        XPROGTarget_SendByte(TPI_CMD_SSTPR | 1);
-       XPROGTarget_SendByte(((uint8_t*)&AbsoluteAddress)[1]);
+       XPROGTarget_SendByte(AbsoluteAddress >> 8);
 }
 
 /** Sends a SIN command to the target with the specified I/O address, ready for the data byte to be written.
@@ -146,9 +146,15 @@ void TINYNVM_DisableTPI(void)
 {
        TINYNVM_WaitWhileNVMBusBusy();
 
-       /* Clear the NVMEN bit in the TPI STATUS register to disable TPI mode */
-       XPROGTarget_SendByte(TPI_CMD_SSTCS | TPI_STATUS_REG);
-       XPROGTarget_SendByte(0x00);
+       do
+       {
+               /* Clear the NVMEN bit in the TPI STATUS register to disable TPI mode */
+               XPROGTarget_SendByte(TPI_CMD_SSTCS | TPI_STATUS_REG);
+               XPROGTarget_SendByte(0x00);
+       
+               /* Read back the STATUS register, check to see if it took effect */
+               XPROGTarget_SendByte(TPI_CMD_SLDCS | PDI_RESET_REG);
+       } while (XPROGTarget_ReceiveByte() != 0x00);
 
        XPROGTarget_DisableTargetTPI();
 }
@@ -206,7 +212,7 @@ bool TINYNVM_WriteMemory(const uint16_t WriteAddress,
        if (WriteLength & 0x01)
          WriteBuffer[WriteLength++] = 0xFF;
 
-       /* Set the NVM control register to the WORD WRITE command for memory reading */
+       /* Set the NVM control register to the WORD WRITE command for memory writing */
        TINYNVM_SendWriteNVMRegister(XPROG_Param_NVMCMDRegAddr);
        XPROGTarget_SendByte(TINY_NVM_CMD_WORDWRITE);
 
@@ -227,7 +233,7 @@ bool TINYNVM_WriteMemory(const uint16_t WriteAddress,
                XPROGTarget_SendByte(TPI_CMD_SST | TPI_POINTER_INDIRECT_PI);
                XPROGTarget_SendByte(*(WriteBuffer++));
 
-               /* Need to decrement the write length twice, since we read out a whole word */
+               /* Need to decrement the write length twice, since we wrote a whole two-byte word */
                WriteLength -= 2;
        }