diff --git a/examples/rtt_rtic_i2c.rs b/examples/rtt_rtic_i2c.rs
index 82a6b1042ce7dff522fecc4f5d4d25a6830defd8..a1b6910a06fefef523947cc2120c7b3dac494b4c 100644
--- a/examples/rtt_rtic_i2c.rs
+++ b/examples/rtt_rtic_i2c.rs
@@ -126,6 +126,18 @@ mod SC18IS602 {
         }
     }
 
+    pub enum Speed {
+        Speed_1843_kHz = 0b00,
+        Speed_461_kHz = 0b01,
+        Speed_115_kHz = 0b10,
+        Speed_58_kHz = 0b11,
+    }
+
+    pub enum Order {
+        MsbFirst = 0b0,
+        MsbLast = 0b1,
+    }
+
     enum GpioMode {
         QuasiBiDirectional = 0b00,
         PushPull = 0b01,
@@ -139,42 +151,79 @@ mod SC18IS602 {
         }
     }
 
-    use embedded_hal::{blocking::i2c, digital::v2::OutputPin};
+    use embedded_hal::{
+        blocking::{i2c, spi::Transfer},
+        digital::v2::OutputPin,
+        spi::Mode,
+    };
 
     enum Error {
         NotConfigured,
     }
-    // struct SH18IS602<PINS> {
+
     struct SH18IS602<I2C>
     where
-        I2C: i2c::Write,
+        I2C: i2c::Write + i2c::Read,
     {
         addr: u8,
         cs: bool,
         i2c: I2C,
     }
 
+    use Function::*;
     impl<I2C> SH18IS602<I2C>
     where
-        I2C: i2c::Write,
+        I2C: i2c::Write + i2c::Read,
     {
-        fn new(mut i2c: I2C, addr: u8, cs: bool) -> SH18IS602<I2C> {
+        fn new(
+            mut i2c: I2C,
+            addr: u8,
+            order: Order,
+            mode: Mode,
+            speed: Speed,
+            cs: bool,
+        ) -> SH18IS602<I2C> {
+            let addr = (0x50 + addr) >> 1;
+            // set configuration
+            let cfg = (order as u8) << 5
+                | (mode.polarity as u8) << 3
+                | (mode.phase as u8) << 2
+                | speed as u8;
+
+            let x = i2c.write(addr, &[SpiConfigure.id(), cfg]).ok();
+
+            cortex_m::asm::delay(100_000);
+
             if cs {
-                let addr = (0x50 + addr) >> 1;
                 // Configure SS0 as GPIO
-                i2c.write(addr, &[Function::GpioEnable.id(), 0x1]).ok();
-
-                // Configure SS0 as a PushPull Output
-                i2c.write(
-                    addr,
-                    &[Function::GpioConfigure.id(), GpioMode::PushPull.val()],
-                )
-                .ok();
+                i2c.write(addr, &[GpioEnable.id(), 0x1]).ok();
+
+                // Configure GPIO SS0 as a PushPull Output
+                i2c.write(addr, &[GpioConfigure.id(), GpioMode::PushPull.val()])
+                    .ok();
             }
             SH18IS602 { addr, cs, i2c }
         }
     }
 
+    impl<I2C> Transfer<u8> for SH18IS602<I2C>
+    where
+        I2C: i2c::Write + i2c::Read,
+    {
+        type Error = Error;
+        fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], Self::Error> {
+            // initiate a transfer on SS0
+            let mut buff = [0; 8];
+            buff[0] = 0x01; // SSO write
+            buff[1..].clone_from_slice(words);
+            // perform the transaction on words.len() + 1 bytes
+            // the actual SPI transfer should be words.len()
+            self.i2c.write(self.addr, &buff[0..words.len() + 1]).ok();
+            self.i2c.read(self.addr, words).ok();
+            Ok(words)
+        }
+    }
+
     // fn set<I2C>(i2c: I2C, data: u8)
     // where
     //     I2C: i2c::Write,
@@ -184,7 +233,7 @@ mod SC18IS602 {
 
     impl<I2C> OutputPin for SH18IS602<I2C>
     where
-        I2C: i2c::Write,
+        I2C: i2c::Write + i2c::Read,
     {
         type Error = Error;