diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-08-03 11:25:51 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-08-03 11:25:51 +0000 |
| commit | 2c96fe917de6e0120053e80d8da5a98d0d0f35d0 (patch) | |
| tree | 0ced425ec4261c9d0e43c0c87f9edb11562515b1 /tests | |
| parent | b42a7ebd8c6f7b54aa4715cdb0721785892d5ae6 (diff) | |
| parent | a6b8f3d99478266b4f110e9c150ce3add5c3ffc6 (diff) | |
Merge pull request #1675 from pennae/rp-adc
rp: add dma-from-adc
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/rp/src/bin/adc.rs | 73 |
1 files changed, 60 insertions, 13 deletions
diff --git a/tests/rp/src/bin/adc.rs b/tests/rp/src/bin/adc.rs index e659844ae..d6d58f0c0 100644 --- a/tests/rp/src/bin/adc.rs +++ b/tests/rp/src/bin/adc.rs | |||
| @@ -6,7 +6,7 @@ mod common; | |||
| 6 | 6 | ||
| 7 | use defmt::*; | 7 | use defmt::*; |
| 8 | use embassy_executor::Spawner; | 8 | use embassy_executor::Spawner; |
| 9 | use embassy_rp::adc::{Adc, Config, InterruptHandler, Pin}; | 9 | use embassy_rp::adc::{Adc, Channel, Config, InterruptHandler, Sample}; |
| 10 | use embassy_rp::bind_interrupts; | 10 | use embassy_rp::bind_interrupts; |
| 11 | use embassy_rp::gpio::Pull; | 11 | use embassy_rp::gpio::Pull; |
| 12 | use {defmt_rtt as _, panic_probe as _}; | 12 | use {defmt_rtt as _, panic_probe as _}; |
| @@ -22,12 +22,12 @@ async fn main(_spawner: Spawner) { | |||
| 22 | 22 | ||
| 23 | { | 23 | { |
| 24 | { | 24 | { |
| 25 | let mut p = Pin::new(&mut p.PIN_26, Pull::Down); | 25 | let mut p = Channel::new_pin(&mut p.PIN_26, Pull::Down); |
| 26 | defmt::assert!(adc.blocking_read(&mut p).unwrap() < 0b01_0000_0000); | 26 | defmt::assert!(adc.blocking_read(&mut p).unwrap() < 0b01_0000_0000); |
| 27 | defmt::assert!(adc.read(&mut p).await.unwrap() < 0b01_0000_0000); | 27 | defmt::assert!(adc.read(&mut p).await.unwrap() < 0b01_0000_0000); |
| 28 | } | 28 | } |
| 29 | { | 29 | { |
| 30 | let mut p = Pin::new(&mut p.PIN_26, Pull::Up); | 30 | let mut p = Channel::new_pin(&mut p.PIN_26, Pull::Up); |
| 31 | defmt::assert!(adc.blocking_read(&mut p).unwrap() > 0b11_0000_0000); | 31 | defmt::assert!(adc.blocking_read(&mut p).unwrap() > 0b11_0000_0000); |
| 32 | defmt::assert!(adc.read(&mut p).await.unwrap() > 0b11_0000_0000); | 32 | defmt::assert!(adc.read(&mut p).await.unwrap() > 0b11_0000_0000); |
| 33 | } | 33 | } |
| @@ -35,21 +35,21 @@ async fn main(_spawner: Spawner) { | |||
| 35 | // not bothering with async reads from now on | 35 | // not bothering with async reads from now on |
| 36 | { | 36 | { |
| 37 | { | 37 | { |
| 38 | let mut p = Pin::new(&mut p.PIN_27, Pull::Down); | 38 | let mut p = Channel::new_pin(&mut p.PIN_27, Pull::Down); |
| 39 | defmt::assert!(adc.blocking_read(&mut p).unwrap() < 0b01_0000_0000); | 39 | defmt::assert!(adc.blocking_read(&mut p).unwrap() < 0b01_0000_0000); |
| 40 | } | 40 | } |
| 41 | { | 41 | { |
| 42 | let mut p = Pin::new(&mut p.PIN_27, Pull::Up); | 42 | let mut p = Channel::new_pin(&mut p.PIN_27, Pull::Up); |
| 43 | defmt::assert!(adc.blocking_read(&mut p).unwrap() > 0b11_0000_0000); | 43 | defmt::assert!(adc.blocking_read(&mut p).unwrap() > 0b11_0000_0000); |
| 44 | } | 44 | } |
| 45 | } | 45 | } |
| 46 | { | 46 | { |
| 47 | { | 47 | { |
| 48 | let mut p = Pin::new(&mut p.PIN_28, Pull::Down); | 48 | let mut p = Channel::new_pin(&mut p.PIN_28, Pull::Down); |
| 49 | defmt::assert!(adc.blocking_read(&mut p).unwrap() < 0b01_0000_0000); | 49 | defmt::assert!(adc.blocking_read(&mut p).unwrap() < 0b01_0000_0000); |
| 50 | } | 50 | } |
| 51 | { | 51 | { |
| 52 | let mut p = Pin::new(&mut p.PIN_28, Pull::Up); | 52 | let mut p = Channel::new_pin(&mut p.PIN_28, Pull::Up); |
| 53 | defmt::assert!(adc.blocking_read(&mut p).unwrap() > 0b11_0000_0000); | 53 | defmt::assert!(adc.blocking_read(&mut p).unwrap() > 0b11_0000_0000); |
| 54 | } | 54 | } |
| 55 | } | 55 | } |
| @@ -57,24 +57,71 @@ async fn main(_spawner: Spawner) { | |||
| 57 | // gp29 is connected to vsys through a 200k/100k divider, | 57 | // gp29 is connected to vsys through a 200k/100k divider, |
| 58 | // adding pulls should change the value | 58 | // adding pulls should change the value |
| 59 | let low = { | 59 | let low = { |
| 60 | let mut p = Pin::new(&mut p.PIN_29, Pull::Down); | 60 | let mut p = Channel::new_pin(&mut p.PIN_29, Pull::Down); |
| 61 | adc.blocking_read(&mut p).unwrap() | 61 | adc.blocking_read(&mut p).unwrap() |
| 62 | }; | 62 | }; |
| 63 | let none = { | 63 | let none = { |
| 64 | let mut p = Pin::new(&mut p.PIN_29, Pull::None); | 64 | let mut p = Channel::new_pin(&mut p.PIN_29, Pull::None); |
| 65 | adc.blocking_read(&mut p).unwrap() | 65 | adc.blocking_read(&mut p).unwrap() |
| 66 | }; | 66 | }; |
| 67 | let up = { | 67 | let up = { |
| 68 | let mut p = Pin::new(&mut p.PIN_29, Pull::Up); | 68 | let mut p = Channel::new_pin(&mut p.PIN_29, Pull::Up); |
| 69 | adc.blocking_read(&mut p).unwrap() | 69 | adc.blocking_read(&mut p).unwrap() |
| 70 | }; | 70 | }; |
| 71 | defmt::assert!(low < none); | 71 | defmt::assert!(low < none); |
| 72 | defmt::assert!(none < up); | 72 | defmt::assert!(none < up); |
| 73 | } | 73 | } |
| 74 | { | ||
| 75 | let temp = convert_to_celsius( | ||
| 76 | adc.read(&mut Channel::new_temp_sensor(&mut p.ADC_TEMP_SENSOR)) | ||
| 77 | .await | ||
| 78 | .unwrap(), | ||
| 79 | ); | ||
| 80 | defmt::assert!(temp > 0.0); | ||
| 81 | defmt::assert!(temp < 60.0); | ||
| 82 | } | ||
| 74 | 83 | ||
| 75 | let temp = convert_to_celsius(adc.read_temperature().await.unwrap()); | 84 | // run a bunch of conversions. we'll only check gp29 and the temp |
| 76 | defmt::assert!(temp > 0.0); | 85 | // sensor here for brevity, if those two work the rest will too. |
| 77 | defmt::assert!(temp < 60.0); | 86 | { |
| 87 | // gp29 is connected to vsys through a 200k/100k divider, | ||
| 88 | // adding pulls should change the value | ||
| 89 | let mut low = [0u16; 16]; | ||
| 90 | let mut none = [0u8; 16]; | ||
| 91 | let mut up = [Sample::default(); 16]; | ||
| 92 | adc.read_many( | ||
| 93 | &mut Channel::new_pin(&mut p.PIN_29, Pull::Down), | ||
| 94 | &mut low, | ||
| 95 | &mut p.DMA_CH0, | ||
| 96 | ) | ||
| 97 | .await | ||
| 98 | .unwrap(); | ||
| 99 | adc.read_many( | ||
| 100 | &mut Channel::new_pin(&mut p.PIN_29, Pull::None), | ||
| 101 | &mut none, | ||
| 102 | &mut p.DMA_CH0, | ||
| 103 | ) | ||
| 104 | .await | ||
| 105 | .unwrap(); | ||
| 106 | adc.read_many_raw(&mut Channel::new_pin(&mut p.PIN_29, Pull::Up), &mut up, &mut p.DMA_CH0) | ||
| 107 | .await; | ||
| 108 | defmt::assert!(low.iter().zip(none.iter()).all(|(l, n)| *l >> 4 < *n as u16)); | ||
| 109 | defmt::assert!(up.iter().all(|s| s.good())); | ||
| 110 | defmt::assert!(none.iter().zip(up.iter()).all(|(n, u)| (*n as u16) < u.value())); | ||
| 111 | } | ||
| 112 | { | ||
| 113 | let mut temp = [0u16; 16]; | ||
| 114 | adc.read_many( | ||
| 115 | &mut Channel::new_temp_sensor(&mut p.ADC_TEMP_SENSOR), | ||
| 116 | &mut temp, | ||
| 117 | &mut p.DMA_CH0, | ||
| 118 | ) | ||
| 119 | .await | ||
| 120 | .unwrap(); | ||
| 121 | let temp = temp.map(convert_to_celsius); | ||
| 122 | defmt::assert!(temp.iter().all(|t| *t > 0.0)); | ||
| 123 | defmt::assert!(temp.iter().all(|t| *t < 60.0)); | ||
| 124 | } | ||
| 78 | 125 | ||
| 79 | info!("Test OK"); | 126 | info!("Test OK"); |
| 80 | cortex_m::asm::bkpt(); | 127 | cortex_m::asm::bkpt(); |
