diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-10-20 01:47:27 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-10-20 01:47:27 +0000 |
| commit | 88ada521461031b7241b09e40aa56f4e64827967 (patch) | |
| tree | cea89ca593449099175c8299d8923b164bc603ff | |
| parent | d622181205aa9ade8eff1f0c596f1f41c5335219 (diff) | |
| parent | 0c97ce2fcc715ffe954d34bfa5b927038e913560 (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.rs | 8 | ||||
| -rw-r--r-- | tests/rp/src/bin/adc.rs | 12 |
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 |
