Make TPI programming protocol program in words, not bytes to satisfy the datasheet conditions.
This commit is contained in:
		
							parent
							
								
									4d246a82cb
								
							
						
					
					
						commit
						b736a5ef2b
					
				
					 3 changed files with 23 additions and 8 deletions
				
			
		| 
						 | 
				
			
			@ -156,7 +156,7 @@
 | 
			
		|||
 *
 | 
			
		||||
 *  <b><sup>1</sup></b> <i>Optional, see \ref SSec_Options section - for USB AVRs with ADC modules only</i> \n
 | 
			
		||||
 *  <b><sup>2</sup></b> <i>When XPROG_VIA_HARDWARE_USART is set, the AVR's Tx and Rx become the DATA line when connected together
 | 
			
		||||
 *                         via a pair of 300 ohm resistors, and the AVR's XCK pin becomes CLOCK.</i> \n
 | 
			
		||||
 *                         via a pair of 220 ohm resistors, and the AVR's XCK pin becomes CLOCK.</i> \n
 | 
			
		||||
 *  <b><sup>3</sup></b> <i>See AUX line related tokens in the \ref SSec_Options section</i>
 | 
			
		||||
 *
 | 
			
		||||
 *  \section Sec_TPI TPI Connections
 | 
			
		||||
| 
						 | 
				
			
			@ -202,7 +202,7 @@
 | 
			
		|||
 *
 | 
			
		||||
 *  <b><sup>1</sup></b> <i>Optional, see \ref SSec_Options section - for USB AVRs with ADC modules only</i> \n
 | 
			
		||||
 *  <b><sup>2</sup></b> <i>When XPROG_VIA_HARDWARE_USART is set, the AVR's Tx and Rx become the DATA line when connected together
 | 
			
		||||
 *                         via a pair of 300 ohm resistors, and the AVR's XCK pin becomes CLOCK.</i> \n
 | 
			
		||||
 *                         via a pair of 220 ohm resistors, and the AVR's XCK pin becomes CLOCK.</i> \n
 | 
			
		||||
 *  <b><sup>3</sup></b> <i>See AUX line related tokens in the \ref SSec_Options section</i>
 | 
			
		||||
 *
 | 
			
		||||
 *  \section SSec_Options Project Options
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -141,11 +141,11 @@ bool TINYNVM_ReadMemory(const uint16_t ReadAddress, uint8_t* ReadBuffer, uint16_
 | 
			
		|||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Writes byte addressed memory to the target's memory spaces.
 | 
			
		||||
/** Writes word addressed memory to the target's memory spaces.
 | 
			
		||||
 *
 | 
			
		||||
 *  \param[in]  WriteAddress  Start address to write to within the target's address space
 | 
			
		||||
 *  \param[in]  WriteBuffer   Buffer to source data from
 | 
			
		||||
 *  \param[in]  WriteLength   Total number of bytes to write to the device
 | 
			
		||||
 *  \param[in]  WriteLength   Total number of bytes to write to the device (must be an integer multiple of 2)
 | 
			
		||||
 *
 | 
			
		||||
 *  \return Boolean true if the command sequence complete successfully
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -154,6 +154,10 @@ bool TINYNVM_WriteMemory(const uint16_t WriteAddress, const uint8_t* WriteBuffer
 | 
			
		|||
	/* Wait until the NVM controller is no longer busy */
 | 
			
		||||
	if (!(TINYNVM_WaitWhileNVMControllerBusy()))
 | 
			
		||||
	  return false;
 | 
			
		||||
	  
 | 
			
		||||
	/* Must have an integer number of words to write - if extra bytes, abort programming */
 | 
			
		||||
	if (WriteLength & 0x01)
 | 
			
		||||
	  return false;
 | 
			
		||||
 | 
			
		||||
	/* Set the NVM control register to the WORD WRITE command for memory reading */
 | 
			
		||||
	TINYNVM_SendWriteNVMRegister(XPROG_Param_NVMCMDRegAddr);
 | 
			
		||||
| 
						 | 
				
			
			@ -162,11 +166,22 @@ bool TINYNVM_WriteMemory(const uint16_t WriteAddress, const uint8_t* WriteBuffer
 | 
			
		|||
	/* Send the address of the location to write to */
 | 
			
		||||
	TINYNVM_SendPointerAddress(WriteAddress);
 | 
			
		||||
	
 | 
			
		||||
	while (WriteLength--)
 | 
			
		||||
	while (WriteLength)
 | 
			
		||||
	{
 | 
			
		||||
		/* Write the byte of data to the target */
 | 
			
		||||
		/* Wait until the NVM controller is no longer busy */
 | 
			
		||||
		if (!(TINYNVM_WaitWhileNVMControllerBusy()))
 | 
			
		||||
		  return false;
 | 
			
		||||
 | 
			
		||||
		/* Write the low byte of data to the target */
 | 
			
		||||
		XPROGTarget_SendByte(TPI_CMD_SST | TPI_POINTER_INDIRECT_PI);
 | 
			
		||||
		XPROGTarget_SendByte(*(WriteBuffer++));
 | 
			
		||||
		
 | 
			
		||||
		/* Write the high byte of data to the target */
 | 
			
		||||
		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 */
 | 
			
		||||
		WriteLength -= 2;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	return true;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue