Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
AVR910.h
00001 /** 00002 * @author Aaron Berk 00003 * 00004 * @section LICENSE 00005 * 00006 * Copyright (c) 2010 Aaron Berk 00007 * 00008 * Permission is hereby granted, free of charge, to any person obtaining a copy 00009 * of this software and associated documentation files (the "Software"), to deal 00010 * in the Software without restriction, including without limitation the rights 00011 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00012 * copies of the Software, and to permit persons to whom the Software is 00013 * furnished to do so, subject to the following conditions: 00014 * 00015 * The above copyright notice and this permission notice shall be included in 00016 * all copies or substantial portions of the Software. 00017 * 00018 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00019 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00020 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00021 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00022 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00023 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00024 * THE SOFTWARE. 00025 * 00026 * @section DESCRIPTION 00027 * 00028 * Program AVR chips with the AVR910 ISP (in-system programming) protocol, 00029 * using an mbed. 00030 * 00031 * AVR910 Application Note: 00032 * 00033 * http://www.atmel.com/dyn/resources/prod_documents/doc0943.pdf 00034 */ 00035 00036 #ifndef MBED_AVR910_H 00037 #define MBED_AVR910_H 00038 00039 /** 00040 * Includes 00041 */ 00042 #include "mbed.h" 00043 00044 /** 00045 * Defines 00046 */ 00047 00048 #define PATH_TO_BINARY "/local/AVRCODE.bin" 00049 00050 //Commands 00051 #define ATMEL_VENDOR_CODE 0x1E 00052 #define DEVICE_LOCKED 0x00 00053 #define WRITE_HIGH_BYTE 0x48 00054 #define WRITE_LOW_BYTE 0x40 00055 #define READ_HIGH_BYTE 0x28 00056 #define READ_LOW_BYTE 0x20 00057 #define WRITE_HIGH_FLASH_BYTE 0x68 00058 #define WRITE_LOW_FLASH_BYTE 0x60 00059 00060 #define PAGE_SIZE ATMEGA328P_PAGESIZE 00061 #define NUM_PAGES ATMEGA328P_NUM_PAGES 00062 00063 //ATMega328P 00064 #define ATMEGA328P_PAGESIZE 64 //Size in words. 00065 #define ATMEGA328P_NUM_PAGES 256 00066 00067 /** 00068 * AVR910 ISP 00069 */ 00070 class AVR910 { 00071 00072 public: 00073 00074 /** 00075 * Constructor. 00076 * 00077 * @param mosi mbed pin for MOSI SPI line. 00078 * @param miso mbed pin for MISO SPI line. 00079 * @param sclk mbed pin for SCLK SPI line. 00080 * @param nReset mbed pin for not reset line on the ISP interface. 00081 * 00082 * Sends an enable programming command, allowing device registers to be 00083 * read and commands sent. 00084 */ 00085 AVR910(PinName mosi, PinName miso, PinName sclk, PinName nReset); 00086 00087 /** 00088 * Program the AVR microcontroller connected to the mbed. 00089 * 00090 * Sends a chip erase command followed by writing the binary to the AVR 00091 * page buffer and writing the page buffer to flash memory whenever it is 00092 * full. 00093 * 00094 * @param binary File pointer to the binary file to be loaded onto the 00095 * AVR microcontroller. 00096 * @param pageSize The size of one page on the device in words. If the 00097 * device does not use paged memory, set this as the size 00098 * of memory of the device in words. 00099 * @param numPages The number of pages on the device. If the device does 00100 * not use paged memory, set this to 1 (default). 00101 * 00102 * @return 0 => AVR microcontroller programmed successfully. 00103 * -1 => Problem during programming. 00104 */ 00105 int program(FILE* binary, int pageSize, int numPages = 1); 00106 00107 /** 00108 * Set the frequency of the SPI communication. 00109 * 00110 * (Wrapper for SPI::frequency) 00111 * 00112 * @param frequency Frequency of the SPI communication in hertz. 00113 */ 00114 void setFrequency(int frequency); 00115 00116 /** 00117 * Read the vendor code of the device. 00118 * 00119 * @return The vendor code - should be 0x1E for Atmel. 00120 * 0x00 -> Device is locked. 00121 */ 00122 int readVendorCode(void); 00123 00124 /** 00125 * Read the part family and flash size of the device. 00126 * 00127 * @return Code indicating the family of AVR microcontrollers the device comes 00128 * from and how much flash memory it contains. 00129 * 0xFF -> Device code erased or target missing. 00130 * 0x01 -> Device is locked. 00131 */ 00132 int readPartFamilyAndFlashSize(void); 00133 00134 /** 00135 * Read the part number. 00136 * 00137 * @return Code identifying the part number. 00138 * 0xFF -> Device code erased or target missing. 00139 * 0x02 -> Device is locked. 00140 */ 00141 int readPartNumber(void); 00142 00143 private: 00144 00145 /** 00146 * Issue an enable programming command to the AVR microcontroller. 00147 * 00148 * @param 0 to indicate programming was enabled successfully. 00149 * -1 to indicate programming was not enabled. 00150 */ 00151 int enableProgramming(void); 00152 00153 /** 00154 * Poll the device until it has finished its current operation. 00155 */ 00156 void poll(void); 00157 00158 /** 00159 * Issue a chip erase command to the AVR microcontroller. 00160 */ 00161 void chipErase(void); 00162 00163 /** 00164 * Load a byte into the memory page buffer. 00165 * 00166 * @param highLow Indicate whether the byte being loaded is a high or low 00167 * byte. 00168 * @param data The data byte to load. 00169 */ 00170 void loadMemoryPage(int highLow, char address, char data); 00171 00172 /** 00173 * Write a byte into the flash memory. 00174 * 00175 * @param highLow Indicate whether the byte being loaded is a high or low 00176 * byte. 00177 * @param address The address to load the byte at. 00178 * @param data The data byte to load. 00179 */ 00180 void writeFlashMemoryByte(int highLow, int address, char data); 00181 00182 /** 00183 * Write the memory page buffer to flash memory. 00184 * 00185 * @param pageNumber The page number to write to in flash memory. 00186 */ 00187 void writeFlashMemoryPage(char pageNumber); 00188 00189 /** 00190 * Read a byte from program memory. 00191 * 00192 * @param highLow Indicate whether the byte being read is a low or high byte. 00193 * @param pageNumber The page number to read from. 00194 * @param pageOffset Address of byte in the page. 00195 * 00196 * @return The byte at the specified memory location. 00197 */ 00198 char readProgramMemory(int highLow, char pageNumber, char pageOffset); 00199 00200 /** 00201 * Check the binary has been written correctly. 00202 * 00203 * @param numPages The number of pages written to the AVR microcontroller. 00204 * @param binary File pointer to the binary used. 00205 * 00206 * @return 0 -> No inconsistencies between binary file and AVR flash memory. 00207 * -1 -> Binary file was not written correctly. 00208 */ 00209 int checkMemory(int numPages, FILE* binary); 00210 00211 SPI spi_; 00212 DigitalOut nReset_; 00213 00214 }; 00215 00216 #endif /* AVR910_H */
Generated on Tue Jul 12 2022 14:07:14 by
1.7.2