~ruther/avr-guess-the-number

ref: bf678fca8282e7ba2e2062933ab96a99181f4a40 avr-guess-the-number/src/eeprom.rs -rw-r--r-- 1.4 KiB
bf678fca — František Boháček feat: add eeprom support 2 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
pub struct Eeprom {
    eeprom: avr_device::atmega8::EEPROM,
}

impl Eeprom {
    pub fn new(ep: avr_device::atmega8::EEPROM) -> Eeprom {
        Eeprom {
            eeprom: ep
        }
    }

    fn wait_until_write(&self) {
        while self.eeprom.eecr.read().eewe().bit_is_set() {}
    }

    pub fn read(&self, address: u16, data: &mut [u8]) {
        let mut address = address;
        for i in 0..data.len() {
            let byte = self.read_byte(address);
            data[i] = byte;
            address += 1;
        }
    }

    pub fn write(&self, address: u16, data: &[u8]) {
        let mut address = address;
        for byte in data.iter() {
            self.write_byte(address, *byte);
            address += 1;
        }
    }

    pub fn read_byte(&self, address: u16) -> u8 {
        self.wait_until_write();

        self.eeprom.eear.write(|w| unsafe {
            w.bits(address)
        });

        self.eeprom.eecr.write(|w| w.eere().set_bit());
        self.eeprom.eedr.read().bits()
    }

    pub fn write_byte(&self, address: u16, data: u8) {
        self.wait_until_write();

        self.eeprom.eear.write(|w| unsafe {
            w.bits(address)
        });
        self.eeprom.eedr.write(|w| unsafe {
            w.bits(data)
        });

        self.eeprom.eecr.write(|w|
            w
                .eemwe().set_bit()
                .eewe().clear_bit());

        self.eeprom.eecr.write(|w|  w.eewe().set_bit());
    }
}
Do not follow this link