AVRisp tested on ATMega88A inspired by various implementations around: - AVR_SPI_Programmer_v2 ( BO Qiang ) - mAVRISP (Aaron Berk) - TestAVRISP(Chester Hamilton)

Dependencies:   mbed

AVRisp implementation for mBED

Committer:
Ellips
Date:
Tue Apr 28 11:01:19 2015 +0000
Revision:
1:4b883042df7d
Parent:
0:29abe3c0b902
AVRisp , v0.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ellips 0:29abe3c0b902 1 //****************************************************************************/
Ellips 0:29abe3c0b902 2 // Description:
Ellips 0:29abe3c0b902 3 //
Ellips 0:29abe3c0b902 4 // Program AVR chips with the AVR910 ISP (in-system programming) protocol,
Ellips 0:29abe3c0b902 5 // using an mbed.
Ellips 0:29abe3c0b902 6 //
Ellips 0:29abe3c0b902 7 // This is a wrapper for AVR_ISP_Programmer_v2
Ellips 0:29abe3c0b902 8 //
Ellips 0:29abe3c0b902 9 //****************************************************************************/
Ellips 0:29abe3c0b902 10
Ellips 0:29abe3c0b902 11 #ifndef AVRISP_H
Ellips 0:29abe3c0b902 12 #define AVRISP_H
Ellips 0:29abe3c0b902 13
Ellips 0:29abe3c0b902 14 //****************************************************************************/
Ellips 0:29abe3c0b902 15 // Includes
Ellips 0:29abe3c0b902 16 //****************************************************************************/
Ellips 0:29abe3c0b902 17 #include "mbed.h"
Ellips 0:29abe3c0b902 18
Ellips 0:29abe3c0b902 19 //****************************************************************************/
Ellips 0:29abe3c0b902 20 // Definations for: ATMEGA1284p
Ellips 0:29abe3c0b902 21 //****************************************************************************/
Ellips 0:29abe3c0b902 22 #if defined(ATMEGA1284P)
Ellips 0:29abe3c0b902 23 #define SIGNATURE_BYTE_1 0x1E
Ellips 0:29abe3c0b902 24 #define SIGNATURE_BYTE_2 0x97
Ellips 0:29abe3c0b902 25 #define SIGNATURE_BYTE_3 0x05
Ellips 0:29abe3c0b902 26 #define PAGE_SIZE 64
Ellips 0:29abe3c0b902 27 #define NUM_PAGE 512
Ellips 0:29abe3c0b902 28 //****************************************************************************/
Ellips 0:29abe3c0b902 29 // Definations for: ATMEGA88A
Ellips 0:29abe3c0b902 30 //****************************************************************************/
Ellips 0:29abe3c0b902 31 #elif defined(ATMEGA88A)
Ellips 0:29abe3c0b902 32 #define SIGNATURE_BYTE_1 0x1E
Ellips 0:29abe3c0b902 33 #define SIGNATURE_BYTE_2 0x93
Ellips 0:29abe3c0b902 34 #define SIGNATURE_BYTE_3 0x0A
Ellips 0:29abe3c0b902 35 #define PAGE_SIZE 32
Ellips 0:29abe3c0b902 36 #define NUM_PAGE 128
Ellips 0:29abe3c0b902 37 #endif
Ellips 0:29abe3c0b902 38
Ellips 0:29abe3c0b902 39 class AVRISP
Ellips 0:29abe3c0b902 40 {
Ellips 0:29abe3c0b902 41 public:
Ellips 0:29abe3c0b902 42 typedef enum _SignatureByte{
Ellips 0:29abe3c0b902 43 eSB1 = 0x00,
Ellips 0:29abe3c0b902 44 eSB2 = 0x01,
Ellips 0:29abe3c0b902 45 eSB3 = 0x02
Ellips 0:29abe3c0b902 46 } SignatureByte;
Ellips 0:29abe3c0b902 47
Ellips 0:29abe3c0b902 48 typedef enum _FuseType{
Ellips 0:29abe3c0b902 49 eFTLo,
Ellips 0:29abe3c0b902 50 eFTHi,
Ellips 0:29abe3c0b902 51 eFTEx,
Ellips 0:29abe3c0b902 52 eFTLock,
Ellips 0:29abe3c0b902 53 } FuseType;
Ellips 0:29abe3c0b902 54
Ellips 0:29abe3c0b902 55 typedef void(*PRGCB)(void);
Ellips 0:29abe3c0b902 56
Ellips 0:29abe3c0b902 57 AVRISP(PinName mosi, PinName miso, PinName sclk, PinName reset, uint32_t spiClk, uint16_t pageSize, PRGCB pCB = NULL);
Ellips 0:29abe3c0b902 58 virtual ~AVRISP();
Ellips 0:29abe3c0b902 59
Ellips 0:29abe3c0b902 60 bool EnableProgrammingMode();
Ellips 0:29abe3c0b902 61 void LeaveProgrammingMode();
Ellips 0:29abe3c0b902 62 void ChipErase();
Ellips 0:29abe3c0b902 63
Ellips 0:29abe3c0b902 64 bool ProgramFlash(FILE *hexFile);
Ellips 0:29abe3c0b902 65 bool VerifyFlash(FILE *hexFile);
Ellips 0:29abe3c0b902 66
Ellips 0:29abe3c0b902 67
Ellips 0:29abe3c0b902 68 uint8_t ReadChipSignatureByte(SignatureByte Nr);
Ellips 0:29abe3c0b902 69 void WriteFuse( FuseType Typ, uint8_t fuse );
Ellips 0:29abe3c0b902 70 uint8_t ReadFuse( FuseType Typ );
Ellips 0:29abe3c0b902 71
Ellips 0:29abe3c0b902 72 void WriteProgramPage(uint16_t addr);
Ellips 0:29abe3c0b902 73 void LoadProgramPage(uint16_t addr,uint8_t lowData,uint8_t highData);
Ellips 0:29abe3c0b902 74 uint8_t ReadProgramFlash(uint16_t addr, bool highByte);
Ellips 0:29abe3c0b902 75
Ellips 0:29abe3c0b902 76 private:
Ellips 0:29abe3c0b902 77
Ellips 0:29abe3c0b902 78 uint8_t ReadByte(FILE *file);
Ellips 0:29abe3c0b902 79 void StillProgramming();
Ellips 0:29abe3c0b902 80 SPI spiPort;
Ellips 0:29abe3c0b902 81 DigitalOut resetPin;
Ellips 0:29abe3c0b902 82 uint16_t mPageSize;
Ellips 0:29abe3c0b902 83
Ellips 0:29abe3c0b902 84 PRGCB progressCB;
Ellips 0:29abe3c0b902 85 };
Ellips 0:29abe3c0b902 86
Ellips 0:29abe3c0b902 87 #endif