Skip to content

Commit 5c38934

Browse files
committed
fix SPI transfer
1 parent 6d4488f commit 5c38934

File tree

1 file changed

+7
-10
lines changed

1 file changed

+7
-10
lines changed

src/spi.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -235,19 +235,14 @@ macro_rules! spi {
235235
impl<PINS> Spi<$SPIX, PINS> {
236236
pub fn read(&mut self) -> nb::Result<u8, Error> {
237237
let sr = self.spi.sr().read();
238-
239238
Err(if sr.ovr().bit_is_set() {
240239
nb::Error::Other(Error::Overrun)
241240
} else if sr.modf().bit_is_set() {
242241
nb::Error::Other(Error::ModeFault)
243242
} else if sr.crcerr().bit_is_set() {
244243
nb::Error::Other(Error::Crc)
245244
} else if sr.rxne().bit_is_set() {
246-
// NOTE(read_volatile) read only 1 byte (the svd2rust API only allows
247-
// reading a half-word)
248-
return Ok(unsafe {
249-
ptr::read_volatile(&self.spi.dr() as *const _ as *const u8)
250-
});
245+
return Ok(self.spi.dr().read().bits() as u8);
251246
} else {
252247
nb::Error::WouldBlock
253248
})
@@ -262,7 +257,9 @@ macro_rules! spi {
262257
} else if sr.crcerr().bit_is_set() {
263258
nb::Error::Other(Error::Crc)
264259
} else if sr.txe().bit_is_set() {
265-
self.spi.dr().write(|w| w.dr().set(byte.into()));
260+
unsafe {
261+
ptr::write_volatile(core::cell::UnsafeCell::raw_get(self.spi.dr() as *const _ as _), byte)
262+
}
266263
return Ok(());
267264
} else {
268265
nb::Error::WouldBlock
@@ -284,23 +281,23 @@ macro_rules! spi {
284281

285282
fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
286283
for word in words.iter() {
287-
block!(self.send(word.clone()))?;
284+
block!(self.send(*word))?;
288285
block!(self.read())?;
289286
}
290287
Ok(())
291288
}
292289

293290
fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
294291
for (r, w) in read.iter_mut().zip(write.iter()) {
295-
block!(self.send(w.clone()))?;
292+
block!(self.send(*w))?;
296293
*r = block!(self.read())?;
297294
}
298295
Ok(())
299296
}
300297

301298
fn transfer_in_place(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
302299
for word in words.iter_mut() {
303-
block!(self.send(word.clone()))?;
300+
block!(self.send(*word))?;
304301
*word = block!(self.read())?;
305302
}
306303
Ok(())

0 commit comments

Comments
 (0)