
AVRisp tested on ATMega88A inspired by various implementations around: - AVR_SPI_Programmer_v2 ( BO Qiang ) - mAVRISP (Aaron Berk) - TestAVRISP(Chester Hamilton)
AVRisp implementation for mBED
main.cpp
- Committer:
- Ellips
- Date:
- 2015-04-28
- Revision:
- 1:4b883042df7d
- Parent:
- 0:29abe3c0b902
File content as of revision 1:4b883042df7d:
#include "mbed.h" #define ATMEGA88A 1 #include "AVRISP.h" #define FUSE_LOW 0xD0 #define FUSE_HIGH 0xD9 #define FUSE_EXTENDED 0xFF #define LOCK_BYTE 0xFF //most chips use by default the internal 8Mhz clock with DIV8 fuse so 1Mhz seems a good starting point #define TARGET_CLK 1000000L Serial pc(USBTX, USBRX); DigitalOut led1(LED1); void ProgressLed() { led1 = !led1; pc.printf("."); } #define ERROR -1 int main() { int result = ERROR; uint8_t signatureByte1 = 0xff,signatureByte2 = 0xff,signatureByte3 = 0xff; bool ProgMode = false; AVRISP *avrisp = NULL; LocalFileSystem local("local"); FILE * hexFile = fopen("/local/avr.hex","r"); if(!hexFile){ pc.printf("Unable to load avr.hex file\n"); goto exit; } avrisp = new AVRISP(p5,p6,p7,p8, TARGET_CLK, PAGE_SIZE, &ProgressLed); //pc.printf("Press any button to program the AVR.\n"); //char c = pc.getc(); pc.printf("Enter Programming Mode: "); ProgMode = avrisp->EnableProgrammingMode(); if(ProgMode) { pc.printf(" Successful.\n"); } else { pc.printf(" Failed.\n"); goto exit; } signatureByte1 = avrisp->ReadChipSignatureByte( AVRISP::eSB1 ); signatureByte2 = avrisp->ReadChipSignatureByte( AVRISP::eSB2 ); signatureByte3 = avrisp->ReadChipSignatureByte( AVRISP::eSB3 ); if ( signatureByte1 != SIGNATURE_BYTE_1 || signatureByte2 != SIGNATURE_BYTE_2 || signatureByte3 != SIGNATURE_BYTE_3 ) { pc.printf("Chip signature mismatch 0x%02x 0x%02x 0x%02x\n",signatureByte1,signatureByte2,signatureByte3); goto exit; } pc.printf("Erasing Chip: "); avrisp->ChipErase(); pc.printf(" Done\n"); pc.printf("Programing Flash:"); if(avrisp->ProgramFlash(hexFile)) { pc.printf(" Complete.\n"); //verify programming pc.printf("Verifying Flash:"); rewind(hexFile); if( avrisp->VerifyFlash(hexFile) ) { pc.printf(" Complete.\n"); } else { pc.printf(" Failed.\n"); goto exit; } } else { pc.printf("Failed.\n"); } //fuses /*pc.printf("Write Fuse Low Byte.\n"); avrisp->WriteFuse(AVRISP::eFTLo, FUSE_LOW); pc.printf("Fuse Low Byte Readback = %x.\n",avrisp->ReadFuse(AVRISP::eFTLo)); pc.printf("Write Fuse High Byte.\n"); avrisp->WriteFuse(AVRISP::eFTHi, FUSE_HIGH); pc.printf("Fuse High Byte Readback = %x.\n",avrisp->ReadFuse(AVRISP::eFTHi)); pc.printf("Write Fuse Extended Byte.\n"); avrisp->WriteFuse(AVRISP::eFTEx, FUSE_EXTENDED); pc.printf("Fuse Extended Byte Readback = %x.\n",avrisp->ReadFuse(AVRISP::eFTEx)); pc.printf("Write Lock Byte.\n"); avrisp->WriteFuse( AVRISP::eFTLock, LOCK_BYTE); pc.printf("Lock Byte Readback = %x.\n",avrisp->ReadFuse(AVRISP::eFTLock));*/ avrisp->LeaveProgrammingMode(); while(true) __WFI();//do something nice exit: if(ProgMode) avrisp->LeaveProgrammingMode(); if(avrisp) delete avrisp; if (hexFile) fclose(hexFile); return result; }