aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2021-06-30 23:43:22 +0200
committerDario Nieuwenhuis <[email protected]>2021-06-30 23:46:00 +0200
commitf073bdfe43a243a2f5846c27c6a9af09a9bbe702 (patch)
treed49eb0928589377c9c53788407a1e41f8482e963
parent3059923b4f4de31df8695ede0c948069bdc61113 (diff)
rp/spi: add Transfer
-rw-r--r--embassy-rp/src/spi.rs21
1 files changed, 21 insertions, 0 deletions
diff --git a/embassy-rp/src/spi.rs b/embassy-rp/src/spi.rs
index 766f08616..c919672a7 100644
--- a/embassy-rp/src/spi.rs
+++ b/embassy-rp/src/spi.rs
@@ -105,6 +105,19 @@ impl<'d, T: Instance> Spi<'d, T> {
105 } 105 }
106 } 106 }
107 107
108 pub fn transfer(&mut self, data: &mut [u8]) {
109 unsafe {
110 let p = self.inner.regs();
111 for b in data {
112 while !p.sr().read().tnf() {}
113 p.dr().write(|w| w.set_data(*b as _));
114 while !p.sr().read().rne() {}
115 *b = p.dr().read().data() as u8;
116 }
117 self.flush();
118 }
119 }
120
108 pub fn flush(&mut self) { 121 pub fn flush(&mut self) {
109 unsafe { 122 unsafe {
110 let p = self.inner.regs(); 123 let p = self.inner.regs();
@@ -122,6 +135,14 @@ impl<'d, T: Instance> eh::Write<u8> for Spi<'d, T> {
122 } 135 }
123} 136}
124 137
138impl<'d, T: Instance> eh::Transfer<u8> for Spi<'d, T> {
139 type Error = core::convert::Infallible;
140 fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], Self::Error> {
141 self.transfer(words);
142 Ok(words)
143 }
144}
145
125mod sealed { 146mod sealed {
126 use super::*; 147 use super::*;
127 148