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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
//! Blocking I2C API //! //! Slave addresses used by this API are 7-bit I2C addresses ranging from 0 to 127. //! //! Operations on 10-bit slave addresses are not supported by the API yet (but applications might //! be able to emulate some operations). /// Blocking read pub trait Read { /// Error type type Error; /// Reads enough bytes from slave with `address` to fill `buffer` /// /// # I2C Events (contract) /// /// ``` text /// Master: ST SAD+R MAK MAK ... NMAK SP /// Slave: SAK B0 B1 ... BN /// ``` /// /// Where /// /// - `ST` = start condition /// - `SAD+R` = slave address followed by bit 1 to indicate reading /// - `SAK` = slave acknowledge /// - `Bi` = ith byte of data /// - `MAK` = master acknowledge /// - `NMAK` = master no acknowledge /// - `SP` = stop condition fn read(&mut self, address: u8, buffer: &mut [u8]) -> Result<(), Self::Error>; } /// Blocking write pub trait Write { /// Error type type Error; /// Sends bytes to slave with address `addr` /// /// # I2C Events (contract) /// /// ``` text /// Master: ST SAD+W B0 B1 ... BN SP /// Slave: SAK SAK SAK ... SAK /// ``` /// /// Where /// /// - `ST` = start condition /// - `SAD+W` = slave address followed by bit 0 to indicate writing /// - `SAK` = slave acknowledge /// - `Bi` = ith byte of data /// - `SP` = stop condition fn write(&mut self, addr: u8, bytes: &[u8]) -> Result<(), Self::Error>; } /// Blocking write (iterator version) #[cfg(feature = "unproven")] pub trait WriteIter { /// Error type type Error; /// Sends bytes to slave with address `addr` /// /// # I2C Events (contract) /// /// Same as `Write` fn write<B>(&mut self, addr: u8, bytes: B) -> Result<(), Self::Error> where B: IntoIterator<Item = u8>; } /// Blocking write + read pub trait WriteRead { /// Error type type Error; /// Sends bytes to slave with address `addr` and then reads enough bytes to fill `buffer` *in a /// single transaction* /// /// # I2C Events (contract) /// /// ``` text /// Master: ST SAD+W O0 O1 ... OM SR SAD+R MAK MAK ... NMAK SP /// Slave: SAK SAK SAK ... SAK SAK I0 I1 ... IN /// ``` /// /// Where /// /// - `ST` = start condition /// - `SAD+W` = slave address followed by bit 0 to indicate writing /// - `SAK` = slave acknowledge /// - `Oi` = ith outgoing byte of data /// - `SR` = repeated start condition /// - `SAD+R` = slave address followed by bit 1 to indicate reading /// - `Ii` = ith incoming byte of data /// - `MAK` = master acknowledge /// - `NMAK` = master no acknowledge /// - `SP` = stop condition fn write_read( &mut self, address: u8, bytes: &[u8], buffer: &mut [u8], ) -> Result<(), Self::Error>; } /// Blocking write (iterator version) + read #[cfg(feature = "unproven")] pub trait WriteIterRead { /// Error type type Error; /// Sends bytes to slave with address `addr` and then reads enough bytes to fill `buffer` *in a /// single transaction* /// /// # I2C Events (contract) /// /// Same as the `WriteRead` trait fn write_iter_read<B>( &mut self, address: u8, bytes: B, buffer: &mut [u8], ) -> Result<(), Self::Error> where B: IntoIterator<Item = u8>; }