aboutsummaryrefslogtreecommitdiff
path: root/embassy-embedded-hal
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-embedded-hal')
-rw-r--r--embassy-embedded-hal/src/shared_bus/blocking/i2c.rs59
-rw-r--r--embassy-embedded-hal/src/shared_bus/blocking/spi.rs60
2 files changed, 119 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}
diff --git a/embassy-embedded-hal/src/shared_bus/blocking/spi.rs b/embassy-embedded-hal/src/shared_bus/blocking/spi.rs
index c08bcbf62..81cf97457 100644
--- a/embassy-embedded-hal/src/shared_bus/blocking/spi.rs
+++ b/embassy-embedded-hal/src/shared_bus/blocking/spi.rs
@@ -1,4 +1,23 @@
1//! Blocking shared SPI bus 1//! Blocking shared SPI bus
2//!
3//! # Example (nrf52)
4//!
5//! ```rust
6//! use embassy_embedded_hal::shared_bus::blocking::spi::SpiBusDevice;
7//! use embassy::blocking_mutex::{NoopMutex, raw::NoopRawMutex};
8//!
9//! static SPI_BUS: Forever<NoopMutex<RefCell<Spim<SPI3>>>> = Forever::new();
10//! let irq = interrupt::take!(SPIM3);
11//! let spi = Spim::new_txonly(p.SPI3, irq, p.P0_15, p.P0_18, Config::default());
12//! let spi_bus = NoopMutex::new(RefCell::new(spi));
13//! let spi_bus = SPI_BUS.put(spi_bus);
14//!
15//! // Device 1, using embedded-hal compatible driver for ST7735 LCD display
16//! let cs_pin1 = Output::new(p.P0_24, Level::Low, OutputDrive::Standard);
17//! let spi_dev1 = SpiBusDevice::new(spi_bus, cs_pin1);
18//! let display1 = ST7735::new(spi_dev1, dc1, rst1, Default::default(), false, 160, 128);
19//! ```
20
2use core::cell::RefCell; 21use core::cell::RefCell;
3 22
4use embassy::blocking_mutex::raw::RawMutex; 23use embassy::blocking_mutex::raw::RawMutex;
@@ -55,3 +74,44 @@ where
55 }) 74 })
56 } 75 }
57} 76}
77
78impl<'d, M, BUS, CS, BusErr, CsErr> embedded_hal_02::blocking::spi::Transfer<u8> for SpiBusDevice<'_, M, BUS, CS>
79where
80 M: RawMutex,
81 BUS: embedded_hal_02::blocking::spi::Transfer<u8, Error = BusErr>,
82 CS: OutputPin<Error = CsErr>,
83{
84 type Error = SpiBusDeviceError<BusErr, CsErr>;
85 fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], Self::Error> {
86 self.bus.lock(|bus| {
87 let mut bus = bus.borrow_mut();
88 self.cs.set_low().map_err(SpiBusDeviceError::Cs)?;
89 let f_res = bus.transfer(words);
90 let cs_res = self.cs.set_high();
91 let f_res = f_res.map_err(SpiBusDeviceError::Spi)?;
92 cs_res.map_err(SpiBusDeviceError::Cs)?;
93 Ok(f_res)
94 })
95 }
96}
97
98impl<'d, M, BUS, CS, BusErr, CsErr> embedded_hal_02::blocking::spi::Write<u8> for SpiBusDevice<'_, M, BUS, CS>
99where
100 M: RawMutex,
101 BUS: embedded_hal_02::blocking::spi::Write<u8, Error = BusErr>,
102 CS: OutputPin<Error = CsErr>,
103{
104 type Error = SpiBusDeviceError<BusErr, CsErr>;
105
106 fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
107 self.bus.lock(|bus| {
108 let mut bus = bus.borrow_mut();
109 self.cs.set_low().map_err(SpiBusDeviceError::Cs)?;
110 let f_res = bus.write(words);
111 let cs_res = self.cs.set_high();
112 let f_res = f_res.map_err(SpiBusDeviceError::Spi)?;
113 cs_res.map_err(SpiBusDeviceError::Cs)?;
114 Ok(f_res)
115 })
116 }
117}