📄 eeprom.lst
字号:
216 3 {
217 4 if ( Boot_Flash_Write( last_address++, ptr[j] ) ) return FLASH_WRITE_ERROR;
218 4 }
219 3 }
220 2 }
221 1
222 1 return 0;
223 1 }
224
225 /***** Update_Record *****/
226 // Update record in EEPROM.
227 // Accepts record id and new record data.
228 // Swaps to empty sector if current sector is full
229 BYTE Update_Record(WORD id, BYTE xdata *buf)
230 {
231 1 BYTE i;
232 1 BYTE xdata status;
233 1 BYTE xdata bufover[EEPROM_RECORD_SIZE];
234 1
235 1 status = Write_Record(id, buf);
236 1
237 1 // when the sector is full, save the new record to ram and transfer to a blank sector
238 1 if( status == SECTOR_FULL )
239 1 {
240 2 // store new data in temporary buffer
241 2 for ( i=0; i < sizeof(bufover); i++ )
C51 COMPILER V7.00 EEPROM 02/10/2003 10:48:05 PAGE 5
242 2 {
243 3 bufover[i] = buf[i];
244 3 }
245 2 // perform sector swap
246 2 status = Eeprom_Sector_Swap(id, &bufover);
247 2 }
248 1
249 1 return status;
250 1 }
251
252 /***** Read_Record *****/
253 // Reads a data element from EEPROM.
254 // Accepts record id number.
255 // Returns record data byte. If error, returns error code.
256 BYTE Read_Record(WORD id_number, BYTE* buffer)
257 {
258 1 BYTE xdata valid_sector = 0xFF;
259 1 xdata struct sector_header xdata header;
260 1 xdata struct record_entry xdata record;
261 1 WORD i;
262 1 BYTE *ptr;
263 1 BYTE xdata *data_buf;
264 1 WORD xdata address;
265 1 WORD xdata base_address;
266 1 WORD xdata last_address;
267 1
268 1 // get active sector
269 1 valid_sector = Find_Active_Sector(F_READ);
270 1 if ( valid_sector == SECTOR_ID_ERROR ) return SECTOR_ID_ERROR;
271 1
272 1 // get pointer to data
273 1 data_buf = buffer;
274 1
275 1 // calculate base address of data
276 1 base_address = SECTOR_0_BASE_ADDRESS + ((WORD)valid_sector * SECTOR_SIZE) +
277 1 (WORD)sizeof(header) + ( id_number * (WORD)sizeof(record) );
278 1
279 1 // get base record
280 1 ptr = (BYTE*) (&record);
281 1 address = base_address;
282 1 for ( i=0; i<sizeof(record); i++ )
283 1 {
284 2 ptr[i] = Boot_Flash_Read( address++ );
285 2 }
286 1
287 1 // get last record
288 1 if ( record.last_record_update != 0xFFFF )
289 1 {
290 2 address = base_address;
291 2 do
292 2 {
293 3 ptr = (BYTE*) (&record);
294 3 last_address = address;
295 3 for ( i=0; i<sizeof(record); i++ )
296 3 {
297 4 ptr[i] = Boot_Flash_Read( address++ );
298 4 }
299 3 address = record.last_record_update;
300 3 } while ( record.last_record_update != 0xFFFF );
301 2 }
302 1 else
303 1 {
C51 COMPILER V7.00 EEPROM 02/10/2003 10:48:05 PAGE 6
304 2 last_address = base_address;
305 2 }
306 1
307 1 if( record.status == UNINITIALIZED ) return UNINITIALIZED;
308 1
309 1 // Set data buffer
310 1 for ( i=0; i<EEPROM_RECORD_SIZE; i++ )
311 1 {
312 2 data_buf[i] = record.record_data[i];
313 2 }
314 1
315 1 return 0;
316 1 }
317
318 /***** Write_Record *****/
319 // Write or update record in EEPROM.
320 // Accepts record id and new record data.
321 // If error, returns error code.
322 BYTE Write_Record(WORD id, BYTE xdata *buffer)
323 {
324 1 xdata struct sector_header xdata header;
325 1 xdata struct record_entry xdata record;
326 1 WORD i;
327 1 BYTE xdata valid_sector;
328 1 WORD xdata last_address;
329 1 WORD xdata base_address;
330 1 WORD xdata new_address;
331 1 WORD address;
332 1 BYTE *ptr;
333 1 BYTE xdata *data_buf;
334 1
335 1 // get active sector
336 1 valid_sector = Find_Active_Sector(F_WRITE);
337 1 if ( valid_sector == SECTOR_ID_ERROR ) return SECTOR_ID_ERROR;
338 1
339 1 // get pointer to data
340 1 data_buf = buffer;
341 1
342 1 // calculate base address of data
343 1 base_address = SECTOR_0_BASE_ADDRESS + ((WORD)valid_sector * SECTOR_SIZE) +
344 1 (WORD)sizeof(header) + ( id * (WORD)sizeof(record) );
345 1
346 1 // get base record
347 1 ptr = (BYTE*) (&record);
348 1 address = base_address;
349 1 for ( i=0; i<sizeof(record); i++ )
350 1 {
351 2 ptr[i] = Boot_Flash_Read( address++ );
352 2 }
353 1
354 1 // write data if record not initialized
355 1 if ( record.status == UNINITIALIZED )
356 1 {
357 2 record.status = VALID_DATA;
358 2 record.last_record_update = 0xFFFF;
359 2 for ( i=0; i < EEPROM_RECORD_SIZE; i++ )
360 2 {
361 3 record.record_data[i] = data_buf[i]; // set data byte
362 3 }
363 2
364 2 // write record to flash
365 2 ptr = (BYTE*) (&record);
C51 COMPILER V7.00 EEPROM 02/10/2003 10:48:05 PAGE 7
366 2 address = base_address;
367 2 for ( i=0; i < sizeof(record); i++ )
368 2 {
369 3 if ( Boot_Flash_Write( address++, ptr[i] ) ) return FLASH_WRITE_ERROR;
370 3 }
371 2
372 2 return 0;
373 2 }
374 1
375 1 // find last entry if record initialized
376 1 address = base_address;
377 1 do
378 1 {
379 2 ptr = (BYTE*) (&record);
380 2 for ( i=0; i<sizeof(record); i++ )
381 2 {
382 3 ptr[i] = Boot_Flash_Read( address++ );
383 3 }
384 2 if ( record.status == SUPERSEDED )
385 2 {
386 3 address = record.last_record_update;
387 3 }
388 2
389 2 } while ( record.status == SUPERSEDED );
390 1
391 1 last_address = address - (WORD)sizeof(record);
392 1
393 1 // get next available address
394 1 new_address = Find_Next_Address();
395 1 if( new_address == SECTOR_FULL ) return SECTOR_FULL; // abort if sector is full
396 1
397 1 // set old record to update in progress
398 1 address = last_address;
399 1 for ( i=0; i<sizeof(record); i++ )
400 1 {
401 2 ptr[i] = Boot_Flash_Read( address++ );
402 2 }
403 1 record.status = UPDATE_DATA;
404 1 address = last_address;
405 1 for ( i=0; i < sizeof(record); i++ )
406 1 {
407 2 if ( Boot_Flash_Write( address++, ptr[i] ) ) return FLASH_WRITE_ERROR;
408 2 }
409 1
410 1 // write data to new address
411 1 address = new_address;
412 1 record.status = VALID_DATA;
413 1 record.last_record_update = 0xFFFF;
414 1 for ( i=0; i < EEPROM_RECORD_SIZE; i++ )
415 1 {
416 2 record.record_data[i] = data_buf[i]; // set data byte
417 2 }
418 1 address = new_address;
419 1 for ( i=0; i < sizeof(record); i++ )
420 1 {
421 2 if ( Boot_Flash_Write( address++, ptr[i] ) ) return FLASH_WRITE_ERROR;
422 2 }
423 1
424 1 // update old record to superseded
425 1 address = last_address;
426 1 for ( i=0; i<sizeof(record); i++ )
427 1 {
C51 COMPILER V7.00 EEPROM 02/10/2003 10:48:05 PAGE 8
428 2 ptr[i] = Boot_Flash_Read( address++ );
429 2 }
430 1 record.status = SUPERSEDED;
431 1 record.last_record_update = new_address;
432 1 address = last_address;
433 1 for ( i=0; i < sizeof(record); i++ )
434 1 {
435 2 if ( Boot_Flash_Write( address++, ptr[i] ) ) return FLASH_WRITE_ERROR;
436 2 }
437 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -