aboutsummaryrefslogtreecommitdiff
path: root/examples/nrf
diff options
context:
space:
mode:
authorChristian Perez Llamas <[email protected]>2022-11-19 00:29:05 +0100
committerChristian Perez Llamas <[email protected]>2022-11-19 00:29:05 +0100
commit6b88057aef79e32a66c9c99cf048f905d10c2d3a (patch)
tree6c7889cc365efa5aa7d15b21ef6e797ae9e0841c /examples/nrf
parent1ed260b1055fad6ddd89053ae3e1997ec34c6332 (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
5use core::f32::consts::PI; 5use core::f32::consts::PI;
6 6
7use defmt::{error, info, trace}; 7use defmt::{error, info};
8use embassy_executor::Spawner; 8use embassy_executor::Spawner;
9use embassy_nrf::gpio::{Input, Pin, Pull}; 9use embassy_nrf::i2s::{self, Sample as _};
10use embassy_nrf::i2s::{Channels, MckFreq, Mode, Ratio, SampleWidth, MODE_MASTER_32000}; 10use embassy_nrf::interrupt;
11use embassy_nrf::pac::ficr::info;
12use embassy_nrf::{i2s, interrupt};
13use {defmt_rtt as _, panic_probe as _}; 11use {defmt_rtt as _, panic_probe as _};
14 12
15#[repr(align(4))]
16pub struct AlignedBuffer<T: ?Sized>(T);
17
18impl<T> AsRef<T> for AlignedBuffer<T> {
19 fn as_ref(&self) -> &T {
20 &self.0
21 }
22}
23
24impl<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]
31async fn main(_spawner: Spawner) { 14async 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