Hanna
Sourcecode Batteriemanagementsystem
eeprom_driver.c
gehe zur Dokumentation dieser Datei
1 /* This file has been prepared for Doxygen automatic documentation generation.*/
59 #include "eeprom_driver.h"
60 
72 void EEPROM_WriteByte ( uint8_t pageAddr, uint8_t byteAddr, uint8_t value )
73 {
74  /* Flush buffer to make sure no unintetional data is written and load
75  * the "Page Load" command into the command register.
76  */
78  NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc;
79 
80  /* Calculate address */
81  uint16_t address = (uint16_t) (pageAddr * EEPROM_PAGESIZE) | (byteAddr & (EEPROM_PAGESIZE - 1));
82 
83  /* Set address to write to. */
84  NVM.ADDR0 = address & 0xFF;
85  NVM.ADDR1 = (address >> 8) & 0x1F;
86  NVM.ADDR2 = 0x00;
87 
88  /* Load data to write, which triggers the loading of EEPROM page buffer. */
89  NVM.DATA0 = value;
90 
91  /* Issue EEPROM Atomic Write (Erase&Write) command. Load command, write
92  * the protection signature and execute command.
93  */
94  NVM.CMD = NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc;
95  NVM_EXEC();
96 }
97 
98 void EEPROM_WriteBytes ( uint8_t pageAddr, uint8_t byteAddr, uint8_t len, uint32_t value )
99 {
100  uint8_t temp_data = 0;
101 
102  for ( int i = 0; i < len; i++ )
103  {
104  temp_data = (value >> ((len - i - 1) * 8)) & 0xFF;
105  EEPROM_WriteByte ( pageAddr, byteAddr + i, temp_data );
106  }
107 }
108 
119 uint8_t EEPROM_ReadByte ( uint8_t pageAddr, uint8_t byteAddr )
120 {
121  /* Wait until NVM is not busy. */
123 
124  /* Calculate address */
125  uint16_t address = (uint16_t) (pageAddr * EEPROM_PAGESIZE) | (byteAddr & (EEPROM_PAGESIZE - 1));
126 
127  /* Set address to read from. */
128  NVM.ADDR0 = address & 0xFF;
129  NVM.ADDR1 = (address >> 8) & 0x1F;
130  NVM.ADDR2 = 0x00;
131 
132  /* Issue EEPROM Read command. */
133  NVM.CMD = NVM_CMD_READ_EEPROM_gc;
134  NVM_EXEC();
135 
136  return NVM.DATA0;
137 }
138 
139 uint32_t EEPROM_ReadBytes ( uint8_t pageAddr, uint8_t byteAddr, uint8_t len )
140 {
141  uint32_t temp_data = 0;
142 
143  for ( int i = 0; i < len; i++ )
144  temp_data = (temp_data << 8) | EEPROM_ReadByte ( pageAddr, byteAddr + i );
145 
146  return temp_data;
147 }
148 
156 void EEPROM_WaitForNVM ( void )
157 {
158  do
159  {
160  /* Block execution while waiting for the NVM to be ready. */
161  }
162  while ( (NVM.STATUS & NVM_NVMBUSY_bm) == NVM_NVMBUSY_bm );
163 }
164 
173 void EEPROM_FlushBuffer ( void )
174 {
175  /* Wait until NVM is not busy. */
177 
178  /* Flush EEPROM page buffer if necessary. */
179  if ( (NVM.STATUS & NVM_EELOAD_bm) != 0 )
180  {
181  NVM.CMD = NVM_CMD_ERASE_EEPROM_BUFFER_gc;
182  NVM_EXEC();
183  }
184 }
185 
201 void EEPROM_LoadByte ( uint8_t byteAddr, uint8_t value )
202 {
203  /* Wait until NVM is not busy and prepare NVM command.*/
205  NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc;
206 
207  /* Set address. */
208  NVM.ADDR0 = byteAddr & 0xFF;
209  NVM.ADDR1 = 0x00;
210  NVM.ADDR2 = 0x00;
211 
212  /* Set data, which triggers loading of EEPROM page buffer. */
213  NVM.DATA0 = value;
214 }
215 
230 void EEPROM_LoadPage ( const uint8_t * values )
231 {
232  /* Wait until NVM is not busy. */
234  NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc;
235 
236  /* Set address to zero, as only the lower bits matters. ADDR0 is
237  * maintained inside the loop below.
238  */
239  NVM.ADDR1 = 0x00;
240  NVM.ADDR2 = 0x00;
241 
242  /* Load multiple bytes into page buffer. */
243  for ( uint8_t i = 0; i < EEPROM_PAGESIZE; ++i )
244  {
245  NVM.ADDR0 = i;
246  NVM.DATA0 = *values;
247  ++values;
248  }
249 }
250 
263 void EEPROM_AtomicWritePage ( uint8_t pageAddr )
264 {
265  /* Wait until NVM is not busy. */
267 
268  /* Calculate page address */
269  uint16_t address = (uint16_t) (pageAddr * EEPROM_PAGESIZE);
270 
271  /* Set address. */
272  NVM.ADDR0 = address & 0xFF;
273  NVM.ADDR1 = (address >> 8) & 0x1F;
274  NVM.ADDR2 = 0x00;
275 
276  /* Issue EEPROM Atomic Write (Erase&Write) command. */
277  NVM.CMD = NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc;
278  NVM_EXEC();
279 }
280 
287 void EEPROM_ErasePage ( uint8_t pageAddr )
288 {
289  /* Wait until NVM is not busy. */
291 
292  /* Calculate page address */
293  uint16_t address = (uint16_t) (pageAddr * EEPROM_PAGESIZE);
294 
295  /* Set address. */
296  NVM.ADDR0 = address & 0xFF;
297  NVM.ADDR1 = (address >> 8) & 0x1F;
298  NVM.ADDR2 = 0x00;
299 
300  /* Issue EEPROM Erase command. */
301  NVM.CMD = NVM_CMD_ERASE_EEPROM_PAGE_gc;
302  NVM_EXEC();
303 }
304 
315 void EEPROM_SplitWritePage ( uint8_t pageAddr )
316 {
317  /* Wait until NVM is not busy. */
319 
320  /* Calculate page address */
321  uint16_t address = (uint16_t) (pageAddr * EEPROM_PAGESIZE);
322 
323  /* Set address. */
324  NVM.ADDR0 = address & 0xFF;
325  NVM.ADDR1 = (address >> 8) & 0x1F;
326  NVM.ADDR2 = 0x00;
327 
328  /* Issue EEPROM Split Write command. */
329  NVM.CMD = NVM_CMD_WRITE_EEPROM_PAGE_gc;
330  NVM_EXEC();
331 }
332 
337 void EEPROM_EraseAll ( void )
338 {
339  /* Wait until NVM is not busy. */
341 
342  /* Issue EEPROM Erase All command. */
343  NVM.CMD = NVM_CMD_ERASE_EEPROM_gc;
344  NVM_EXEC();
345 }
346 
void EEPROM_SplitWritePage(uint8_t pageAddr)
Write (without erasing) EEPROM page.
void EEPROM_LoadByte(uint8_t byteAddr, uint8_t value)
Load single byte into temporary page buffer.
void EEPROM_LoadPage(const uint8_t *values)
Load entire page into temporary EEPROM page buffer.
uint8_t EEPROM_ReadByte(uint8_t pageAddr, uint8_t byteAddr)
Read one byte from EEPROM using IO mapping.
void EEPROM_FlushBuffer(void)
Flush temporary EEPROM page buffer.
void EEPROM_AtomicWritePage(uint8_t pageAddr)
Write already loaded page into EEPROM.
#define NVM_EXEC()
Non-Volatile Memory Execute Command.
void EEPROM_EraseAll(void)
Erase entire EEPROM memory.
void EEPROM_ErasePage(uint8_t pageAddr)
Erase EEPROM page.
XMEGA EEPROM driver header file.
void EEPROM_WaitForNVM(void)
Wait for any NVM access to finish, including EEPROM.
void EEPROM_WriteByte(uint8_t pageAddr, uint8_t byteAddr, uint8_t value)
Write one byte to EEPROM using IO mapping.
Definition: eeprom_driver.c:72