00001
00050 #include "avr_compiler.h"
00051
00052 #define PAGESIZE 32 //EEPROM page size
00053
00054
00055 void EEPROM_write_page (uint8_t * page, uint8_t page_no);
00056
00057
00058
00059
00060
00061
00062
00063 ISR(NVM_EE_vect)
00064 {
00065
00066 NVM.INTCTRL = (NVM.INTCTRL & ~NVM_EELVL_gm);
00067 return;
00068 }
00069
00070
00071
00072 int main (void)
00073 {
00074 uint8_t eeprom_page[PAGESIZE];
00075
00076
00077 for(int i = 0; i < PAGESIZE; i++)
00078 {
00079 eeprom_page[i] = i;
00080 }
00081
00082
00083
00084 EEPROM_write_page(eeprom_page, 2);
00085
00086
00087 while(1){}
00088 }
00089
00090
00091
00092
00093
00094 void EEPROM_write_page (uint8_t * page, uint8_t page_no)
00095 {
00096
00097 NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc;
00098
00099
00100 NVM.ADDR2 = 0;
00101 NVM.ADDR1 = 0;
00102
00103
00104 for(int i = 0; i < PAGESIZE; i++)
00105 {
00106
00107 NVM.ADDR0 = i;
00108
00109 NVM.DATA0 = page[i];
00110 }
00111
00112
00113 NVM.CMD = NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc;
00114
00115
00116 uint16_t address = (uint16_t)(page_no*PAGESIZE);
00117
00118
00119 NVM.ADDR0 = address & 0xFF;
00120 NVM.ADDR1 = (address >> 8) & 0x1F;
00121 NVM.ADDR2 = 0x00;
00122
00123
00124 uint8_t sleepCtr = SLEEP.CTRL;
00125
00126 SLEEP.CTRL = (SLEEP.CTRL & ~SLEEP.CTRL) | SLEEP_SMODE_IDLE_gc;
00127
00128 uint8_t statusStore = PMIC.STATUS;
00129 uint8_t pmicStore = PMIC.CTRL;
00130
00131
00132 PMIC.CTRL = (PMIC.CTRL & ~PMIC_HILVLEN_bm) | PMIC_HILVLEN_bm;
00133
00134 uint8_t globalInt = SREG;
00135
00136 sei();
00137
00138 SLEEP.CTRL |= SLEEP_SEN_bm;
00139
00140 uint8_t eepromintStore = NVM.INTCTRL;
00141
00142
00143
00144
00145 CCP = CCP_IOREG_gc;
00146
00147 NVM.CTRLA = NVM_CMDEX_bm;
00148
00149 NVM.INTCTRL = NVM_EELVL0_bm | NVM_EELVL1_bm;
00150
00151 __sleep();
00152
00153
00154
00155 SLEEP.CTRL = sleepCtr;
00156
00157 PMIC.STATUS = statusStore;
00158 PMIC.CTRL = pmicStore;
00159
00160 NVM.INTCTRL = eepromintStore;
00161
00162 SREG = globalInt;
00163 }