A fork of mAVRISP by Aaron Berk. This version does not use a local file system to hold the AVR program. Instead it uses a serial connection to a PC and a python script to send the AVR program to the mbed.

Dependencies:   mbed

Fork of mAVRISP by Aaron Berk

Committer:
jeroenmbed
Date:
Sat Jan 31 21:54:05 2015 +0000
Revision:
3:df6782d01720
Parent:
2:99c56829a2a8
IT WORKS!!! I can now program an atmega328 with ISP via the mbed. No bootloader.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aberk 0:3066745764a5 1 /**
aberk 0:3066745764a5 2 * @author Aaron Berk
aberk 0:3066745764a5 3 *
aberk 0:3066745764a5 4 * @section LICENSE
aberk 0:3066745764a5 5 *
aberk 0:3066745764a5 6 * Copyright (c) 2010 Aaron Berk
aberk 0:3066745764a5 7 *
aberk 0:3066745764a5 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
aberk 0:3066745764a5 9 * of this software and associated documentation files (the "Software"), to deal
aberk 0:3066745764a5 10 * in the Software without restriction, including without limitation the rights
aberk 0:3066745764a5 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
aberk 0:3066745764a5 12 * copies of the Software, and to permit persons to whom the Software is
aberk 0:3066745764a5 13 * furnished to do so, subject to the following conditions:
aberk 0:3066745764a5 14 *
aberk 0:3066745764a5 15 * The above copyright notice and this permission notice shall be included in
aberk 0:3066745764a5 16 * all copies or substantial portions of the Software.
aberk 0:3066745764a5 17 *
aberk 0:3066745764a5 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
aberk 0:3066745764a5 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
aberk 0:3066745764a5 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
aberk 0:3066745764a5 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
aberk 0:3066745764a5 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
aberk 0:3066745764a5 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
aberk 0:3066745764a5 24 * THE SOFTWARE.
aberk 0:3066745764a5 25 *
aberk 0:3066745764a5 26 * @section DESCRIPTION
aberk 0:3066745764a5 27 *
aberk 0:3066745764a5 28 * Program AVR chips with the AVR910 ISP (in-system programming) protocol,
aberk 0:3066745764a5 29 * using an mbed.
aberk 0:3066745764a5 30 *
aberk 0:3066745764a5 31 * AVR910 Application Note:
aberk 0:3066745764a5 32 *
aberk 0:3066745764a5 33 * http://www.atmel.com/dyn/resources/prod_documents/doc0943.pdf
aberk 0:3066745764a5 34 */
aberk 0:3066745764a5 35
aberk 0:3066745764a5 36 /**
aberk 0:3066745764a5 37 * Includes
aberk 0:3066745764a5 38 */
aberk 0:3066745764a5 39 #include "AVR910.h"
aberk 0:3066745764a5 40
aberk 0:3066745764a5 41 Serial debug(USBTX, USBRX);
aberk 0:3066745764a5 42
aberk 0:3066745764a5 43 AVR910::AVR910(PinName mosi,
aberk 0:3066745764a5 44 PinName miso,
aberk 0:3066745764a5 45 PinName sclk,
jeroenmbed 3:df6782d01720 46 PinName nReset) : spi_(mosi, miso, sclk), nReset_(nReset)
jeroenmbed 3:df6782d01720 47 {
aberk 0:3066745764a5 48
aberk 0:3066745764a5 49 //Slow frequency as default to ensure no errors from
aberk 0:3066745764a5 50 //trying to run it too fast. Increase as appropriate.
jeroenmbed 3:df6782d01720 51 spi_.frequency(5000);
aberk 0:3066745764a5 52 spi_.format(8, 0);
aberk 0:3066745764a5 53
aberk 0:3066745764a5 54 int response = 0;
aberk 0:3066745764a5 55
aberk 0:3066745764a5 56 //Enter serial programming mode by pulling reset line low.
aberk 0:3066745764a5 57 nReset_ = 0;
aberk 0:3066745764a5 58
aberk 0:3066745764a5 59 //Wait 20ms before issuing first command.
aberk 0:3066745764a5 60 wait_ms(20);
aberk 0:3066745764a5 61
aberk 0:3066745764a5 62 //Issue a programming enable command.
aberk 0:3066745764a5 63 response = enableProgramming();
jeroenmbed 3:df6782d01720 64 //printf("R=%d\n\r",response);
aberk 1:276f6df4be7a 65
aberk 0:3066745764a5 66 //Simple debugging to see if we get trapped
aberk 0:3066745764a5 67 //in an infinite loop.
aberk 0:3066745764a5 68
aberk 0:3066745764a5 69 //TODO: introduce a timeout.
aberk 0:3066745764a5 70 while (response < 0) {
aberk 0:3066745764a5 71
aberk 0:3066745764a5 72 //Give nReset a positive pulse.
aberk 0:3066745764a5 73 nReset_ = 1;
aberk 0:3066745764a5 74 wait_ms(20);
aberk 0:3066745764a5 75 nReset_ = 0;
aberk 0:3066745764a5 76 wait_ms(20);
aberk 0:3066745764a5 77
aberk 0:3066745764a5 78 //Issue another programming enable.
aberk 0:3066745764a5 79 response = enableProgramming();
jeroenmbed 3:df6782d01720 80 // printf("R=%d\n\r",response);
aberk 0:3066745764a5 81
aberk 0:3066745764a5 82 }
aberk 1:276f6df4be7a 83
aberk 0:3066745764a5 84
aberk 0:3066745764a5 85 }
aberk 0:3066745764a5 86
jeroenmbed 3:df6782d01720 87 int AVR910::program(FILE* binary, int pageSize, int numPages)
jeroenmbed 3:df6782d01720 88 {
aberk 0:3066745764a5 89
aberk 0:3066745764a5 90 //Clear memory contents.
aberk 0:3066745764a5 91 chipErase();
aberk 0:3066745764a5 92
aberk 0:3066745764a5 93 char pageOffset = 0;
aberk 0:3066745764a5 94 int pageNumber = 0;
aberk 2:99c56829a2a8 95 int address = 0;
aberk 0:3066745764a5 96 int c = 0;
aberk 0:3066745764a5 97 int highLow = 0;
aberk 1:276f6df4be7a 98
aberk 1:276f6df4be7a 99 //We're dealing with paged memory.
aberk 1:276f6df4be7a 100 if (numPages > 1) {
aberk 1:276f6df4be7a 101
aberk 1:276f6df4be7a 102 while ((c = getc(binary)) != EOF) {
aberk 1:276f6df4be7a 103
aberk 1:276f6df4be7a 104 //Page is fully loaded, time to write it to flash.
aberk 1:276f6df4be7a 105 if (pageOffset == (pageSize)) {
aberk 1:276f6df4be7a 106 writeFlashMemoryPage(pageNumber);
aberk 0:3066745764a5 107
aberk 1:276f6df4be7a 108 pageNumber++;
aberk 1:276f6df4be7a 109 if (pageNumber > numPages) {
aberk 1:276f6df4be7a 110 break;
aberk 1:276f6df4be7a 111 }
aberk 1:276f6df4be7a 112 pageOffset = 0;
aberk 1:276f6df4be7a 113 }
aberk 0:3066745764a5 114
aberk 1:276f6df4be7a 115 //Write low byte.
aberk 1:276f6df4be7a 116 if (highLow == 0) {
aberk 1:276f6df4be7a 117 loadMemoryPage(WRITE_LOW_BYTE, pageOffset, c);
aberk 1:276f6df4be7a 118 highLow = 1;
aberk 1:276f6df4be7a 119 }
aberk 1:276f6df4be7a 120 //Write high byte.
aberk 1:276f6df4be7a 121 else {
aberk 1:276f6df4be7a 122 loadMemoryPage(WRITE_HIGH_BYTE, pageOffset, c);
aberk 1:276f6df4be7a 123 highLow = 0;
aberk 1:276f6df4be7a 124 pageOffset++;
aberk 1:276f6df4be7a 125 }
aberk 1:276f6df4be7a 126
aberk 0:3066745764a5 127 }
aberk 0:3066745764a5 128
aberk 1:276f6df4be7a 129 }
aberk 1:276f6df4be7a 130 //We're dealing with non-paged memory.
aberk 1:276f6df4be7a 131 else {
aberk 1:276f6df4be7a 132
aberk 1:276f6df4be7a 133 while ((c = getc(binary)) != EOF) {
aberk 1:276f6df4be7a 134
aberk 1:276f6df4be7a 135 //Write low byte.
aberk 1:276f6df4be7a 136 if (highLow == 0) {
aberk 2:99c56829a2a8 137 writeFlashMemoryByte(WRITE_LOW_FLASH_BYTE, address, c);
aberk 1:276f6df4be7a 138 highLow = 1;
aberk 1:276f6df4be7a 139 }
aberk 1:276f6df4be7a 140 //Write high byte.
aberk 1:276f6df4be7a 141 else {
aberk 2:99c56829a2a8 142 writeFlashMemoryByte(WRITE_HIGH_FLASH_BYTE, address, c);
aberk 1:276f6df4be7a 143 highLow = 0;
aberk 2:99c56829a2a8 144 address++;
aberk 1:276f6df4be7a 145
aberk 2:99c56829a2a8 146 //Page size is our memory size in the non-paged memory case.
aberk 2:99c56829a2a8 147 //Therefore if we've gone beyond our size break because we
aberk 2:99c56829a2a8 148 //don't have any more room.
aberk 2:99c56829a2a8 149 if (address > pageSize) {
aberk 1:276f6df4be7a 150 break;
aberk 1:276f6df4be7a 151 }
aberk 1:276f6df4be7a 152
aberk 1:276f6df4be7a 153 }
aberk 1:276f6df4be7a 154
aberk 0:3066745764a5 155 }
aberk 0:3066745764a5 156
aberk 0:3066745764a5 157 }
aberk 0:3066745764a5 158
aberk 0:3066745764a5 159 //We might have partially filled up a page.
aberk 0:3066745764a5 160 writeFlashMemoryPage(pageNumber);
aberk 0:3066745764a5 161
aberk 0:3066745764a5 162 int success = -1;
aberk 0:3066745764a5 163 success = checkMemory(pageNumber, binary);
aberk 0:3066745764a5 164
aberk 0:3066745764a5 165 //Leave serial programming mode by pulling reset line high.
aberk 0:3066745764a5 166 nReset_ = 1;
aberk 0:3066745764a5 167
aberk 0:3066745764a5 168 return success;
aberk 0:3066745764a5 169
aberk 0:3066745764a5 170 }
aberk 0:3066745764a5 171
jeroenmbed 3:df6782d01720 172 int AVR910::programData(char* myData, int fileSize, int pageSize, int numPages)
jeroenmbed 3:df6782d01720 173 {
jeroenmbed 3:df6782d01720 174
jeroenmbed 3:df6782d01720 175 //Clear memory contents.
jeroenmbed 3:df6782d01720 176 chipErase();
jeroenmbed 3:df6782d01720 177
jeroenmbed 3:df6782d01720 178 char pageOffset = 0;
jeroenmbed 3:df6782d01720 179 int pageNumber = 0;
jeroenmbed 3:df6782d01720 180 int address = 0;
jeroenmbed 3:df6782d01720 181 int c = 0;
jeroenmbed 3:df6782d01720 182 int highLow = 0;
jeroenmbed 3:df6782d01720 183
jeroenmbed 3:df6782d01720 184 //We're dealing with paged memory.
jeroenmbed 3:df6782d01720 185 // if (numPages > 1) {
jeroenmbed 3:df6782d01720 186
jeroenmbed 3:df6782d01720 187 //while ((c = getc(binary)) != EOF) {
jeroenmbed 3:df6782d01720 188 for (int i=0; i<fileSize; i++) {
jeroenmbed 3:df6782d01720 189 c = myData[i];
jeroenmbed 3:df6782d01720 190 printf("p %d: 0x%02x\n",i, myData[i]);
jeroenmbed 3:df6782d01720 191 //Page is fully loaded, time to write it to flash.
jeroenmbed 3:df6782d01720 192 if (pageOffset == (pageSize)) {
jeroenmbed 3:df6782d01720 193 writeFlashMemoryPage(pageNumber);
jeroenmbed 3:df6782d01720 194
jeroenmbed 3:df6782d01720 195 pageNumber++;
jeroenmbed 3:df6782d01720 196 if (pageNumber > numPages) {
jeroenmbed 3:df6782d01720 197 break;
jeroenmbed 3:df6782d01720 198 }
jeroenmbed 3:df6782d01720 199 pageOffset = 0;
jeroenmbed 3:df6782d01720 200 }
jeroenmbed 3:df6782d01720 201
jeroenmbed 3:df6782d01720 202 //Write low byte.
jeroenmbed 3:df6782d01720 203 if (highLow == 0) {
jeroenmbed 3:df6782d01720 204 loadMemoryPage(WRITE_LOW_BYTE, pageOffset, c);
jeroenmbed 3:df6782d01720 205 highLow = 1;
jeroenmbed 3:df6782d01720 206 }
jeroenmbed 3:df6782d01720 207 //Write high byte.
jeroenmbed 3:df6782d01720 208 else {
jeroenmbed 3:df6782d01720 209 loadMemoryPage(WRITE_HIGH_BYTE, pageOffset, c);
jeroenmbed 3:df6782d01720 210 highLow = 0;
jeroenmbed 3:df6782d01720 211 pageOffset++;
jeroenmbed 3:df6782d01720 212 }
jeroenmbed 3:df6782d01720 213
jeroenmbed 3:df6782d01720 214 }
jeroenmbed 3:df6782d01720 215
jeroenmbed 3:df6782d01720 216 // }
jeroenmbed 3:df6782d01720 217 //We're dealing with non-paged memory.
jeroenmbed 3:df6782d01720 218 // else {
jeroenmbed 3:df6782d01720 219 //
jeroenmbed 3:df6782d01720 220 // while ((c = getc(binary)) != EOF) {
jeroenmbed 3:df6782d01720 221 //
jeroenmbed 3:df6782d01720 222 // //Write low byte.
jeroenmbed 3:df6782d01720 223 // if (highLow == 0) {
jeroenmbed 3:df6782d01720 224 // writeFlashMemoryByte(WRITE_LOW_FLASH_BYTE, address, c);
jeroenmbed 3:df6782d01720 225 // highLow = 1;
jeroenmbed 3:df6782d01720 226 // }
jeroenmbed 3:df6782d01720 227 // //Write high byte.
jeroenmbed 3:df6782d01720 228 // else {
jeroenmbed 3:df6782d01720 229 // writeFlashMemoryByte(WRITE_HIGH_FLASH_BYTE, address, c);
jeroenmbed 3:df6782d01720 230 // highLow = 0;
jeroenmbed 3:df6782d01720 231 // address++;
jeroenmbed 3:df6782d01720 232 //
jeroenmbed 3:df6782d01720 233 // //Page size is our memory size in the non-paged memory case.
jeroenmbed 3:df6782d01720 234 // //Therefore if we've gone beyond our size break because we
jeroenmbed 3:df6782d01720 235 // //don't have any more room.
jeroenmbed 3:df6782d01720 236 // if (address > pageSize) {
jeroenmbed 3:df6782d01720 237 // break;
jeroenmbed 3:df6782d01720 238 // }
jeroenmbed 3:df6782d01720 239 //
jeroenmbed 3:df6782d01720 240 // }
jeroenmbed 3:df6782d01720 241 //
jeroenmbed 3:df6782d01720 242 // }
jeroenmbed 3:df6782d01720 243
jeroenmbed 3:df6782d01720 244 // }
jeroenmbed 3:df6782d01720 245
jeroenmbed 3:df6782d01720 246 //We might have partially filled up a page.
jeroenmbed 3:df6782d01720 247 writeFlashMemoryPage(pageNumber);
jeroenmbed 3:df6782d01720 248
jeroenmbed 3:df6782d01720 249 int success = -1;
jeroenmbed 3:df6782d01720 250 //success = checkMemory(pageNumber, binary);
jeroenmbed 3:df6782d01720 251 printf("Going to check memory\n");
jeroenmbed 3:df6782d01720 252 success = checkMemoryData(pageNumber, myData, fileSize);
jeroenmbed 3:df6782d01720 253
jeroenmbed 3:df6782d01720 254 //Leave serial programming mode by pulling reset line high.
jeroenmbed 3:df6782d01720 255 nReset_ = 1;
jeroenmbed 3:df6782d01720 256
jeroenmbed 3:df6782d01720 257 return success;
jeroenmbed 3:df6782d01720 258
jeroenmbed 3:df6782d01720 259 }
jeroenmbed 3:df6782d01720 260 void AVR910::setFrequency(int frequency)
jeroenmbed 3:df6782d01720 261 {
aberk 0:3066745764a5 262
aberk 0:3066745764a5 263 spi_.frequency(frequency);
aberk 0:3066745764a5 264
aberk 0:3066745764a5 265 }
aberk 0:3066745764a5 266
jeroenmbed 3:df6782d01720 267 int AVR910::enableProgramming(void)
jeroenmbed 3:df6782d01720 268 {
aberk 0:3066745764a5 269
aberk 0:3066745764a5 270 int response = 0;
aberk 0:3066745764a5 271 int error = 0;
aberk 0:3066745764a5 272
jeroenmbed 3:df6782d01720 273
aberk 0:3066745764a5 274 //Programming Enable Command: 0xAC, 0x53, 0x00, 0x00
aberk 0:3066745764a5 275 //Byte two echo'd back in byte three.
jeroenmbed 3:df6782d01720 276 response = spi_.write(0xAC);
jeroenmbed 3:df6782d01720 277 //printf("enableProgramming resp (should be ??) = %x\n\r",response);
aberk 0:3066745764a5 278
jeroenmbed 3:df6782d01720 279 response = spi_.write(0x53);
jeroenmbed 3:df6782d01720 280 //printf("enableProgramming resp (should be 0xAC) = %x\n\r",response);
aberk 0:3066745764a5 281
aberk 0:3066745764a5 282 response = spi_.write(0x00);
jeroenmbed 3:df6782d01720 283 //printf("enableProgramming resp (should be 0x53) = %x\n\r",response);
aberk 0:3066745764a5 284
aberk 0:3066745764a5 285 if (response == 0x53) {
aberk 0:3066745764a5 286 error = 0;
aberk 0:3066745764a5 287 } else {
aberk 0:3066745764a5 288 error = -1;
aberk 0:3066745764a5 289 }
aberk 0:3066745764a5 290
jeroenmbed 3:df6782d01720 291 response = spi_.write(0x00);
jeroenmbed 3:df6782d01720 292 //printf("enableProgramming resp (should be 0x00) = %x\n\r",response);
aberk 0:3066745764a5 293
aberk 0:3066745764a5 294 return error;
aberk 0:3066745764a5 295
aberk 0:3066745764a5 296 }
aberk 0:3066745764a5 297
jeroenmbed 3:df6782d01720 298 void AVR910::poll(void)
jeroenmbed 3:df6782d01720 299 {
aberk 0:3066745764a5 300
aberk 0:3066745764a5 301 int response = 0;
aberk 0:3066745764a5 302
aberk 0:3066745764a5 303 do {
aberk 0:3066745764a5 304 spi_.write(0xF0);
aberk 0:3066745764a5 305 spi_.write(0x00);
aberk 0:3066745764a5 306 spi_.write(0x00);
aberk 0:3066745764a5 307 response = spi_.write(0x00);
aberk 0:3066745764a5 308 } while ((response & 0x01) != 0);
aberk 0:3066745764a5 309
aberk 0:3066745764a5 310 }
aberk 0:3066745764a5 311
jeroenmbed 3:df6782d01720 312 int AVR910::readVendorCode(void)
jeroenmbed 3:df6782d01720 313 {
aberk 0:3066745764a5 314
aberk 0:3066745764a5 315 int response = 0;
aberk 0:3066745764a5 316
aberk 0:3066745764a5 317 //Issue read signature byte command.
aberk 0:3066745764a5 318 //Address 0x00 is vendor code.
aberk 0:3066745764a5 319 spi_.write(0x30);
aberk 0:3066745764a5 320 spi_.write(0x00);
aberk 0:3066745764a5 321 spi_.write(0x00);
jeroenmbed 3:df6782d01720 322 //printf("r1=%d\n\r",spi_.write(0x00));
jeroenmbed 3:df6782d01720 323 //printf("r2=%d\n\r",spi_.write(0x00));
aberk 0:3066745764a5 324 response = spi_.write(0x00);
jeroenmbed 3:df6782d01720 325 //printf("r3=%d\n\r",response);
aberk 0:3066745764a5 326
aberk 0:3066745764a5 327 return response;
aberk 0:3066745764a5 328
aberk 0:3066745764a5 329 }
aberk 0:3066745764a5 330
jeroenmbed 3:df6782d01720 331 int AVR910::readPartFamilyAndFlashSize(void)
jeroenmbed 3:df6782d01720 332 {
aberk 0:3066745764a5 333
aberk 0:3066745764a5 334 int response = 0;
aberk 0:3066745764a5 335
aberk 0:3066745764a5 336 //Issue read signature byte command.
aberk 0:3066745764a5 337 //Address 0x01 is part family and flash size code.
aberk 0:3066745764a5 338 spi_.write(0x30);
aberk 0:3066745764a5 339 spi_.write(0x00);
aberk 0:3066745764a5 340 spi_.write(0x01);
aberk 0:3066745764a5 341 response = spi_.write(0x00);
aberk 0:3066745764a5 342
aberk 0:3066745764a5 343 return response;
aberk 0:3066745764a5 344
aberk 0:3066745764a5 345 }
aberk 0:3066745764a5 346
jeroenmbed 3:df6782d01720 347 int AVR910::readPartNumber(void)
jeroenmbed 3:df6782d01720 348 {
aberk 0:3066745764a5 349
aberk 0:3066745764a5 350 int response = 0;
aberk 0:3066745764a5 351
aberk 0:3066745764a5 352 //Issue read signature byte command.
aberk 0:3066745764a5 353 //Address 0x02 is part number code.
aberk 0:3066745764a5 354 spi_.write(0x30);
aberk 0:3066745764a5 355 spi_.write(0x00);
aberk 0:3066745764a5 356 spi_.write(0x02);
aberk 0:3066745764a5 357 response = spi_.write(0x00);
aberk 0:3066745764a5 358
aberk 0:3066745764a5 359 return response;
aberk 0:3066745764a5 360
aberk 0:3066745764a5 361 }
aberk 0:3066745764a5 362
jeroenmbed 3:df6782d01720 363 void AVR910::chipErase(void)
jeroenmbed 3:df6782d01720 364 {
aberk 0:3066745764a5 365
aberk 0:3066745764a5 366 //Issue chip erase command.
aberk 0:3066745764a5 367 spi_.write(0xAC);
aberk 0:3066745764a5 368 spi_.write(0x80);
aberk 0:3066745764a5 369 spi_.write(0x00);
aberk 0:3066745764a5 370 spi_.write(0x00);
aberk 0:3066745764a5 371
aberk 0:3066745764a5 372 poll();
aberk 0:3066745764a5 373
aberk 0:3066745764a5 374 //Temporarily release reset line.
aberk 0:3066745764a5 375 nReset_ = 1;
aberk 0:3066745764a5 376 nReset_ = 0;
aberk 0:3066745764a5 377
aberk 0:3066745764a5 378 }
aberk 0:3066745764a5 379
jeroenmbed 3:df6782d01720 380 void AVR910::loadMemoryPage(int highLow, char address, char data)
jeroenmbed 3:df6782d01720 381 {
aberk 0:3066745764a5 382
aberk 0:3066745764a5 383 spi_.write(highLow);
aberk 0:3066745764a5 384 spi_.write(0x00);
aberk 0:3066745764a5 385 spi_.write(address & 0x3F);
aberk 0:3066745764a5 386 spi_.write(data);
aberk 0:3066745764a5 387
aberk 0:3066745764a5 388 poll();
aberk 0:3066745764a5 389
aberk 0:3066745764a5 390 }
aberk 0:3066745764a5 391
jeroenmbed 3:df6782d01720 392 void AVR910::writeFlashMemoryByte(int highLow, int address, char data)
jeroenmbed 3:df6782d01720 393 {
aberk 2:99c56829a2a8 394
aberk 2:99c56829a2a8 395 spi_.write(highLow);
aberk 2:99c56829a2a8 396 spi_.write(address & 0xFF00 >> 8);
aberk 2:99c56829a2a8 397 spi_.write(address & 0x00FF);
aberk 2:99c56829a2a8 398 spi_.write(data);
aberk 2:99c56829a2a8 399
aberk 2:99c56829a2a8 400 }
aberk 2:99c56829a2a8 401
jeroenmbed 3:df6782d01720 402 void AVR910::writeFlashMemoryPage(char pageNumber)
jeroenmbed 3:df6782d01720 403 {
aberk 0:3066745764a5 404
aberk 0:3066745764a5 405 spi_.write(0x4C);
aberk 0:3066745764a5 406 spi_.write((pageNumber >> 2) & 0x3F);
aberk 0:3066745764a5 407 spi_.write((pageNumber & 0x03) << 6);
aberk 0:3066745764a5 408 spi_.write(0x00);
aberk 0:3066745764a5 409
aberk 0:3066745764a5 410 poll();
aberk 0:3066745764a5 411
aberk 0:3066745764a5 412 }
aberk 0:3066745764a5 413
jeroenmbed 3:df6782d01720 414 char AVR910::readProgramMemory(int highLow, char pageNumber, char pageOffset)
jeroenmbed 3:df6782d01720 415 {
aberk 0:3066745764a5 416
aberk 0:3066745764a5 417 int response = 0;
aberk 0:3066745764a5 418
aberk 0:3066745764a5 419 spi_.write(highLow);
aberk 0:3066745764a5 420 spi_.write((pageNumber >> 2) & 0x3F);
aberk 0:3066745764a5 421 spi_.write(((pageNumber & 0x03) << 6) | (pageOffset & 0x3F));
aberk 0:3066745764a5 422 response = spi_.write(0x00);
aberk 0:3066745764a5 423
aberk 0:3066745764a5 424 poll();
aberk 0:3066745764a5 425
aberk 0:3066745764a5 426 return response;
aberk 0:3066745764a5 427
aberk 0:3066745764a5 428 }
aberk 0:3066745764a5 429
jeroenmbed 3:df6782d01720 430 int AVR910::checkMemory(int numPages, FILE* binary)
jeroenmbed 3:df6782d01720 431 {
aberk 0:3066745764a5 432
aberk 0:3066745764a5 433 int success = 0;
aberk 0:3066745764a5 434 int response = 0;
aberk 0:3066745764a5 435 char c = 0;
aberk 0:3066745764a5 436
aberk 0:3066745764a5 437 //Go back to the beginning of the binary file.
aberk 0:3066745764a5 438 fseek(binary, 0, SEEK_SET);
aberk 0:3066745764a5 439
aberk 0:3066745764a5 440 for (int i = 0; i < numPages; i++) {
aberk 0:3066745764a5 441 for (int j = 0; j < PAGE_SIZE; j++) {
aberk 0:3066745764a5 442 c = getc(binary);
aberk 0:3066745764a5 443 //Read program memory low byte.
aberk 0:3066745764a5 444 response = readProgramMemory(READ_LOW_BYTE, i, j);
aberk 0:3066745764a5 445 //debug.printf("Low byte: 0x%02x\n", response);
aberk 0:3066745764a5 446 if ( c != response ) {
jeroenmbed 3:df6782d01720 447 // debug.printf("Page %i low byte %i: 0x%02x\n", i, j, response);
jeroenmbed 3:df6782d01720 448 // debug.printf("Correct byte is 0x%02x\n", c);
aberk 0:3066745764a5 449 success = -1;
aberk 0:3066745764a5 450 }
aberk 0:3066745764a5 451
aberk 0:3066745764a5 452 c = getc(binary);
aberk 0:3066745764a5 453 //Read program memory high byte.
aberk 0:3066745764a5 454 response = readProgramMemory(READ_HIGH_BYTE, i, j);
aberk 0:3066745764a5 455 //debug.printf("High byte: 0x%02x\n", response);
aberk 0:3066745764a5 456 if ( c != response ) {
jeroenmbed 3:df6782d01720 457 // debug.printf("Page %i high byte %i: 0x%02x\n", i, j, response);
jeroenmbed 3:df6782d01720 458 // debug.printf("Correct byte is 0x%02x\n", c);
aberk 0:3066745764a5 459 success = -1;
aberk 0:3066745764a5 460 }
aberk 0:3066745764a5 461 }
aberk 0:3066745764a5 462 }
aberk 0:3066745764a5 463
aberk 0:3066745764a5 464 return success;
aberk 0:3066745764a5 465
aberk 0:3066745764a5 466 }
jeroenmbed 3:df6782d01720 467
jeroenmbed 3:df6782d01720 468
jeroenmbed 3:df6782d01720 469 int AVR910::checkMemoryData(int numPages, char* myData, int fileSize)
jeroenmbed 3:df6782d01720 470 {
jeroenmbed 3:df6782d01720 471
jeroenmbed 3:df6782d01720 472 int success = 0;
jeroenmbed 3:df6782d01720 473 int response = 0;
jeroenmbed 3:df6782d01720 474 char c = 0;
jeroenmbed 3:df6782d01720 475
jeroenmbed 3:df6782d01720 476 //Go back to the beginning of the binary file.
jeroenmbed 3:df6782d01720 477 //fseek(binary, 0, SEEK_SET);
jeroenmbed 3:df6782d01720 478 int dpoint=0;
jeroenmbed 3:df6782d01720 479 printf("about to start checking (numPages=%d pagesize=%d)\n",numPages, PAGE_SIZE);
jeroenmbed 3:df6782d01720 480 for (int i = 0; i <= numPages; i++) {
jeroenmbed 3:df6782d01720 481 for (int j = 0; j < PAGE_SIZE; j++) {
jeroenmbed 3:df6782d01720 482
jeroenmbed 3:df6782d01720 483 //c = getc(binary);
jeroenmbed 3:df6782d01720 484 c = myData[dpoint];
jeroenmbed 3:df6782d01720 485 //Read program memory low byte.
jeroenmbed 3:df6782d01720 486 response = readProgramMemory(READ_LOW_BYTE, i, j);
jeroenmbed 3:df6782d01720 487 //debug.printf("Low byte: 0x%02x\n", response);
jeroenmbed 3:df6782d01720 488 printf("dpoint=%d Page %i low byte %i: 0x%02x (should be 0x%02x)\n", dpoint-1, i, j, response,c);
jeroenmbed 3:df6782d01720 489 if ( c != response ) {
jeroenmbed 3:df6782d01720 490 // debug.printf("Page %i low byte %i: 0x%02x\n", i, j, response);
jeroenmbed 3:df6782d01720 491 // debug.printf("Correct byte is 0x%02x\n", c);
jeroenmbed 3:df6782d01720 492 success = -1;
jeroenmbed 3:df6782d01720 493 }
jeroenmbed 3:df6782d01720 494
jeroenmbed 3:df6782d01720 495 //c = getc(binary);
jeroenmbed 3:df6782d01720 496 dpoint++;
jeroenmbed 3:df6782d01720 497 if (dpoint==fileSize) break;
jeroenmbed 3:df6782d01720 498 c = myData[dpoint];
jeroenmbed 3:df6782d01720 499 //Read program memory high byte.
jeroenmbed 3:df6782d01720 500 response = readProgramMemory(READ_HIGH_BYTE, i, j);
jeroenmbed 3:df6782d01720 501 printf("dpoint=%d Page %i high byte %i: 0x%02x (should be 0x%02x)\n", dpoint-1, i, j, response,c);
jeroenmbed 3:df6782d01720 502
jeroenmbed 3:df6782d01720 503 //debug.printf("High byte: 0x%02x\n", response);
jeroenmbed 3:df6782d01720 504 if ( c != response ) {
jeroenmbed 3:df6782d01720 505 // debug.printf("Page %i high byte %i: 0x%02x\n", i, j, response);
jeroenmbed 3:df6782d01720 506 //debug.printf("Correct byte is 0x%02x\n", c);
jeroenmbed 3:df6782d01720 507 success = -1;
jeroenmbed 3:df6782d01720 508 }
jeroenmbed 3:df6782d01720 509 dpoint++;
jeroenmbed 3:df6782d01720 510 if (dpoint==fileSize) break;
jeroenmbed 3:df6782d01720 511 }
jeroenmbed 3:df6782d01720 512 }
jeroenmbed 3:df6782d01720 513
jeroenmbed 3:df6782d01720 514 return success;
jeroenmbed 3:df6782d01720 515
jeroenmbed 3:df6782d01720 516 }