00001
00059 #include "eeprom_driver.h"
00060
00072 void EEPROM_WriteByte( uint8_t pageAddr, uint8_t byteAddr, uint8_t value )
00073 {
00074
00075
00076
00077 EEPROM_FlushBuffer();
00078 NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc;
00079
00080
00081 uint16_t address = (uint16_t)(pageAddr*EEPROM_PAGESIZE)
00082 |(byteAddr & (EEPROM_PAGESIZE-1));
00083
00084
00085 NVM.ADDR0 = address & 0xFF;
00086 NVM.ADDR1 = (address >> 8) & 0x1F;
00087 NVM.ADDR2 = 0x00;
00088
00089
00090 NVM.DATA0 = value;
00091
00092
00093
00094
00095 NVM.CMD = NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc;
00096 NVM_EXEC();
00097 }
00098
00099
00110 uint8_t EEPROM_ReadByte( uint8_t pageAddr, uint8_t byteAddr )
00111 {
00112
00113 EEPROM_WaitForNVM();
00114
00115
00116 uint16_t address = (uint16_t)(pageAddr*EEPROM_PAGESIZE)
00117 |(byteAddr & (EEPROM_PAGESIZE-1));
00118
00119
00120 NVM.ADDR0 = address & 0xFF;
00121 NVM.ADDR1 = (address >> 8) & 0x1F;
00122 NVM.ADDR2 = 0x00;
00123
00124
00125 NVM.CMD = NVM_CMD_READ_EEPROM_gc;
00126 NVM_EXEC();
00127
00128 return NVM.DATA0;
00129 }
00130
00131
00139 void EEPROM_WaitForNVM( void )
00140 {
00141 do {
00142
00143 } while ((NVM.STATUS & NVM_NVMBUSY_bm) == NVM_NVMBUSY_bm);
00144 }
00145
00146
00155 void EEPROM_FlushBuffer( void )
00156 {
00157
00158 EEPROM_WaitForNVM();
00159
00160
00161 if ((NVM.STATUS & NVM_EELOAD_bm) != 0) {
00162 NVM.CMD = NVM_CMD_ERASE_EEPROM_BUFFER_gc;
00163 NVM_EXEC();
00164 }
00165 }
00166
00167
00183 void EEPROM_LoadByte( uint8_t byteAddr, uint8_t value )
00184 {
00185
00186 EEPROM_WaitForNVM();
00187 NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc;
00188
00189
00190 NVM.ADDR0 = byteAddr & 0xFF;
00191 NVM.ADDR1 = 0x00;
00192 NVM.ADDR2 = 0x00;
00193
00194
00195 NVM.DATA0 = value;
00196 }
00197
00198
00213 void EEPROM_LoadPage( const uint8_t * values )
00214 {
00215
00216 EEPROM_WaitForNVM();
00217 NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc;
00218
00219
00220
00221
00222 NVM.ADDR1 = 0x00;
00223 NVM.ADDR2 = 0x00;
00224
00225
00226 for (uint8_t i = 0; i < EEPROM_PAGESIZE; ++i) {
00227 NVM.ADDR0 = i;
00228 NVM.DATA0 = *values;
00229 ++values;
00230 }
00231 }
00232
00245 void EEPROM_AtomicWritePage( uint8_t pageAddr )
00246 {
00247
00248 EEPROM_WaitForNVM();
00249
00250
00251 uint16_t address = (uint16_t)(pageAddr*EEPROM_PAGESIZE);
00252
00253
00254 NVM.ADDR0 = address & 0xFF;
00255 NVM.ADDR1 = (address >> 8) & 0x1F;
00256 NVM.ADDR2 = 0x00;
00257
00258
00259 NVM.CMD = NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc;
00260 NVM_EXEC();
00261 }
00262
00263
00270 void EEPROM_ErasePage( uint8_t pageAddr )
00271 {
00272
00273 EEPROM_WaitForNVM();
00274
00275
00276 uint16_t address = (uint16_t)(pageAddr*EEPROM_PAGESIZE);
00277
00278
00279 NVM.ADDR0 = address & 0xFF;
00280 NVM.ADDR1 = (address >> 8) & 0x1F;
00281 NVM.ADDR2 = 0x00;
00282
00283
00284 NVM.CMD = NVM_CMD_ERASE_EEPROM_PAGE_gc;
00285 NVM_EXEC();
00286 }
00287
00288
00299 void EEPROM_SplitWritePage( uint8_t pageAddr )
00300 {
00301
00302 EEPROM_WaitForNVM();
00303
00304
00305 uint16_t address = (uint16_t)(pageAddr*EEPROM_PAGESIZE);
00306
00307
00308 NVM.ADDR0 = address & 0xFF;
00309 NVM.ADDR1 = (address >> 8) & 0x1F;
00310 NVM.ADDR2 = 0x00;
00311
00312
00313 NVM.CMD = NVM_CMD_WRITE_EEPROM_PAGE_gc;
00314 NVM_EXEC();
00315 }
00316
00321 void EEPROM_EraseAll( void )
00322 {
00323
00324 EEPROM_WaitForNVM();
00325
00326
00327 NVM.CMD = NVM_CMD_ERASE_EEPROM_gc;
00328 NVM_EXEC();
00329 }
00330