summaryrefslogtreecommitdiffstats
path: root/ble/src/i2c.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ble/src/i2c.rs')
-rw-r--r--ble/src/i2c.rs43
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");
+ }
+}