aboutsummaryrefslogtreecommitdiff
path: root/embassy-embedded-hal/src/shared_bus/blocking/i2c.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-embedded-hal/src/shared_bus/blocking/i2c.rs')
-rw-r--r--embassy-embedded-hal/src/shared_bus/blocking/i2c.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/embassy-embedded-hal/src/shared_bus/blocking/i2c.rs b/embassy-embedded-hal/src/shared_bus/blocking/i2c.rs
index 2c762fe14..bfbcb6c2e 100644
--- a/embassy-embedded-hal/src/shared_bus/blocking/i2c.rs
+++ b/embassy-embedded-hal/src/shared_bus/blocking/i2c.rs
@@ -1,4 +1,21 @@
1//! Blocking shared I2C bus 1//! Blocking shared I2C bus
2//!
3//! # Example (nrf52)
4//!
5//! ```rust
6//! use embassy_embedded_hal::shared_bus::blocking::i2c::I2cBusDevice;
7//! use embassy::blocking_mutex::{NoopMutex, raw::NoopRawMutex};
8//!
9//! static I2C_BUS: Forever<NoopMutex<RefCell<Twim<TWISPI0>>>> = Forever::new();
10//! let irq = interrupt::take!(SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0);
11//! let i2c = Twim::new(p.TWISPI0, irq, p.P0_03, p.P0_04, Config::default());
12//! let i2c_bus = NoopMutex::new(RefCell::new(i2c));
13//! let i2c_bus = I2C_BUS.put(i2c_bus);
14//!
15//! let i2c_dev1 = I2cBusDevice::new(i2c_bus);
16//! let mpu = Mpu6050::new(i2c_dev1);
17//! ```
18
2use core::cell::RefCell; 19use core::cell::RefCell;
3 20
4use embassy::blocking_mutex::raw::RawMutex; 21use embassy::blocking_mutex::raw::RawMutex;
@@ -82,3 +99,45 @@ where
82 todo!() 99 todo!()
83 } 100 }
84} 101}
102
103impl<'a, M, BUS, E> embedded_hal_02::blocking::i2c::Write for I2cBusDevice<'_, M, BUS>
104where
105 M: RawMutex,
106 BUS: embedded_hal_02::blocking::i2c::Write<Error = E>,
107{
108 type Error = I2cBusDeviceError<E>;
109
110 fn write<'w>(&mut self, addr: u8, bytes: &'w [u8]) -> Result<(), Self::Error> {
111 self.bus
112 .lock(|bus| bus.borrow_mut().write(addr, bytes).map_err(I2cBusDeviceError::I2c))
113 }
114}
115
116impl<'a, M, BUS, E> embedded_hal_02::blocking::i2c::Read for I2cBusDevice<'_, M, BUS>
117where
118 M: RawMutex,
119 BUS: embedded_hal_02::blocking::i2c::Read<Error = E>,
120{
121 type Error = I2cBusDeviceError<E>;
122
123 fn read<'w>(&mut self, addr: u8, bytes: &'w mut [u8]) -> Result<(), Self::Error> {
124 self.bus
125 .lock(|bus| bus.borrow_mut().read(addr, bytes).map_err(I2cBusDeviceError::I2c))
126 }
127}
128
129impl<'a, M, BUS, E> embedded_hal_02::blocking::i2c::WriteRead for I2cBusDevice<'_, M, BUS>
130where
131 M: RawMutex,
132 BUS: embedded_hal_02::blocking::i2c::WriteRead<Error = E>,
133{
134 type Error = I2cBusDeviceError<E>;
135
136 fn write_read<'w>(&mut self, addr: u8, bytes: &'w [u8], buffer: &'w mut [u8]) -> Result<(), Self::Error> {
137 self.bus.lock(|bus| {
138 bus.borrow_mut()
139 .write_read(addr, bytes, buffer)
140 .map_err(I2cBusDeviceError::I2c)
141 })
142 }
143}