aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-10-20 01:47:27 +0000
committerGitHub <[email protected]>2023-10-20 01:47:27 +0000
commit88ada521461031b7241b09e40aa56f4e64827967 (patch)
treecea89ca593449099175c8299d8923b164bc603ff
parentd622181205aa9ade8eff1f0c596f1f41c5335219 (diff)
parent0c97ce2fcc715ffe954d34bfa5b927038e913560 (diff)
Merge pull request #2017 from ilya-epifanov/rp-adc-div
added sampling frequency setting to adc capture methods on rp2040
-rw-r--r--embassy-rp/src/adc.rs8
-rw-r--r--tests/rp/src/bin/adc.rs12
2 files changed, 16 insertions, 4 deletions
diff --git a/embassy-rp/src/adc.rs b/embassy-rp/src/adc.rs
index bac455743..5b913f156 100644
--- a/embassy-rp/src/adc.rs
+++ b/embassy-rp/src/adc.rs
@@ -213,6 +213,7 @@ impl<'d> Adc<'d, Async> {
213 ch: &mut Channel<'_>, 213 ch: &mut Channel<'_>,
214 buf: &mut [W], 214 buf: &mut [W],
215 fcs_err: bool, 215 fcs_err: bool,
216 div: u16,
216 dma: impl Peripheral<P = impl dma::Channel>, 217 dma: impl Peripheral<P = impl dma::Channel>,
217 ) -> Result<(), Error> { 218 ) -> Result<(), Error> {
218 let r = Self::regs(); 219 let r = Self::regs();
@@ -258,6 +259,7 @@ impl<'d> Adc<'d, Async> {
258 // start conversions and wait for dma to finish. we can't report errors early 259 // start conversions and wait for dma to finish. we can't report errors early
259 // because there's no interrupt to signal them, and inspecting every element 260 // because there's no interrupt to signal them, and inspecting every element
260 // of the fifo is too costly to do here. 261 // of the fifo is too costly to do here.
262 r.div().write_set(|w| w.set_int(div));
261 r.cs().write_set(|w| w.set_start_many(true)); 263 r.cs().write_set(|w| w.set_start_many(true));
262 dma.await; 264 dma.await;
263 mem::drop(auto_reset); 265 mem::drop(auto_reset);
@@ -275,9 +277,10 @@ impl<'d> Adc<'d, Async> {
275 &mut self, 277 &mut self,
276 ch: &mut Channel<'_>, 278 ch: &mut Channel<'_>,
277 buf: &mut [S], 279 buf: &mut [S],
280 div: u16,
278 dma: impl Peripheral<P = impl dma::Channel>, 281 dma: impl Peripheral<P = impl dma::Channel>,
279 ) -> Result<(), Error> { 282 ) -> Result<(), Error> {
280 self.read_many_inner(ch, buf, false, dma).await 283 self.read_many_inner(ch, buf, false, div, dma).await
281 } 284 }
282 285
283 #[inline] 286 #[inline]
@@ -285,11 +288,12 @@ impl<'d> Adc<'d, Async> {
285 &mut self, 288 &mut self,
286 ch: &mut Channel<'_>, 289 ch: &mut Channel<'_>,
287 buf: &mut [Sample], 290 buf: &mut [Sample],
291 div: u16,
288 dma: impl Peripheral<P = impl dma::Channel>, 292 dma: impl Peripheral<P = impl dma::Channel>,
289 ) { 293 ) {
290 // errors are reported in individual samples 294 // errors are reported in individual samples
291 let _ = self 295 let _ = self
292 .read_many_inner(ch, unsafe { mem::transmute::<_, &mut [u16]>(buf) }, true, dma) 296 .read_many_inner(ch, unsafe { mem::transmute::<_, &mut [u16]>(buf) }, true, div, dma)
293 .await; 297 .await;
294 } 298 }
295} 299}
diff --git a/tests/rp/src/bin/adc.rs b/tests/rp/src/bin/adc.rs
index 0250fd5f4..0c04a55f9 100644
--- a/tests/rp/src/bin/adc.rs
+++ b/tests/rp/src/bin/adc.rs
@@ -93,6 +93,7 @@ async fn main(_spawner: Spawner) {
93 adc.read_many( 93 adc.read_many(
94 &mut Channel::new_pin(&mut p.PIN_29, Pull::Down), 94 &mut Channel::new_pin(&mut p.PIN_29, Pull::Down),
95 &mut low, 95 &mut low,
96 1,
96 &mut p.DMA_CH0, 97 &mut p.DMA_CH0,
97 ) 98 )
98 .await 99 .await
@@ -100,12 +101,18 @@ async fn main(_spawner: Spawner) {
100 adc.read_many( 101 adc.read_many(
101 &mut Channel::new_pin(&mut p.PIN_29, Pull::None), 102 &mut Channel::new_pin(&mut p.PIN_29, Pull::None),
102 &mut none, 103 &mut none,
104 1,
103 &mut p.DMA_CH0, 105 &mut p.DMA_CH0,
104 ) 106 )
105 .await 107 .await
106 .unwrap(); 108 .unwrap();
107 adc.read_many_raw(&mut Channel::new_pin(&mut p.PIN_29, Pull::Up), &mut up, &mut p.DMA_CH0) 109 adc.read_many_raw(
108 .await; 110 &mut Channel::new_pin(&mut p.PIN_29, Pull::Up),
111 &mut up,
112 1,
113 &mut p.DMA_CH0,
114 )
115 .await;
109 defmt::assert!(low.iter().zip(none.iter()).all(|(l, n)| *l >> 4 < *n as u16)); 116 defmt::assert!(low.iter().zip(none.iter()).all(|(l, n)| *l >> 4 < *n as u16));
110 defmt::assert!(up.iter().all(|s| s.good())); 117 defmt::assert!(up.iter().all(|s| s.good()));
111 defmt::assert!(none.iter().zip(up.iter()).all(|(n, u)| (*n as u16) < u.value())); 118 defmt::assert!(none.iter().zip(up.iter()).all(|(n, u)| (*n as u16) < u.value()));
@@ -115,6 +122,7 @@ async fn main(_spawner: Spawner) {
115 adc.read_many( 122 adc.read_many(
116 &mut Channel::new_temp_sensor(&mut p.ADC_TEMP_SENSOR), 123 &mut Channel::new_temp_sensor(&mut p.ADC_TEMP_SENSOR),
117 &mut temp, 124 &mut temp,
125 1,
118 &mut p.DMA_CH0, 126 &mut p.DMA_CH0,
119 ) 127 )
120 .await 128 .await