diff options
| -rw-r--r-- | embassy-nrf/src/i2s.rs | 9 | ||||
| -rw-r--r-- | examples/nrf/src/bin/i2s.rs | 9 |
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 { |
