diff options
Diffstat (limited to 'ble/src/i2c.rs')
-rw-r--r-- | ble/src/i2c.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/ble/src/i2c.rs b/ble/src/i2c.rs new file mode 100644 index 0000000..13f5a5a --- /dev/null +++ b/ble/src/i2c.rs @@ -0,0 +1,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"); + } +} |