aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-nrf/src/i2s.rs9
-rw-r--r--examples/nrf/src/bin/i2s.rs9
2 files changed, 10 insertions, 8 deletions
diff --git a/embassy-nrf/src/i2s.rs b/embassy-nrf/src/i2s.rs
index 9a8f29e78..eed9e1956 100644
--- a/embassy-nrf/src/i2s.rs
+++ b/embassy-nrf/src/i2s.rs
@@ -327,6 +327,7 @@ impl<'d, T: Instance> I2S<'d, T> {
327 pub fn start(&self) -> &Self { 327 pub fn start(&self) -> &Self {
328 let r = T::regs(); 328 let r = T::regs();
329 self.enable(); 329 self.enable();
330 trace!("START");
330 r.tasks_start.write(|w| unsafe { w.bits(1) }); 331 r.tasks_start.write(|w| unsafe { w.bits(1) });
331 self 332 self
332 } 333 }
@@ -487,8 +488,8 @@ impl<'d, T: Instance> I2sOutput<'d, T> {
487 let s = T::state(); 488 let s = T::state();
488 489
489 let seq = s.seq.fetch_add(1, Ordering::Relaxed); 490 let seq = s.seq.fetch_add(1, Ordering::Relaxed);
490 if r.events_txptrupd.read().bits() != 0 && seq > 0 { 491 if r.events_txptrupd.read().bits() != 0 && seq > 1 {
491 info!("XRUN!"); 492 warn!("XRUN!");
492 loop {} 493 loop {}
493 } 494 }
494 495
@@ -505,8 +506,8 @@ impl<'d, T: Instance> I2sOutput<'d, T> {
505 }); 506 });
506 507
507 trace!("[{}] PTR", s.seq.load(Ordering::Relaxed)); 508 trace!("[{}] PTR", s.seq.load(Ordering::Relaxed));
508 r.txd.ptr.write(|w| unsafe { w.ptr().bits(ptr as u32) });
509 r.rxtxd.maxcnt.write(|w| unsafe { w.bits(maxcnt) }); 509 r.rxtxd.maxcnt.write(|w| unsafe { w.bits(maxcnt) });
510 r.txd.ptr.write(|w| unsafe { w.ptr().bits(ptr as u32) });
510 511
511 compiler_fence(Ordering::SeqCst); 512 compiler_fence(Ordering::SeqCst);
512 513
@@ -517,7 +518,7 @@ impl<'d, T: Instance> I2sOutput<'d, T> {
517 r.events_txptrupd.reset(); 518 r.events_txptrupd.reset();
518 r.intenset.write(|w| w.txptrupd().set()); 519 r.intenset.write(|w| w.txptrupd().set());
519 let overruns = s.overruns.fetch_sub(1, Ordering::Relaxed); 520 let overruns = s.overruns.fetch_sub(1, Ordering::Relaxed);
520 if overruns - 1 != 0 { 521 if overruns != 0 {
521 warn!("XRUN: {}", overruns); 522 warn!("XRUN: {}", overruns);
522 s.overruns.store(0, Ordering::Relaxed) 523 s.overruns.store(0, Ordering::Relaxed)
523 } 524 }
diff --git a/examples/nrf/src/bin/i2s.rs b/examples/nrf/src/bin/i2s.rs
index 7fb1ecb84..33b5398d9 100644
--- a/examples/nrf/src/bin/i2s.rs
+++ b/examples/nrf/src/bin/i2s.rs
@@ -45,7 +45,7 @@ async fn main(_spawner: Spawner) {
45 let irq = interrupt::take!(I2S); 45 let irq = interrupt::take!(I2S);
46 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); 46 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);
47 47
48 const BUF_SAMPLES: usize = 250; 48 const BUF_SAMPLES: usize = 500;
49 const BUF_SIZE: usize = BUF_SAMPLES * 2; 49 const BUF_SIZE: usize = BUF_SAMPLES * 2;
50 let mut buf = AlignedBuffer([0i16; BUF_SIZE]); 50 let mut buf = AlignedBuffer([0i16; BUF_SIZE]);
51 51
@@ -56,7 +56,6 @@ async fn main(_spawner: Spawner) {
56 // modulator.set_frequency(0.01, inv_sample_rate); 56 // modulator.set_frequency(0.01, inv_sample_rate);
57 // modulator.set_amplitude(0.2); 57 // modulator.set_amplitude(0.2);
58 58
59 let mut lastf = 0.0;
60 let mut generate = |buf: &mut [i16]| { 59 let mut generate = |buf: &mut [i16]| {
61 for sample in buf.as_mut().chunks_mut(2) { 60 for sample in buf.as_mut().chunks_mut(2) {
62 let signal = carrier.generate(); 61 let signal = carrier.generate();
@@ -71,12 +70,14 @@ async fn main(_spawner: Spawner) {
71 70
72 generate(buf.as_mut().as_mut_slice()); 71 generate(buf.as_mut().as_mut_slice());
73 72
73 if let Err(err) = i2s.tx(buf.as_ref().as_slice()).await {
74 error!("{}", err);
75 }
76
74 i2s.set_tx_enabled(true); 77 i2s.set_tx_enabled(true);
75 i2s.start(); 78 i2s.start();
76 79
77 loop { 80 loop {
78 // info!("--");
79
80 generate(buf.as_mut().as_mut_slice()); 81 generate(buf.as_mut().as_mut_slice());
81 82
82 if let Err(err) = i2s.tx(buf.as_ref().as_slice()).await { 83 if let Err(err) = i2s.tx(buf.as_ref().as_slice()).await {