Added support to the AVRISP-MKII project for ISP speeds slower than 125KHz via a new software SPI driver.

Added new SPI_ORDER_* data order masks to the SPI peripheral driver.
This commit is contained in:
Dean Camera 2010-07-29 07:09:57 +00:00
parent 9a97f16b07
commit de5b16909a
11 changed files with 269 additions and 90 deletions

View file

@ -56,21 +56,68 @@
#endif
/* Macros: */
/** Total number of allowable ISP programming speeds supported by the device. */
#define TOTAL_ISP_PROGRAMMING_SPEEDS 7
/** Low level device command to issue an extended FLASH address, for devices with other 128KB of FLASH. */
#define LOAD_EXTENDED_ADDRESS_CMD 0x4D
/** Macro to convert an ISP frequency to a number of timer clock cycles for the software SPI driver */
#define TIMER_COMP(freq) ((((F_CPU / 8) / freq) / 2) - 1)
/* External Variables: */
extern bool HardwareSPIMode;
/* Function Prototypes: */
uint8_t ISPTarget_GetSPIPrescalerMask(void);
void ISPTarget_Init(void);
void ISPTarget_ShutDown(void);
uint8_t ISPTarget_TransferSoftSPIByte(const uint8_t Byte);
void ISPTarget_ChangeTargetResetLine(const bool ResetTarget);
uint8_t ISPTarget_WaitWhileTargetBusy(void);
void ISPTarget_LoadExtendedAddress(void);
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 ISPTarget_WaitWhileTargetBusy(void);
void ISPTarget_LoadExtendedAddress(void);
/* Inline Functions: */
/** Sends a byte of ISP data to the attached target, using the appropriate SPI hardware or
* software routines depending on the selected ISP speed.
*
* \param[in] Byte Byte of data to send to the attached target
*/
static inline void ISPTarget_SendByte(const uint8_t Byte)
{
if (HardwareSPIMode)
SPI_SendByte(Byte);
else
ISPTarget_TransferSoftSPIByte(Byte);
}
/** Receives a byte of ISP data from the attached target, using the appropriate
* SPI hardware or software routines depending on the selected ISP speed.
*
* \return Received byte of data from the attached target
*/
static inline uint8_t ISPTarget_ReceiveByte(void)
{
if (HardwareSPIMode)
return SPI_ReceiveByte();
else
return ISPTarget_TransferSoftSPIByte(0x00);
}
/** Sends and receives a byte of ISP data to and from the attached target, using the
* appropriate SPI hardware or software routines depending on the selected ISP speed.
*
* \param[in] Byte Byte of data to send to the attached target
*
* \return Received byte of data from the attached target
*/
static inline uint8_t ISPTarget_TransferByte(const uint8_t Byte)
{
if (HardwareSPIMode)
return SPI_TransferByte(Byte);
else
return ISPTarget_TransferSoftSPIByte(Byte);
}
#endif