MBED AVR ISP programmer. Targeted for ATMEGA1284p but should work for other AVR chips as well. Inspired by AVR_SPI_Programmer_v2 and AVR910.
AVRISP/AVRISP.h@0:064004c069be, 2012-01-05 (annotated)
- Committer:
- qiangbo
- Date:
- Thu Jan 05 02:44:12 2012 +0000
- Revision:
- 0:064004c069be
Initial version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
qiangbo | 0:064004c069be | 1 | //****************************************************************************/ |
qiangbo | 0:064004c069be | 2 | // Description: |
qiangbo | 0:064004c069be | 3 | // |
qiangbo | 0:064004c069be | 4 | // Program AVR chips with the AVR910 ISP (in-system programming) protocol, |
qiangbo | 0:064004c069be | 5 | // using an mbed. |
qiangbo | 0:064004c069be | 6 | // |
qiangbo | 0:064004c069be | 7 | // This is a wrapper for AVR_ISP_Programmer_v2 |
qiangbo | 0:064004c069be | 8 | // |
qiangbo | 0:064004c069be | 9 | //****************************************************************************/ |
qiangbo | 0:064004c069be | 10 | |
qiangbo | 0:064004c069be | 11 | #ifndef AVRISP_H |
qiangbo | 0:064004c069be | 12 | #define AVRISP_H |
qiangbo | 0:064004c069be | 13 | |
qiangbo | 0:064004c069be | 14 | //****************************************************************************/ |
qiangbo | 0:064004c069be | 15 | // Includes |
qiangbo | 0:064004c069be | 16 | //****************************************************************************/ |
qiangbo | 0:064004c069be | 17 | #include "mbed.h" |
qiangbo | 0:064004c069be | 18 | |
qiangbo | 0:064004c069be | 19 | //****************************************************************************/ |
qiangbo | 0:064004c069be | 20 | // Definations for: ATMEGA1284p |
qiangbo | 0:064004c069be | 21 | //****************************************************************************/ |
qiangbo | 0:064004c069be | 22 | #define SIGNATURE_BYTE_1 0x1E |
qiangbo | 0:064004c069be | 23 | #define SIGNATURE_BYTE_2 0x97 |
qiangbo | 0:064004c069be | 24 | #define SIGNATURE_BYTE_3 0x05 |
qiangbo | 0:064004c069be | 25 | #define PAGE_SIZE 128 |
qiangbo | 0:064004c069be | 26 | #define NUM_PAGE 512 |
qiangbo | 0:064004c069be | 27 | |
qiangbo | 0:064004c069be | 28 | //****************************************************************************/ |
qiangbo | 0:064004c069be | 29 | // Definations for programming |
qiangbo | 0:064004c069be | 30 | //****************************************************************************/ |
qiangbo | 0:064004c069be | 31 | #define LSB(I) ((I) & 0xFF) |
qiangbo | 0:064004c069be | 32 | #define MSB(I) (((I) & 0xF00) >> 8) |
qiangbo | 0:064004c069be | 33 | #define TARGET_CLK 1000000L |
qiangbo | 0:064004c069be | 34 | #define MAX_PAGE_SIZE (PAGE_SIZE >> 1) //divide max page size by 2 to get number of words per page |
qiangbo | 0:064004c069be | 35 | |
qiangbo | 0:064004c069be | 36 | class AVRISP |
qiangbo | 0:064004c069be | 37 | { |
qiangbo | 0:064004c069be | 38 | public: |
qiangbo | 0:064004c069be | 39 | AVRISP(PinName mosi, PinName miso, PinName sclk, PinName reset); |
qiangbo | 0:064004c069be | 40 | bool EnableProgrammingMode(); |
qiangbo | 0:064004c069be | 41 | void LeaveProgrammingMode(); |
qiangbo | 0:064004c069be | 42 | int ReadChipSignatureByte1(); |
qiangbo | 0:064004c069be | 43 | int ReadChipSignatureByte2(); |
qiangbo | 0:064004c069be | 44 | int ReadChipSignatureByte3(); |
qiangbo | 0:064004c069be | 45 | void StillProgramming(); |
qiangbo | 0:064004c069be | 46 | void ChipErase(); |
qiangbo | 0:064004c069be | 47 | void WriteFuseLow(uint8_t fuseLow); |
qiangbo | 0:064004c069be | 48 | int ReadFuseLow(); |
qiangbo | 0:064004c069be | 49 | void WriteFuseHigh(uint8_t fuseHigh); |
qiangbo | 0:064004c069be | 50 | int ReadFuseHigh(); |
qiangbo | 0:064004c069be | 51 | void WriteFuseExtended(uint8_t fuseExtended); |
qiangbo | 0:064004c069be | 52 | int ReadFuseExtended(); |
qiangbo | 0:064004c069be | 53 | void WriteLockByte(uint8_t lockByte); |
qiangbo | 0:064004c069be | 54 | int ReadLockByte(); |
qiangbo | 0:064004c069be | 55 | void WriteProgramPage(uint16_t addr); |
qiangbo | 0:064004c069be | 56 | void LoadProgramPage(uint16_t addr,uint8_t lowData,uint8_t highData); |
qiangbo | 0:064004c069be | 57 | uint8_t ReadByte(FILE *file); |
qiangbo | 0:064004c069be | 58 | void ReadProgramFlash(uint8_t addrMSB, uint8_t addrLSB); |
qiangbo | 0:064004c069be | 59 | bool ProgramFlash(char *hexFileName); |
qiangbo | 0:064004c069be | 60 | |
qiangbo | 0:064004c069be | 61 | private: |
qiangbo | 0:064004c069be | 62 | SPI* spiPort; |
qiangbo | 0:064004c069be | 63 | DigitalOut *resetPin; |
qiangbo | 0:064004c069be | 64 | }; |
qiangbo | 0:064004c069be | 65 | |
qiangbo | 0:064004c069be | 66 | #endif |