Xmega Application Note


eeprom_driver.c

Go to the documentation of this file.
00001 /* This file has been prepared for Doxygen automatic documentation generation.*/
00059 #include "eeprom_driver.h"
00060 
00072 void EEPROM_WriteByte( uint8_t pageAddr, uint8_t byteAddr, uint8_t value )
00073 {
00074         /*  Flush buffer to make sure no unintetional data is written and load
00075          *  the "Page Load" command into the command register.
00076          */
00077         EEPROM_FlushBuffer();
00078         NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc;
00079 
00080         /* Calculate address */
00081         uint16_t address = (uint16_t)(pageAddr*EEPROM_PAGESIZE)
00082                                     |(byteAddr & (EEPROM_PAGESIZE-1));
00083 
00084         /* Set address to write to. */
00085         NVM.ADDR0 = address & 0xFF;
00086         NVM.ADDR1 = (address >> 8) & 0x1F;
00087         NVM.ADDR2 = 0x00;
00088 
00089         /* Load data to write, which triggers the loading of EEPROM page buffer. */
00090         NVM.DATA0 = value;
00091 
00092         /*  Issue EEPROM Atomic Write (Erase&Write) command. Load command, write
00093          *  the protection signature and execute command.
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         /* Wait until NVM is not busy. */
00113         EEPROM_WaitForNVM();
00114 
00115         /* Calculate address */
00116         uint16_t address = (uint16_t)(pageAddr*EEPROM_PAGESIZE)
00117                                     |(byteAddr & (EEPROM_PAGESIZE-1));
00118 
00119         /* Set address to read from. */
00120         NVM.ADDR0 = address & 0xFF;
00121         NVM.ADDR1 = (address >> 8) & 0x1F;
00122         NVM.ADDR2 = 0x00;
00123 
00124         /* Issue EEPROM Read command. */
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                 /* Block execution while waiting for the NVM to be ready. */
00143         } while ((NVM.STATUS & NVM_NVMBUSY_bm) == NVM_NVMBUSY_bm);
00144 }
00145 
00146 
00155 void EEPROM_FlushBuffer( void )
00156 {
00157         /* Wait until NVM is not busy. */
00158         EEPROM_WaitForNVM();
00159 
00160         /* Flush EEPROM page buffer if necessary. */
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         /* Wait until NVM is not busy and prepare NVM command.*/
00186         EEPROM_WaitForNVM();
00187         NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc;
00188 
00189         /* Set address. */
00190         NVM.ADDR0 = byteAddr & 0xFF;
00191         NVM.ADDR1 = 0x00;
00192         NVM.ADDR2 = 0x00;
00193 
00194         /* Set data, which triggers loading of EEPROM page buffer. */
00195         NVM.DATA0 = value;
00196 }
00197 
00198 
00213 void EEPROM_LoadPage( const uint8_t * values )
00214 {
00215         /* Wait until NVM is not busy. */
00216         EEPROM_WaitForNVM();
00217         NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc;
00218 
00219         /*  Set address to zero, as only the lower bits matters. ADDR0 is
00220          *  maintained inside the loop below.
00221          */
00222         NVM.ADDR1 = 0x00;
00223         NVM.ADDR2 = 0x00;
00224 
00225         /* Load multible bytes into page buffer. */
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         /* Wait until NVM is not busy. */
00248         EEPROM_WaitForNVM();
00249 
00250         /* Calculate page address */
00251         uint16_t address = (uint16_t)(pageAddr*EEPROM_PAGESIZE);
00252 
00253         /* Set address. */
00254         NVM.ADDR0 = address & 0xFF;
00255         NVM.ADDR1 = (address >> 8) & 0x1F;
00256         NVM.ADDR2 = 0x00;
00257 
00258         /* Issue EEPROM Atomic Write (Erase&Write) command. */
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         /* Wait until NVM is not busy. */
00273         EEPROM_WaitForNVM();
00274 
00275         /* Calculate page address */
00276         uint16_t address = (uint16_t)(pageAddr*EEPROM_PAGESIZE);
00277 
00278         /* Set address. */
00279         NVM.ADDR0 = address & 0xFF;
00280         NVM.ADDR1 = (address >> 8) & 0x1F;
00281         NVM.ADDR2 = 0x00;
00282 
00283         /* Issue EEPROM Erase command. */
00284         NVM.CMD = NVM_CMD_ERASE_EEPROM_PAGE_gc;
00285         NVM_EXEC();
00286 }
00287 
00288 
00299 void EEPROM_SplitWritePage( uint8_t pageAddr )
00300 {
00301         /* Wait until NVM is not busy. */
00302         EEPROM_WaitForNVM();
00303 
00304         /* Calculate page address */
00305         uint16_t address = (uint16_t)(pageAddr*EEPROM_PAGESIZE);
00306 
00307         /* Set address. */
00308         NVM.ADDR0 = address & 0xFF;
00309         NVM.ADDR1 = (address >> 8) & 0x1F;
00310         NVM.ADDR2 = 0x00;
00311 
00312         /* Issue EEPROM Split Write command. */
00313         NVM.CMD = NVM_CMD_WRITE_EEPROM_PAGE_gc;
00314         NVM_EXEC();
00315 }
00316 
00321 void EEPROM_EraseAll( void )
00322 {
00323         /* Wait until NVM is not busy. */
00324         EEPROM_WaitForNVM();
00325 
00326         /* Issue EEPROM Erase All command. */
00327         NVM.CMD = NVM_CMD_ERASE_EEPROM_gc;
00328         NVM_EXEC();
00329 }
00330 
@DOC_TITLE@
Generated on Fri Mar 27 14:05:25 2009 for AVR1605: XMEGA BOOTLOADER by doxygen 1.5.8