Aaron Berk
/
mbedAvrProgrammer
AVR910 In-System Programming
AVR910.h@0:56d5a7ca509d, 2010-06-16 (annotated)
- Committer:
- aberk
- Date:
- Wed Jun 16 13:10:04 2010 +0000
- Revision:
- 0:56d5a7ca509d
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
aberk | 0:56d5a7ca509d | 1 | //****************************************************************************/ |
aberk | 0:56d5a7ca509d | 2 | // Description: |
aberk | 0:56d5a7ca509d | 3 | // |
aberk | 0:56d5a7ca509d | 4 | // Program AVR chips with the AVR910 ISP (in-system programming) protocol, |
aberk | 0:56d5a7ca509d | 5 | // using an mbed. |
aberk | 0:56d5a7ca509d | 6 | // |
aberk | 0:56d5a7ca509d | 7 | // AVR910 Application Note: |
aberk | 0:56d5a7ca509d | 8 | // |
aberk | 0:56d5a7ca509d | 9 | // http://www.atmel.com/dyn/resources/prod_documents/doc0943.pdf |
aberk | 0:56d5a7ca509d | 10 | //****************************************************************************/ |
aberk | 0:56d5a7ca509d | 11 | |
aberk | 0:56d5a7ca509d | 12 | #ifndef MBED_AVR910_H |
aberk | 0:56d5a7ca509d | 13 | #define MBED_AVR910_H |
aberk | 0:56d5a7ca509d | 14 | |
aberk | 0:56d5a7ca509d | 15 | //****************************************************************************/ |
aberk | 0:56d5a7ca509d | 16 | // Includes |
aberk | 0:56d5a7ca509d | 17 | //****************************************************************************/ |
aberk | 0:56d5a7ca509d | 18 | #include "mbed.h" |
aberk | 0:56d5a7ca509d | 19 | |
aberk | 0:56d5a7ca509d | 20 | //****************************************************************************/ |
aberk | 0:56d5a7ca509d | 21 | // Defines |
aberk | 0:56d5a7ca509d | 22 | //****************************************************************************/ |
aberk | 0:56d5a7ca509d | 23 | |
aberk | 0:56d5a7ca509d | 24 | #define PATH_TO_BINARY "/local/AVRcode.bin" |
aberk | 0:56d5a7ca509d | 25 | |
aberk | 0:56d5a7ca509d | 26 | //Commands |
aberk | 0:56d5a7ca509d | 27 | #define ATMEL_VENDOR_CODE 0x1E |
aberk | 0:56d5a7ca509d | 28 | #define DEVICE_LOCKED 0x00 |
aberk | 0:56d5a7ca509d | 29 | #define WRITE_HIGH_BYTE 0x48 |
aberk | 0:56d5a7ca509d | 30 | #define WRITE_LOW_BYTE 0x40 |
aberk | 0:56d5a7ca509d | 31 | #define READ_HIGH_BYTE 0x28 |
aberk | 0:56d5a7ca509d | 32 | #define READ_LOW_BYTE 0x20 |
aberk | 0:56d5a7ca509d | 33 | |
aberk | 0:56d5a7ca509d | 34 | #define PAGE_SIZE ATMEGA328P_PAGESIZE |
aberk | 0:56d5a7ca509d | 35 | #define NUM_PAGES ATMEGA328P_NUM_PAGES |
aberk | 0:56d5a7ca509d | 36 | |
aberk | 0:56d5a7ca509d | 37 | //ATMega328P |
aberk | 0:56d5a7ca509d | 38 | #define ATMEGA328P_PAGESIZE 64 //Size in words. |
aberk | 0:56d5a7ca509d | 39 | #define ATMEGA328P_NUM_PAGES 256 |
aberk | 0:56d5a7ca509d | 40 | |
aberk | 0:56d5a7ca509d | 41 | |
aberk | 0:56d5a7ca509d | 42 | class AVR910 { |
aberk | 0:56d5a7ca509d | 43 | |
aberk | 0:56d5a7ca509d | 44 | public: |
aberk | 0:56d5a7ca509d | 45 | |
aberk | 0:56d5a7ca509d | 46 | /** |
aberk | 0:56d5a7ca509d | 47 | * Constructor. |
aberk | 0:56d5a7ca509d | 48 | * |
aberk | 0:56d5a7ca509d | 49 | * Parameters: |
aberk | 0:56d5a7ca509d | 50 | * |
aberk | 0:56d5a7ca509d | 51 | * mosi - Master out slave in pin for SPI communication. |
aberk | 0:56d5a7ca509d | 52 | * miso - Master in slave out pin for SPI communication. |
aberk | 0:56d5a7ca509d | 53 | * sclk - Serial clock pin for SPI communication. |
aberk | 0:56d5a7ca509d | 54 | * nReset - Not reset line pin on the ISP interface. |
aberk | 0:56d5a7ca509d | 55 | */ |
aberk | 0:56d5a7ca509d | 56 | AVR910(PinName mosi, PinName miso, PinName sclk, PinName nReset); |
aberk | 0:56d5a7ca509d | 57 | |
aberk | 0:56d5a7ca509d | 58 | /** |
aberk | 0:56d5a7ca509d | 59 | * Program the AVR microcontroller connected to the mbed. |
aberk | 0:56d5a7ca509d | 60 | * |
aberk | 0:56d5a7ca509d | 61 | * Parameters: |
aberk | 0:56d5a7ca509d | 62 | * |
aberk | 0:56d5a7ca509d | 63 | * binary - File pointer to the binary file to be loaded onto the |
aberk | 0:56d5a7ca509d | 64 | * AVR microcontroller. |
aberk | 0:56d5a7ca509d | 65 | * |
aberk | 0:56d5a7ca509d | 66 | * Returns: |
aberk | 0:56d5a7ca509d | 67 | * |
aberk | 0:56d5a7ca509d | 68 | * 0 -> AVR microcontroller programmed successfully. |
aberk | 0:56d5a7ca509d | 69 | * -1 -> Problem during programming. |
aberk | 0:56d5a7ca509d | 70 | */ |
aberk | 0:56d5a7ca509d | 71 | int program(FILE* binary); |
aberk | 0:56d5a7ca509d | 72 | |
aberk | 0:56d5a7ca509d | 73 | /** |
aberk | 0:56d5a7ca509d | 74 | * Set the frequency of the SPI communication. |
aberk | 0:56d5a7ca509d | 75 | * |
aberk | 0:56d5a7ca509d | 76 | * (Wrapper for SPI::frequency) |
aberk | 0:56d5a7ca509d | 77 | * |
aberk | 0:56d5a7ca509d | 78 | * Parameters: |
aberk | 0:56d5a7ca509d | 79 | * |
aberk | 0:56d5a7ca509d | 80 | * frequency - Frequency of the SPI communication in hertz. |
aberk | 0:56d5a7ca509d | 81 | */ |
aberk | 0:56d5a7ca509d | 82 | void setFrequency(int frequency); |
aberk | 0:56d5a7ca509d | 83 | |
aberk | 0:56d5a7ca509d | 84 | private: |
aberk | 0:56d5a7ca509d | 85 | |
aberk | 0:56d5a7ca509d | 86 | /** |
aberk | 0:56d5a7ca509d | 87 | * Issue an enable programming command to the AVR microcontroller. |
aberk | 0:56d5a7ca509d | 88 | * |
aberk | 0:56d5a7ca509d | 89 | * Returns: |
aberk | 0:56d5a7ca509d | 90 | * |
aberk | 0:56d5a7ca509d | 91 | * 0 to indicate programming was enabled successfully. |
aberk | 0:56d5a7ca509d | 92 | * -1 to indicate programming was not enabled. |
aberk | 0:56d5a7ca509d | 93 | */ |
aberk | 0:56d5a7ca509d | 94 | int enableProgramming(void); |
aberk | 0:56d5a7ca509d | 95 | |
aberk | 0:56d5a7ca509d | 96 | /** |
aberk | 0:56d5a7ca509d | 97 | * Poll the device until it has finished its current operation. |
aberk | 0:56d5a7ca509d | 98 | */ |
aberk | 0:56d5a7ca509d | 99 | void poll(void); |
aberk | 0:56d5a7ca509d | 100 | |
aberk | 0:56d5a7ca509d | 101 | /** |
aberk | 0:56d5a7ca509d | 102 | * Read the vendor code of the device. |
aberk | 0:56d5a7ca509d | 103 | * |
aberk | 0:56d5a7ca509d | 104 | * Returns: |
aberk | 0:56d5a7ca509d | 105 | * |
aberk | 0:56d5a7ca509d | 106 | * The vendor code - should be 0x1E for Atmel. |
aberk | 0:56d5a7ca509d | 107 | * 0x00 -> Device is locked. |
aberk | 0:56d5a7ca509d | 108 | */ |
aberk | 0:56d5a7ca509d | 109 | int readVendorCode(void); |
aberk | 0:56d5a7ca509d | 110 | |
aberk | 0:56d5a7ca509d | 111 | /** |
aberk | 0:56d5a7ca509d | 112 | * Read the part family and flash size of the device. |
aberk | 0:56d5a7ca509d | 113 | * |
aberk | 0:56d5a7ca509d | 114 | * Returns: |
aberk | 0:56d5a7ca509d | 115 | * |
aberk | 0:56d5a7ca509d | 116 | * Code indicating the family of AVR microcontrollers the device comes |
aberk | 0:56d5a7ca509d | 117 | * from and how much flash memory it contains. |
aberk | 0:56d5a7ca509d | 118 | * 0xFF -> Device code erased or target missing. |
aberk | 0:56d5a7ca509d | 119 | * 0x01 -> Device is locked. |
aberk | 0:56d5a7ca509d | 120 | */ |
aberk | 0:56d5a7ca509d | 121 | int readPartFamilyAndFlashSize(void); |
aberk | 0:56d5a7ca509d | 122 | |
aberk | 0:56d5a7ca509d | 123 | /** |
aberk | 0:56d5a7ca509d | 124 | * Read the part number. |
aberk | 0:56d5a7ca509d | 125 | * |
aberk | 0:56d5a7ca509d | 126 | * Returns: |
aberk | 0:56d5a7ca509d | 127 | * |
aberk | 0:56d5a7ca509d | 128 | * Code identifying the part number. |
aberk | 0:56d5a7ca509d | 129 | * 0xFF -> Device code erased or target missing. |
aberk | 0:56d5a7ca509d | 130 | * 0x02 -> Device is locked. |
aberk | 0:56d5a7ca509d | 131 | */ |
aberk | 0:56d5a7ca509d | 132 | int readPartNumber(void); |
aberk | 0:56d5a7ca509d | 133 | |
aberk | 0:56d5a7ca509d | 134 | /** |
aberk | 0:56d5a7ca509d | 135 | * Issue a chip erase command to the AVR microcontroller. |
aberk | 0:56d5a7ca509d | 136 | */ |
aberk | 0:56d5a7ca509d | 137 | void chipErase(void); |
aberk | 0:56d5a7ca509d | 138 | |
aberk | 0:56d5a7ca509d | 139 | /** |
aberk | 0:56d5a7ca509d | 140 | * Load a byte into the memory page buffer. |
aberk | 0:56d5a7ca509d | 141 | * |
aberk | 0:56d5a7ca509d | 142 | * Parameters: |
aberk | 0:56d5a7ca509d | 143 | * |
aberk | 0:56d5a7ca509d | 144 | * highLow - Indicate whether the byte being loaded is a high or low byte. |
aberk | 0:56d5a7ca509d | 145 | * data - The data byte to load. |
aberk | 0:56d5a7ca509d | 146 | */ |
aberk | 0:56d5a7ca509d | 147 | void loadMemoryPage(int highLow, char address, char data); |
aberk | 0:56d5a7ca509d | 148 | |
aberk | 0:56d5a7ca509d | 149 | /** |
aberk | 0:56d5a7ca509d | 150 | * Write the memory page buffer to flash memory. |
aberk | 0:56d5a7ca509d | 151 | * |
aberk | 0:56d5a7ca509d | 152 | * Parameters: |
aberk | 0:56d5a7ca509d | 153 | * |
aberk | 0:56d5a7ca509d | 154 | * pageNumber - The page number to write to in flash memory. |
aberk | 0:56d5a7ca509d | 155 | */ |
aberk | 0:56d5a7ca509d | 156 | void writeFlashMemoryPage(char pageNumber); |
aberk | 0:56d5a7ca509d | 157 | |
aberk | 0:56d5a7ca509d | 158 | /** |
aberk | 0:56d5a7ca509d | 159 | * Read a byte from program memory. |
aberk | 0:56d5a7ca509d | 160 | * |
aberk | 0:56d5a7ca509d | 161 | * Parameters: |
aberk | 0:56d5a7ca509d | 162 | * |
aberk | 0:56d5a7ca509d | 163 | * highLow - Indicate whether the byte being read is a low or high byte. |
aberk | 0:56d5a7ca509d | 164 | * pageNumber - The page number to read from. |
aberk | 0:56d5a7ca509d | 165 | * pageOffset - Address of byte in the page. |
aberk | 0:56d5a7ca509d | 166 | * |
aberk | 0:56d5a7ca509d | 167 | * Returns: |
aberk | 0:56d5a7ca509d | 168 | * |
aberk | 0:56d5a7ca509d | 169 | * The byte at the specified memory location. |
aberk | 0:56d5a7ca509d | 170 | */ |
aberk | 0:56d5a7ca509d | 171 | char readProgramMemory(int highLow, char pageNumber, char pageOffset); |
aberk | 0:56d5a7ca509d | 172 | |
aberk | 0:56d5a7ca509d | 173 | /** |
aberk | 0:56d5a7ca509d | 174 | * Check the binary has been written correctly. |
aberk | 0:56d5a7ca509d | 175 | * |
aberk | 0:56d5a7ca509d | 176 | * Paramters: |
aberk | 0:56d5a7ca509d | 177 | * |
aberk | 0:56d5a7ca509d | 178 | * numPages - The number of pages written to the AVR microcontroller. |
aberk | 0:56d5a7ca509d | 179 | * binary - File pointer to the binary used. |
aberk | 0:56d5a7ca509d | 180 | * Returns: |
aberk | 0:56d5a7ca509d | 181 | * |
aberk | 0:56d5a7ca509d | 182 | * 0 -> No inconsistencies between binary file and AVR flash memory. |
aberk | 0:56d5a7ca509d | 183 | * -1 -> Binary file was not written correctly. |
aberk | 0:56d5a7ca509d | 184 | */ |
aberk | 0:56d5a7ca509d | 185 | int checkMemory(int numPages, FILE* binary); |
aberk | 0:56d5a7ca509d | 186 | |
aberk | 0:56d5a7ca509d | 187 | DigitalOut* nReset_; |
aberk | 0:56d5a7ca509d | 188 | SPI* spi_; |
aberk | 0:56d5a7ca509d | 189 | |
aberk | 0:56d5a7ca509d | 190 | }; |
aberk | 0:56d5a7ca509d | 191 | |
aberk | 0:56d5a7ca509d | 192 | #endif /* AVR910_H */ |