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 22:44:09 2015 +0000
Revision:
4:ceee1eb7062e
Cleaned up.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jeroenmbed 4:ceee1eb7062e 1 /**
jeroenmbed 4:ceee1eb7062e 2 * @author Aaron Berk, Jeroen Voogd
jeroenmbed 4:ceee1eb7062e 3 *
jeroenmbed 4:ceee1eb7062e 4 * @section LICENSE
jeroenmbed 4:ceee1eb7062e 5 *
jeroenmbed 4:ceee1eb7062e 6 * Copyright (c) 2010 Aaron Berk
jeroenmbed 4:ceee1eb7062e 7 * Copyright (c) 2015 Jeroen Voogd
jeroenmbed 4:ceee1eb7062e 8 *
jeroenmbed 4:ceee1eb7062e 9 * Permission is hereby granted, free of charge, to any person obtaining a copy
jeroenmbed 4:ceee1eb7062e 10 * of this software and associated documentation files (the "Software"), to deal
jeroenmbed 4:ceee1eb7062e 11 * in the Software without restriction, including without limitation the rights
jeroenmbed 4:ceee1eb7062e 12 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
jeroenmbed 4:ceee1eb7062e 13 * copies of the Software, and to permit persons to whom the Software is
jeroenmbed 4:ceee1eb7062e 14 * furnished to do so, subject to the following conditions:
jeroenmbed 4:ceee1eb7062e 15 *
jeroenmbed 4:ceee1eb7062e 16 * The above copyright notice and this permission notice shall be included in
jeroenmbed 4:ceee1eb7062e 17 * all copies or substantial portions of the Software.
jeroenmbed 4:ceee1eb7062e 18 *
jeroenmbed 4:ceee1eb7062e 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
jeroenmbed 4:ceee1eb7062e 20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
jeroenmbed 4:ceee1eb7062e 21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
jeroenmbed 4:ceee1eb7062e 22 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
jeroenmbed 4:ceee1eb7062e 23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
jeroenmbed 4:ceee1eb7062e 24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
jeroenmbed 4:ceee1eb7062e 25 * THE SOFTWARE.
jeroenmbed 4:ceee1eb7062e 26 *
jeroenmbed 4:ceee1eb7062e 27 * @section DESCRIPTION
jeroenmbed 4:ceee1eb7062e 28 *
jeroenmbed 4:ceee1eb7062e 29 * Program AVR chips with the AVR910 ISP (in-system programming) protocol,
jeroenmbed 4:ceee1eb7062e 30 * using an mbed. The version of Aaron Berk used a local file system, this version
jeroenmbed 4:ceee1eb7062e 31 * useses a python script to feed the data via a serial connection.
jeroenmbed 4:ceee1eb7062e 32 *
jeroenmbed 4:ceee1eb7062e 33 * AVR910 Application Note:
jeroenmbed 4:ceee1eb7062e 34 *
jeroenmbed 4:ceee1eb7062e 35 * http://www.atmel.com/dyn/resources/prod_documents/doc0943.pdf
jeroenmbed 4:ceee1eb7062e 36 */
jeroenmbed 4:ceee1eb7062e 37
jeroenmbed 4:ceee1eb7062e 38 /**
jeroenmbed 4:ceee1eb7062e 39 * Includes
jeroenmbed 4:ceee1eb7062e 40 */
jeroenmbed 4:ceee1eb7062e 41 #include "AVR910_Serial.h"
jeroenmbed 4:ceee1eb7062e 42
jeroenmbed 4:ceee1eb7062e 43 Serial debug(USBTX, USBRX);
jeroenmbed 4:ceee1eb7062e 44
jeroenmbed 4:ceee1eb7062e 45 AVR910::AVR910(PinName mosi,
jeroenmbed 4:ceee1eb7062e 46 PinName miso,
jeroenmbed 4:ceee1eb7062e 47 PinName sclk,
jeroenmbed 4:ceee1eb7062e 48 PinName nReset) : spi_(mosi, miso, sclk), nReset_(nReset)
jeroenmbed 4:ceee1eb7062e 49 {
jeroenmbed 4:ceee1eb7062e 50
jeroenmbed 4:ceee1eb7062e 51 //Slow frequency as default to ensure no errors from
jeroenmbed 4:ceee1eb7062e 52 //trying to run it too fast. Increase as appropriate.
jeroenmbed 4:ceee1eb7062e 53 spi_.frequency(32000);
jeroenmbed 4:ceee1eb7062e 54 spi_.format(8, 0);
jeroenmbed 4:ceee1eb7062e 55
jeroenmbed 4:ceee1eb7062e 56 int response = 0;
jeroenmbed 4:ceee1eb7062e 57
jeroenmbed 4:ceee1eb7062e 58 //Enter serial programming mode by pulling reset line low.
jeroenmbed 4:ceee1eb7062e 59 nReset_ = 0;
jeroenmbed 4:ceee1eb7062e 60
jeroenmbed 4:ceee1eb7062e 61 //Wait 20ms before issuing first command.
jeroenmbed 4:ceee1eb7062e 62 wait_ms(20);
jeroenmbed 4:ceee1eb7062e 63
jeroenmbed 4:ceee1eb7062e 64 //Issue a programming enable command.
jeroenmbed 4:ceee1eb7062e 65 response = enableProgramming();
jeroenmbed 4:ceee1eb7062e 66
jeroenmbed 4:ceee1eb7062e 67 //TODO: introduce a timeout.
jeroenmbed 4:ceee1eb7062e 68 while (response < 0) {
jeroenmbed 4:ceee1eb7062e 69
jeroenmbed 4:ceee1eb7062e 70 //Give nReset a positive pulse.
jeroenmbed 4:ceee1eb7062e 71 nReset_ = 1;
jeroenmbed 4:ceee1eb7062e 72 wait_ms(20);
jeroenmbed 4:ceee1eb7062e 73 nReset_ = 0;
jeroenmbed 4:ceee1eb7062e 74 wait_ms(20);
jeroenmbed 4:ceee1eb7062e 75
jeroenmbed 4:ceee1eb7062e 76 //Issue another programming enable.
jeroenmbed 4:ceee1eb7062e 77 response = enableProgramming();
jeroenmbed 4:ceee1eb7062e 78 }
jeroenmbed 4:ceee1eb7062e 79 }
jeroenmbed 4:ceee1eb7062e 80
jeroenmbed 4:ceee1eb7062e 81
jeroenmbed 4:ceee1eb7062e 82 int AVR910::programData(char* myData, int dataSize, int pageSize, int numPages)
jeroenmbed 4:ceee1eb7062e 83 {
jeroenmbed 4:ceee1eb7062e 84
jeroenmbed 4:ceee1eb7062e 85 //Clear memory contents.
jeroenmbed 4:ceee1eb7062e 86 chipErase();
jeroenmbed 4:ceee1eb7062e 87
jeroenmbed 4:ceee1eb7062e 88 char pageOffset = 0;
jeroenmbed 4:ceee1eb7062e 89 int pageNumber = 0;
jeroenmbed 4:ceee1eb7062e 90 int c = 0;
jeroenmbed 4:ceee1eb7062e 91 int highLow = 0;
jeroenmbed 4:ceee1eb7062e 92
jeroenmbed 4:ceee1eb7062e 93 //In this version we're always dealing with paged memory.
jeroenmbed 4:ceee1eb7062e 94
jeroenmbed 4:ceee1eb7062e 95 for (int i=0; i<dataSize; i++) {
jeroenmbed 4:ceee1eb7062e 96 c = myData[i];
jeroenmbed 4:ceee1eb7062e 97 //Page is fully loaded, time to write it to flash.
jeroenmbed 4:ceee1eb7062e 98 if (pageOffset == (pageSize)) {
jeroenmbed 4:ceee1eb7062e 99 writeFlashMemoryPage(pageNumber);
jeroenmbed 4:ceee1eb7062e 100
jeroenmbed 4:ceee1eb7062e 101 pageNumber++;
jeroenmbed 4:ceee1eb7062e 102 if (pageNumber > numPages) {
jeroenmbed 4:ceee1eb7062e 103 break;
jeroenmbed 4:ceee1eb7062e 104 }
jeroenmbed 4:ceee1eb7062e 105 pageOffset = 0;
jeroenmbed 4:ceee1eb7062e 106 }
jeroenmbed 4:ceee1eb7062e 107
jeroenmbed 4:ceee1eb7062e 108 //Write low byte.
jeroenmbed 4:ceee1eb7062e 109 if (highLow == 0) {
jeroenmbed 4:ceee1eb7062e 110 loadMemoryPage(WRITE_LOW_BYTE, pageOffset, c);
jeroenmbed 4:ceee1eb7062e 111 highLow = 1;
jeroenmbed 4:ceee1eb7062e 112 }
jeroenmbed 4:ceee1eb7062e 113 //Write high byte.
jeroenmbed 4:ceee1eb7062e 114 else {
jeroenmbed 4:ceee1eb7062e 115 loadMemoryPage(WRITE_HIGH_BYTE, pageOffset, c);
jeroenmbed 4:ceee1eb7062e 116 highLow = 0;
jeroenmbed 4:ceee1eb7062e 117 pageOffset++;
jeroenmbed 4:ceee1eb7062e 118 }
jeroenmbed 4:ceee1eb7062e 119
jeroenmbed 4:ceee1eb7062e 120 }
jeroenmbed 4:ceee1eb7062e 121
jeroenmbed 4:ceee1eb7062e 122 //We might have partially filled up a page.
jeroenmbed 4:ceee1eb7062e 123 writeFlashMemoryPage(pageNumber);
jeroenmbed 4:ceee1eb7062e 124
jeroenmbed 4:ceee1eb7062e 125 int success = -1;
jeroenmbed 4:ceee1eb7062e 126 success = checkMemoryData(pageNumber, myData, dataSize);
jeroenmbed 4:ceee1eb7062e 127
jeroenmbed 4:ceee1eb7062e 128 //Leave serial programming mode by pulling reset line high.
jeroenmbed 4:ceee1eb7062e 129 nReset_ = 1;
jeroenmbed 4:ceee1eb7062e 130
jeroenmbed 4:ceee1eb7062e 131 return success;
jeroenmbed 4:ceee1eb7062e 132
jeroenmbed 4:ceee1eb7062e 133 }
jeroenmbed 4:ceee1eb7062e 134 void AVR910::setFrequency(int frequency)
jeroenmbed 4:ceee1eb7062e 135 {
jeroenmbed 4:ceee1eb7062e 136
jeroenmbed 4:ceee1eb7062e 137 spi_.frequency(frequency);
jeroenmbed 4:ceee1eb7062e 138
jeroenmbed 4:ceee1eb7062e 139 }
jeroenmbed 4:ceee1eb7062e 140
jeroenmbed 4:ceee1eb7062e 141 int AVR910::enableProgramming(void)
jeroenmbed 4:ceee1eb7062e 142 {
jeroenmbed 4:ceee1eb7062e 143
jeroenmbed 4:ceee1eb7062e 144 int response = 0;
jeroenmbed 4:ceee1eb7062e 145 int error = 0;
jeroenmbed 4:ceee1eb7062e 146
jeroenmbed 4:ceee1eb7062e 147 //Programming Enable Command: 0xAC, 0x53, 0x00, 0x00
jeroenmbed 4:ceee1eb7062e 148 //Byte two echo'd back in byte three.
jeroenmbed 4:ceee1eb7062e 149 spi_.write(0xAC);
jeroenmbed 4:ceee1eb7062e 150
jeroenmbed 4:ceee1eb7062e 151 spi_.write(0x53);
jeroenmbed 4:ceee1eb7062e 152
jeroenmbed 4:ceee1eb7062e 153 response = spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 154
jeroenmbed 4:ceee1eb7062e 155 if (response == 0x53) {
jeroenmbed 4:ceee1eb7062e 156 error = 0;
jeroenmbed 4:ceee1eb7062e 157 } else {
jeroenmbed 4:ceee1eb7062e 158 error = -1;
jeroenmbed 4:ceee1eb7062e 159 }
jeroenmbed 4:ceee1eb7062e 160
jeroenmbed 4:ceee1eb7062e 161 response = spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 162
jeroenmbed 4:ceee1eb7062e 163 return error;
jeroenmbed 4:ceee1eb7062e 164
jeroenmbed 4:ceee1eb7062e 165 }
jeroenmbed 4:ceee1eb7062e 166
jeroenmbed 4:ceee1eb7062e 167 void AVR910::poll(void)
jeroenmbed 4:ceee1eb7062e 168 {
jeroenmbed 4:ceee1eb7062e 169
jeroenmbed 4:ceee1eb7062e 170 int response = 0;
jeroenmbed 4:ceee1eb7062e 171
jeroenmbed 4:ceee1eb7062e 172 do {
jeroenmbed 4:ceee1eb7062e 173 spi_.write(0xF0);
jeroenmbed 4:ceee1eb7062e 174 spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 175 spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 176 response = spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 177 } while ((response & 0x01) != 0);
jeroenmbed 4:ceee1eb7062e 178
jeroenmbed 4:ceee1eb7062e 179 }
jeroenmbed 4:ceee1eb7062e 180
jeroenmbed 4:ceee1eb7062e 181 int AVR910::readVendorCode(void)
jeroenmbed 4:ceee1eb7062e 182 {
jeroenmbed 4:ceee1eb7062e 183
jeroenmbed 4:ceee1eb7062e 184 int response = 0;
jeroenmbed 4:ceee1eb7062e 185
jeroenmbed 4:ceee1eb7062e 186 //Issue read signature byte command.
jeroenmbed 4:ceee1eb7062e 187 //Address 0x00 is vendor code.
jeroenmbed 4:ceee1eb7062e 188 spi_.write(0x30);
jeroenmbed 4:ceee1eb7062e 189 spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 190 spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 191 response = spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 192
jeroenmbed 4:ceee1eb7062e 193 return response;
jeroenmbed 4:ceee1eb7062e 194
jeroenmbed 4:ceee1eb7062e 195 }
jeroenmbed 4:ceee1eb7062e 196
jeroenmbed 4:ceee1eb7062e 197 int AVR910::readPartFamilyAndFlashSize(void)
jeroenmbed 4:ceee1eb7062e 198 {
jeroenmbed 4:ceee1eb7062e 199
jeroenmbed 4:ceee1eb7062e 200 int response = 0;
jeroenmbed 4:ceee1eb7062e 201
jeroenmbed 4:ceee1eb7062e 202 //Issue read signature byte command.
jeroenmbed 4:ceee1eb7062e 203 //Address 0x01 is part family and flash size code.
jeroenmbed 4:ceee1eb7062e 204 spi_.write(0x30);
jeroenmbed 4:ceee1eb7062e 205 spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 206 spi_.write(0x01);
jeroenmbed 4:ceee1eb7062e 207 response = spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 208
jeroenmbed 4:ceee1eb7062e 209 return response;
jeroenmbed 4:ceee1eb7062e 210
jeroenmbed 4:ceee1eb7062e 211 }
jeroenmbed 4:ceee1eb7062e 212
jeroenmbed 4:ceee1eb7062e 213 int AVR910::readPartNumber(void)
jeroenmbed 4:ceee1eb7062e 214 {
jeroenmbed 4:ceee1eb7062e 215
jeroenmbed 4:ceee1eb7062e 216 int response = 0;
jeroenmbed 4:ceee1eb7062e 217
jeroenmbed 4:ceee1eb7062e 218 //Issue read signature byte command.
jeroenmbed 4:ceee1eb7062e 219 //Address 0x02 is part number code.
jeroenmbed 4:ceee1eb7062e 220 spi_.write(0x30);
jeroenmbed 4:ceee1eb7062e 221 spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 222 spi_.write(0x02);
jeroenmbed 4:ceee1eb7062e 223 response = spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 224
jeroenmbed 4:ceee1eb7062e 225 return response;
jeroenmbed 4:ceee1eb7062e 226
jeroenmbed 4:ceee1eb7062e 227 }
jeroenmbed 4:ceee1eb7062e 228
jeroenmbed 4:ceee1eb7062e 229 void AVR910::chipErase(void)
jeroenmbed 4:ceee1eb7062e 230 {
jeroenmbed 4:ceee1eb7062e 231
jeroenmbed 4:ceee1eb7062e 232 //Issue chip erase command.
jeroenmbed 4:ceee1eb7062e 233 spi_.write(0xAC);
jeroenmbed 4:ceee1eb7062e 234 spi_.write(0x80);
jeroenmbed 4:ceee1eb7062e 235 spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 236 spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 237
jeroenmbed 4:ceee1eb7062e 238 poll();
jeroenmbed 4:ceee1eb7062e 239
jeroenmbed 4:ceee1eb7062e 240 //Temporarily release reset line.
jeroenmbed 4:ceee1eb7062e 241 nReset_ = 1;
jeroenmbed 4:ceee1eb7062e 242 nReset_ = 0;
jeroenmbed 4:ceee1eb7062e 243
jeroenmbed 4:ceee1eb7062e 244 }
jeroenmbed 4:ceee1eb7062e 245
jeroenmbed 4:ceee1eb7062e 246 void AVR910::loadMemoryPage(int highLow, char address, char data)
jeroenmbed 4:ceee1eb7062e 247 {
jeroenmbed 4:ceee1eb7062e 248
jeroenmbed 4:ceee1eb7062e 249 spi_.write(highLow);
jeroenmbed 4:ceee1eb7062e 250 spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 251 spi_.write(address & 0x3F);
jeroenmbed 4:ceee1eb7062e 252 spi_.write(data);
jeroenmbed 4:ceee1eb7062e 253
jeroenmbed 4:ceee1eb7062e 254 poll();
jeroenmbed 4:ceee1eb7062e 255
jeroenmbed 4:ceee1eb7062e 256 }
jeroenmbed 4:ceee1eb7062e 257
jeroenmbed 4:ceee1eb7062e 258 void AVR910::writeFlashMemoryByte(int highLow, int address, char data)
jeroenmbed 4:ceee1eb7062e 259 {
jeroenmbed 4:ceee1eb7062e 260
jeroenmbed 4:ceee1eb7062e 261 spi_.write(highLow);
jeroenmbed 4:ceee1eb7062e 262 spi_.write(address & 0xFF00 >> 8);
jeroenmbed 4:ceee1eb7062e 263 spi_.write(address & 0x00FF);
jeroenmbed 4:ceee1eb7062e 264 spi_.write(data);
jeroenmbed 4:ceee1eb7062e 265
jeroenmbed 4:ceee1eb7062e 266 }
jeroenmbed 4:ceee1eb7062e 267
jeroenmbed 4:ceee1eb7062e 268 void AVR910::writeFlashMemoryPage(char pageNumber)
jeroenmbed 4:ceee1eb7062e 269 {
jeroenmbed 4:ceee1eb7062e 270
jeroenmbed 4:ceee1eb7062e 271 spi_.write(0x4C);
jeroenmbed 4:ceee1eb7062e 272 spi_.write((pageNumber >> 2) & 0x3F);
jeroenmbed 4:ceee1eb7062e 273 spi_.write((pageNumber & 0x03) << 6);
jeroenmbed 4:ceee1eb7062e 274 spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 275
jeroenmbed 4:ceee1eb7062e 276 poll();
jeroenmbed 4:ceee1eb7062e 277
jeroenmbed 4:ceee1eb7062e 278 }
jeroenmbed 4:ceee1eb7062e 279
jeroenmbed 4:ceee1eb7062e 280 char AVR910::readProgramMemory(int highLow, char pageNumber, char pageOffset)
jeroenmbed 4:ceee1eb7062e 281 {
jeroenmbed 4:ceee1eb7062e 282
jeroenmbed 4:ceee1eb7062e 283 int response = 0;
jeroenmbed 4:ceee1eb7062e 284
jeroenmbed 4:ceee1eb7062e 285 spi_.write(highLow);
jeroenmbed 4:ceee1eb7062e 286 spi_.write((pageNumber >> 2) & 0x3F);
jeroenmbed 4:ceee1eb7062e 287 spi_.write(((pageNumber & 0x03) << 6) | (pageOffset & 0x3F));
jeroenmbed 4:ceee1eb7062e 288 response = spi_.write(0x00);
jeroenmbed 4:ceee1eb7062e 289
jeroenmbed 4:ceee1eb7062e 290 poll();
jeroenmbed 4:ceee1eb7062e 291
jeroenmbed 4:ceee1eb7062e 292 return response;
jeroenmbed 4:ceee1eb7062e 293
jeroenmbed 4:ceee1eb7062e 294 }
jeroenmbed 4:ceee1eb7062e 295
jeroenmbed 4:ceee1eb7062e 296
jeroenmbed 4:ceee1eb7062e 297 int AVR910::checkMemoryData(int numPages, char* myData, int dataSize)
jeroenmbed 4:ceee1eb7062e 298 {
jeroenmbed 4:ceee1eb7062e 299
jeroenmbed 4:ceee1eb7062e 300 int success = 0;
jeroenmbed 4:ceee1eb7062e 301 int response = 0;
jeroenmbed 4:ceee1eb7062e 302 char c = 0;
jeroenmbed 4:ceee1eb7062e 303
jeroenmbed 4:ceee1eb7062e 304 // start at the beginning of the original data
jeroenmbed 4:ceee1eb7062e 305 int dpoint=0;
jeroenmbed 4:ceee1eb7062e 306
jeroenmbed 4:ceee1eb7062e 307 for (int i = 0; i <= numPages; i++) {
jeroenmbed 4:ceee1eb7062e 308 for (int j = 0; j < PAGE_SIZE; j++) {
jeroenmbed 4:ceee1eb7062e 309
jeroenmbed 4:ceee1eb7062e 310 c = myData[dpoint];
jeroenmbed 4:ceee1eb7062e 311 //Read program memory low byte.
jeroenmbed 4:ceee1eb7062e 312 response = readProgramMemory(READ_LOW_BYTE, i, j);
jeroenmbed 4:ceee1eb7062e 313 if ( c != response ) {
jeroenmbed 4:ceee1eb7062e 314 success = -1;
jeroenmbed 4:ceee1eb7062e 315 }
jeroenmbed 4:ceee1eb7062e 316
jeroenmbed 4:ceee1eb7062e 317 // next data item to check, break if all data has been checked
jeroenmbed 4:ceee1eb7062e 318 dpoint++;
jeroenmbed 4:ceee1eb7062e 319 if (dpoint==dataSize) break;
jeroenmbed 4:ceee1eb7062e 320 c = myData[dpoint];
jeroenmbed 4:ceee1eb7062e 321
jeroenmbed 4:ceee1eb7062e 322 //Read program memory high byte.
jeroenmbed 4:ceee1eb7062e 323 response = readProgramMemory(READ_HIGH_BYTE, i, j);
jeroenmbed 4:ceee1eb7062e 324 if ( c != response ) {
jeroenmbed 4:ceee1eb7062e 325 success = -1;
jeroenmbed 4:ceee1eb7062e 326 }
jeroenmbed 4:ceee1eb7062e 327
jeroenmbed 4:ceee1eb7062e 328 // next data item to check, break if all data has been checked
jeroenmbed 4:ceee1eb7062e 329 dpoint++;
jeroenmbed 4:ceee1eb7062e 330 if (dpoint==dataSize) break;
jeroenmbed 4:ceee1eb7062e 331 }
jeroenmbed 4:ceee1eb7062e 332 }
jeroenmbed 4:ceee1eb7062e 333
jeroenmbed 4:ceee1eb7062e 334 return success;
jeroenmbed 4:ceee1eb7062e 335
jeroenmbed 4:ceee1eb7062e 336 }