root / branches / wireless / code / projects / libdragonfly / eeprom.c @ 1513
History | View | Annotate | Download (2.41 KB)
1 | 1461 | bneuman | /**
|
---|---|---|---|
2 | * @file eeprom.c
|
||
3 | * @brief handles eeprom storage for persistent data
|
||
4 | *
|
||
5 | * Contains functions and definitions for reading and writing to eeprom
|
||
6 | *
|
||
7 | * @author Colony Project, Brad Neuman
|
||
8 | */
|
||
9 | |||
10 | 853 | bneuman | #include <avr/io.h> |
11 | #include "eeprom.h" |
||
12 | |||
13 | 1461 | bneuman | /** @brief store a byte to eeproem
|
14 | * @return 0 if success, nonzero on failure
|
||
15 | */
|
||
16 | 853 | bneuman | int eeprom_put_byte(unsigned int uiAddress, unsigned char ucData) { |
17 | /* Wait for completion of previous write */
|
||
18 | while(EECR & (1<<EEWE)); |
||
19 | /* Set up address and data registers */
|
||
20 | EEAR = uiAddress; |
||
21 | EEDR = ucData; |
||
22 | /* Write logical one to EEMWE */
|
||
23 | EECR |= (1<<EEMWE);
|
||
24 | /* Start eeprom write by setting EEWE */
|
||
25 | EECR |= (1<<EEWE);
|
||
26 | |||
27 | return 0; |
||
28 | } |
||
29 | |||
30 | 1461 | bneuman | /** @brief reads a byte from eeprom
|
31 | *
|
||
32 | * Pass it thge address and a pointer to a byte where the byte at the
|
||
33 | * address will be stored
|
||
34 | *
|
||
35 | * @return 0 if successful (byte is set to the eeprom value at addr),
|
||
36 | * nonzero if there was a problem
|
||
37 | */
|
||
38 | 853 | bneuman | int eeprom_get_byte(unsigned int uiAddress, unsigned char *byte) { |
39 | /* Wait for completion of previous write */
|
||
40 | while(EECR & (1<<EEWE)); |
||
41 | /* Set up address register */
|
||
42 | EEAR = uiAddress; |
||
43 | /* Start eeprom read by writing EERE */
|
||
44 | EECR |= (1<<EERE);
|
||
45 | /* get data from data register */
|
||
46 | *byte=EEDR; |
||
47 | |||
48 | return 0; |
||
49 | } |
||
50 | |||
51 | 1461 | bneuman | /** @brief get stored robot ID
|
52 | *
|
||
53 | * checks that EEPROM has been programed with an ID and returns it
|
||
54 | *
|
||
55 | * @return the robot id, if it is stored. If it returns 0xFF it is probably invalid
|
||
56 | */
|
||
57 | 853 | bneuman | unsigned char get_robotid(void) { |
58 | 945 | abuchan | unsigned char c0, c1, c2; |
59 | 853 | bneuman | |
60 | 945 | abuchan | eeprom_get_byte(EEPROM_ROBOT_ID_ADDR, &c0); |
61 | eeprom_get_byte(EEPROM_ROBOT_ID_ADDR+1, &c1);
|
||
62 | eeprom_get_byte(EEPROM_ROBOT_ID_ADDR+2, &c2);
|
||
63 | if(c0 == 'I' && c1 == 'D') |
||
64 | return c2;
|
||
65 | else
|
||
66 | return 0xFF; |
||
67 | } |
||
68 | |||
69 | 1461 | bneuman | /** @brief get stored robot ID
|
70 | *
|
||
71 | * checks that EEPROM has been programed with an BOM type and returns it
|
||
72 | *
|
||
73 | * @return the robot bom type as defined in bom.h, if it is stored. If it returns 0xFF it is probably invalid
|
||
74 | */
|
||
75 | 945 | abuchan | unsigned char get_bom_type(void) { |
76 | unsigned char c0, c1, c2, c3; |
||
77 | 853 | bneuman | |
78 | 945 | abuchan | eeprom_get_byte(EEPROM_BOM_TYPE_ADDR, &c0); |
79 | eeprom_get_byte(EEPROM_BOM_TYPE_ADDR+1, &c1);
|
||
80 | eeprom_get_byte(EEPROM_BOM_TYPE_ADDR+2, &c2);
|
||
81 | eeprom_get_byte(EEPROM_BOM_TYPE_ADDR+3, &c3);
|
||
82 | if(c0 == 'B' && c1 == 'O' && c2 == 'M') |
||
83 | return c3;
|
||
84 | else
|
||
85 | return 0xFF; |
||
86 | } |