Skip to content

Commit e1a1fd1

Browse files
committed
loop
1 parent 478d2ef commit e1a1fd1

File tree

2 files changed

+51
-21
lines changed

2 files changed

+51
-21
lines changed

src/spi.rs

+50-20
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,19 @@ impl<SPI: Instance, PINS, const BIDI: bool, W, OPERATION> Spi<SPI, PINS, BIDI, W
605605
pub fn is_overrun(&self) -> bool {
606606
self.spi.sr.read().ovr().bit_is_set()
607607
}
608+
609+
fn check_errors(&self) -> Result<(), Error> {
610+
let sr = self.spi.sr.read();
611+
if sr.ovr().bit_is_set() {
612+
Err(Error::Overrun)
613+
} else if sr.modf().bit_is_set() {
614+
Err(Error::ModeFault)
615+
} else if sr.crcerr().bit_is_set() {
616+
Err(Error::Crc)
617+
} else {
618+
Ok(())
619+
}
620+
}
608621
}
609622

610623
trait ReadWriteReg<W> {
@@ -685,30 +698,47 @@ impl<SPI: Instance, PINS, const BIDI: bool, W: FrameSize, OPERATION>
685698
where
686699
WI: IntoIterator<Item = W>,
687700
{
688-
if BIDI {
689-
self.spi.cr1.modify(|_, w| w.bidioe().set_bit());
690-
}
691-
// Write each word when the tx buffer is empty
692-
for word in words {
693-
loop {
694-
let sr = self.spi.sr.read();
695-
if sr.txe().bit_is_set() {
696-
self.write_data_reg(word);
697-
if sr.modf().bit_is_set() {
698-
return Err(Error::ModeFault);
701+
let mut words = words.into_iter();
702+
if let Some(first) = words.next() {
703+
if BIDI {
704+
self.spi.cr1.modify(|_, w| w.bidioe().set_bit());
705+
}
706+
// p.2
707+
self.write_data_reg(first);
708+
// Write each word when the tx buffer is empty
709+
// p.3,4
710+
'main: loop {
711+
let word = words.next();
712+
let mut sr;
713+
loop {
714+
sr = self.spi.sr.read();
715+
if sr.txe().bit_is_set() {
716+
if let Some(word) = word {
717+
self.write_data_reg(word);
718+
break;
719+
} else {
720+
break 'main;
721+
}
699722
}
700-
break;
723+
}
724+
if sr.modf().bit_is_set() {
725+
self.enable(false);
726+
return Err(Error::ModeFault);
701727
}
702728
}
729+
// p.4
730+
// Wait for final !BSY
731+
while self.is_busy() {}
732+
733+
if !BIDI {
734+
// Clear OVR set due to dropped received values
735+
let _ = self.read_data_reg();
736+
}
737+
let _ = self.spi.sr.read();
738+
self.check_errors()
739+
} else {
740+
Ok(())
703741
}
704-
// Wait for final TXE
705-
while !self.is_tx_empty() {}
706-
// Wait for final !BSY
707-
while self.is_busy() {}
708-
// Clear OVR set due to dropped received values
709-
let _ = self.read_data_reg();
710-
let _ = self.spi.sr.read();
711-
Ok(())
712742
}
713743
}
714744

src/spi/hal_02.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ mod blocking {
122122
type Error = Error;
123123

124124
fn write(&mut self, words: &[u16]) -> Result<(), Self::Error> {
125-
self.write_iter(words.iter().copied())
125+
self.spi_write(words.iter().copied())
126126
}
127127
}
128128

0 commit comments

Comments
 (0)