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
|
use log::{error, info, trace};
use nrf52840_hal::twis::{self, Twis, TwisInterrupt};
pub fn setup<T>(mut twis: Twis<T>) -> impl FnMut()
where
T: twis::Instance,
{
// TODO: we only care about `Write` and `Stopped`.
twis.enable_interrupt(TwisInterrupt::Stopped);
twis.enable_interrupt(TwisInterrupt::Error);
twis.enable_interrupt(TwisInterrupt::RxStarted);
twis.enable_interrupt(TwisInterrupt::TxStarted);
twis.enable_interrupt(TwisInterrupt::Write);
twis.enable_interrupt(TwisInterrupt::Read);
let mut buf: [u8; 255] = [0; 255];
move || handler(&mut twis, &mut buf)
}
fn handler<T>(twis: &mut Twis<T>, buf: &mut [u8])
where
T: twis::Instance,
{
if twis.get_event_triggered(TwisInterrupt::Stopped, true) {
trace!("i²c stopped: {}", twis.amount());
} else if twis.get_event_triggered(TwisInterrupt::Error, true) {
trace!("i²c error");
} else if twis.get_event_triggered(TwisInterrupt::RxStarted, true) {
trace!("i²c rxstarted");
} else if twis.get_event_triggered(TwisInterrupt::TxStarted, true) {
trace!("i²c txstarted");
} else if twis.get_event_triggered(TwisInterrupt::Write, true) {
trace!("i²c write");
match twis.read(buf) {
Ok(len) => info!("buf {}: {:?}", len, &buf[..len]),
Err(e) => error!("{:?}", e),
}
} else if twis.get_event_triggered(TwisInterrupt::Read, true) {
trace!("i²c read");
} else {
trace!("i²c unknown");
}
}
|