diff options
| author | Christian Perez Llamas <[email protected]> | 2022-11-19 00:29:05 +0100 |
|---|---|---|
| committer | Christian Perez Llamas <[email protected]> | 2022-11-19 00:29:05 +0100 |
| commit | 6b88057aef79e32a66c9c99cf048f905d10c2d3a (patch) | |
| tree | 6c7889cc365efa5aa7d15b21ef6e797ae9e0841c /examples/nrf | |
| parent | 1ed260b1055fad6ddd89053ae3e1997ec34c6332 (diff) | |
Add missing parts and Cleanup
Diffstat (limited to 'examples/nrf')
| -rw-r--r-- | examples/nrf/src/bin/i2s-generate.rs (renamed from examples/nrf/src/bin/i2s.rs) | 73 |
1 files changed, 26 insertions, 47 deletions
diff --git a/examples/nrf/src/bin/i2s.rs b/examples/nrf/src/bin/i2s-generate.rs index 9b3144f24..f59b63ce6 100644 --- a/examples/nrf/src/bin/i2s.rs +++ b/examples/nrf/src/bin/i2s-generate.rs | |||
| @@ -4,59 +4,41 @@ | |||
| 4 | 4 | ||
| 5 | use core::f32::consts::PI; | 5 | use core::f32::consts::PI; |
| 6 | 6 | ||
| 7 | use defmt::{error, info, trace}; | 7 | use defmt::{error, info}; |
| 8 | use embassy_executor::Spawner; | 8 | use embassy_executor::Spawner; |
| 9 | use embassy_nrf::gpio::{Input, Pin, Pull}; | 9 | use embassy_nrf::i2s::{self, Sample as _}; |
| 10 | use embassy_nrf::i2s::{Channels, MckFreq, Mode, Ratio, SampleWidth, MODE_MASTER_32000}; | 10 | use embassy_nrf::interrupt; |
| 11 | use embassy_nrf::pac::ficr::info; | ||
| 12 | use embassy_nrf::{i2s, interrupt}; | ||
| 13 | use {defmt_rtt as _, panic_probe as _}; | 11 | use {defmt_rtt as _, panic_probe as _}; |
| 14 | 12 | ||
| 15 | #[repr(align(4))] | ||
| 16 | pub struct AlignedBuffer<T: ?Sized>(T); | ||
| 17 | |||
| 18 | impl<T> AsRef<T> for AlignedBuffer<T> { | ||
| 19 | fn as_ref(&self) -> &T { | ||
| 20 | &self.0 | ||
| 21 | } | ||
| 22 | } | ||
| 23 | |||
| 24 | impl<T> AsMut<T> for AlignedBuffer<T> { | ||
| 25 | fn as_mut(&mut self) -> &mut T { | ||
| 26 | &mut self.0 | ||
| 27 | } | ||
| 28 | } | ||
| 29 | |||
| 30 | #[embassy_executor::main] | 13 | #[embassy_executor::main] |
| 31 | async fn main(_spawner: Spawner) { | 14 | async fn main(_spawner: Spawner) { |
| 32 | let p = embassy_nrf::init(Default::default()); | 15 | let p = embassy_nrf::init(Default::default()); |
| 16 | |||
| 33 | let mut config = i2s::Config::default(); | 17 | let mut config = i2s::Config::default(); |
| 34 | config.mode = MODE_MASTER_32000; | 18 | config.mode = i2s::ExactSampleRate::_50000.into(); |
| 35 | // config.mode = Mode::Master { | 19 | config.channels = i2s::Channels::Left; |
| 36 | // freq: MckFreq::_32MDiv10, | 20 | config.swidth = i2s::SampleWidth::_16bit; |
| 37 | // ratio: Ratio::_256x, | ||
| 38 | // }; // 12500 Hz | ||
| 39 | config.channels = Channels::Left; | ||
| 40 | config.swidth = SampleWidth::_16bit; | ||
| 41 | let sample_rate = config.mode.sample_rate().expect("I2S Master"); | 21 | let sample_rate = config.mode.sample_rate().expect("I2S Master"); |
| 42 | let inv_sample_rate = 1.0 / sample_rate as f32; | 22 | let inv_sample_rate = 1.0 / sample_rate as f32; |
| 43 | 23 | ||
| 44 | info!("Sample rate: {}", sample_rate); | 24 | info!("Sample rate: {}", sample_rate); |
| 45 | 25 | ||
| 46 | // Wait for a button press | 26 | // Wait for a button press |
| 27 | // use embassy_nrf::gpio::{Input, Pin, Pull}; | ||
| 47 | // let mut btn1 = Input::new(p.P1_00.degrade(), Pull::Up); | 28 | // let mut btn1 = Input::new(p.P1_00.degrade(), Pull::Up); |
| 48 | // btn1.wait_for_low().await; | 29 | // btn1.wait_for_low().await; |
| 49 | 30 | ||
| 50 | let irq = interrupt::take!(I2S); | 31 | let irq = interrupt::take!(I2S); |
| 51 | let mut i2s = i2s::I2S::new(p.I2S, irq, p.P0_28, p.P0_29, p.P0_31, p.P0_11, p.P0_30, config).output(); | 32 | let mut i2s = i2s::I2S::new(p.I2S, irq, p.P0_28, p.P0_29, p.P0_31, p.P0_27, p.P0_30, config) |
| 33 | .output(); | ||
| 52 | 34 | ||
| 53 | type Sample = i16; | 35 | type Sample = i16; |
| 54 | const MAX_UNIPOLAR_VALUE: Sample = (1 << 15) as Sample; | 36 | const NUM_SAMPLES: usize = 6000; |
| 55 | const NUM_SAMPLES: usize = 2000; | 37 | |
| 56 | let mut buffers: [AlignedBuffer<[Sample; NUM_SAMPLES]>; 3] = [ | 38 | let mut buffers: [i2s::AlignedBuffer<Sample, NUM_SAMPLES>; 3] = [ |
| 57 | AlignedBuffer([0; NUM_SAMPLES]), | 39 | i2s::AlignedBuffer::default(), |
| 58 | AlignedBuffer([0; NUM_SAMPLES]), | 40 | i2s::AlignedBuffer::default(), |
| 59 | AlignedBuffer([0; NUM_SAMPLES]), | 41 | i2s::AlignedBuffer::default(), |
| 60 | ]; | 42 | ]; |
| 61 | 43 | ||
| 62 | let mut carrier = SineOsc::new(); | 44 | let mut carrier = SineOsc::new(); |
| @@ -66,32 +48,29 @@ async fn main(_spawner: Spawner) { | |||
| 66 | freq_mod.set_amplitude(1.0); | 48 | freq_mod.set_amplitude(1.0); |
| 67 | 49 | ||
| 68 | let mut amp_mod = SineOsc::new(); | 50 | let mut amp_mod = SineOsc::new(); |
| 69 | amp_mod.set_frequency(4.0, inv_sample_rate); | 51 | amp_mod.set_frequency(16.0, inv_sample_rate); |
| 70 | amp_mod.set_amplitude(0.5); | 52 | amp_mod.set_amplitude(0.5); |
| 71 | 53 | ||
| 72 | let mut generate = |buf: &mut [Sample]| { | 54 | let mut generate = |buf: &mut [Sample]| { |
| 73 | let ptr = buf as *const [Sample] as *const Sample as u32; | 55 | for sample in &mut buf.chunks_mut(1) { |
| 74 | trace!("GEN: {}", ptr); | ||
| 75 | |||
| 76 | for sample in &mut buf.as_mut().chunks_mut(1) { | ||
| 77 | let signal = carrier.generate(); | ||
| 78 | let freq_modulation = bipolar_to_unipolar(freq_mod.generate()); | 56 | let freq_modulation = bipolar_to_unipolar(freq_mod.generate()); |
| 79 | carrier.set_frequency(220.0 + 220.0 * freq_modulation, inv_sample_rate); | 57 | carrier.set_frequency(220.0 + 440.0 * freq_modulation, inv_sample_rate); |
| 80 | let amp_modulation = bipolar_to_unipolar(amp_mod.generate()); | 58 | let amp_modulation = bipolar_to_unipolar(amp_mod.generate()); |
| 81 | carrier.set_amplitude(amp_modulation); | 59 | carrier.set_amplitude(amp_modulation); |
| 82 | let value = (MAX_UNIPOLAR_VALUE as f32 * signal) as Sample; | 60 | let signal = carrier.generate(); |
| 61 | let value = (Sample::SCALE as f32 * signal) as Sample; | ||
| 83 | sample[0] = value; | 62 | sample[0] = value; |
| 84 | } | 63 | } |
| 85 | }; | 64 | }; |
| 86 | 65 | ||
| 87 | generate(buffers[0].as_mut().as_mut_slice()); | 66 | generate(buffers[0].as_mut()); |
| 88 | generate(buffers[1].as_mut().as_mut_slice()); | 67 | generate(buffers[1].as_mut()); |
| 89 | 68 | ||
| 90 | i2s.start(buffers[0].as_ref().as_slice()).expect("I2S Start"); | 69 | i2s.start(buffers[0].as_ref()).await.expect("I2S Start"); |
| 91 | 70 | ||
| 92 | let mut index = 1; | 71 | let mut index = 1; |
| 93 | loop { | 72 | loop { |
| 94 | if let Err(err) = i2s.send(buffers[index].as_ref().as_slice()).await { | 73 | if let Err(err) = i2s.send(buffers[index].as_ref()).await { |
| 95 | error!("{}", err); | 74 | error!("{}", err); |
| 96 | } | 75 | } |
| 97 | 76 | ||
| @@ -99,7 +78,7 @@ async fn main(_spawner: Spawner) { | |||
| 99 | if index >= 3 { | 78 | if index >= 3 { |
| 100 | index = 0; | 79 | index = 0; |
| 101 | } | 80 | } |
| 102 | generate(buffers[index].as_mut().as_mut_slice()); | 81 | generate(buffers[index].as_mut()); |
| 103 | } | 82 | } |
| 104 | } | 83 | } |
| 105 | 84 | ||
