Skip to content

Commit 8420580

Browse files
authored
Merge pull request #762 from stm32-rs/spi-transfer
Allow different lengths of buffers in SpiBus::transfer
2 parents d6f231b + dc1b1f1 commit 8420580

File tree

2 files changed

+52
-11
lines changed

2 files changed

+52
-11
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1616
### Changed
1717

1818
- Use `stm32f4-staging` until `stm32f4` is released [#706]
19+
- Allow different lengths of buffers in hal_1 SpiBus impl [#566]
1920

21+
[#566]: https://github.com/stm32-rs/stm32f4xx-hal/pull/566
2022
[#706]: https://github.com/stm32-rs/stm32f4xx-hal/pull/706
2123
[#731]: https://github.com/stm32-rs/stm32f4xx-hal/pull/731
2224
[#758]: https://github.com/stm32-rs/stm32f4xx-hal/pull/758
@@ -290,7 +292,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
290292
[#603]: https://github.com/stm32-rs/stm32f4xx-hal/pull/603
291293
[#600]: https://github.com/stm32-rs/stm32f4xx-hal/pull/600
292294

293-
294295
## [v0.14.0] - 2022-12-12
295296

296297
### Changed

src/spi.rs

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -950,11 +950,31 @@ impl<SPI: Instance, const BIDI: bool, W: FrameSize> Spi<SPI, BIDI, W> {
950950
}
951951

952952
pub fn transfer(&mut self, buff: &mut [W], data: &[W]) -> Result<(), Error> {
953-
assert_eq!(data.len(), buff.len());
954-
955-
for (d, b) in data.iter().cloned().zip(buff.iter_mut()) {
956-
nb::block!(self.write_nonblocking(d))?;
957-
*b = nb::block!(self.read_nonblocking())?;
953+
if data.len() == buff.len() {
954+
for (d, b) in data.iter().cloned().zip(buff.iter_mut()) {
955+
nb::block!(self.write_nonblocking(d))?;
956+
*b = nb::block!(self.read_nonblocking())?;
957+
}
958+
} else {
959+
let mut iter_r = buff.iter_mut();
960+
let mut iter_w = data.iter().cloned();
961+
loop {
962+
match (iter_r.next(), iter_w.next()) {
963+
(Some(r), Some(w)) => {
964+
nb::block!(self.write_nonblocking(w))?;
965+
*r = nb::block!(self.read_nonblocking())?;
966+
}
967+
(Some(r), None) => {
968+
nb::block!(self.write_nonblocking(W::default()))?;
969+
*r = nb::block!(self.read_nonblocking())?;
970+
}
971+
(None, Some(w)) => {
972+
nb::block!(self.write_nonblocking(w))?;
973+
let _ = nb::block!(self.read_nonblocking())?;
974+
}
975+
(None, None) => break,
976+
}
977+
}
958978
}
959979

960980
Ok(())
@@ -1038,11 +1058,31 @@ impl<SPI: Instance, const BIDI: bool, W: FrameSize> SpiSlave<SPI, BIDI, W> {
10381058
}
10391059

10401060
pub fn transfer(&mut self, buff: &mut [W], data: &[W]) -> Result<(), Error> {
1041-
assert_eq!(data.len(), buff.len());
1042-
1043-
for (d, b) in data.iter().cloned().zip(buff.iter_mut()) {
1044-
nb::block!(self.write_nonblocking(d))?;
1045-
*b = nb::block!(self.read_nonblocking())?;
1061+
if data.len() == buff.len() {
1062+
for (d, b) in data.iter().cloned().zip(buff.iter_mut()) {
1063+
nb::block!(self.write_nonblocking(d))?;
1064+
*b = nb::block!(self.read_nonblocking())?;
1065+
}
1066+
} else {
1067+
let mut iter_r = buff.iter_mut();
1068+
let mut iter_w = data.iter().cloned();
1069+
loop {
1070+
match (iter_r.next(), iter_w.next()) {
1071+
(Some(r), Some(w)) => {
1072+
nb::block!(self.write_nonblocking(w))?;
1073+
*r = nb::block!(self.read_nonblocking())?;
1074+
}
1075+
(Some(r), None) => {
1076+
nb::block!(self.write_nonblocking(W::default()))?;
1077+
*r = nb::block!(self.read_nonblocking())?;
1078+
}
1079+
(None, Some(w)) => {
1080+
nb::block!(self.write_nonblocking(w))?;
1081+
let _ = nb::block!(self.read_nonblocking())?;
1082+
}
1083+
(None, None) => break,
1084+
}
1085+
}
10461086
}
10471087

10481088
Ok(())

0 commit comments

Comments
 (0)