From bf879b4e532113c7942c386983aada3d46e2d85e Mon Sep 17 00:00:00 2001 From: Stephen Hensley Date: Mon, 23 Mar 2026 09:01:20 -0700 Subject: [PATCH 1/2] initial fix: blanket i/o channel swap for mismatch in expected SAI/I2S settings --- src/audio.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/audio.rs b/src/audio.rs index 11aa204..0708d94 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -206,11 +206,10 @@ impl Audio { info!("Set up SAI..."); let sai1_rec = sai1_p.kernel_clk_mux(SAI1SEL_A::Pll3P); - let master_config = - I2SChanConfig::new(I2SDir::Rx).set_frame_sync_active_high(false); + let master_config = I2SChanConfig::new(I2SDir::Rx).set_frame_sync_active_high(true); let slave_config = I2SChanConfig::new(I2SDir::Tx) .set_sync_type(I2SSync::Internal) - .set_frame_sync_active_high(false); + .set_frame_sync_active_high(true); let pins_a = ( sai_mclk_a.into_alternate(), @@ -334,11 +333,10 @@ impl Audio { info!("Setup up SAI..."); let sai1_rec = sai1_p.kernel_clk_mux(SAI1SEL_A::Pll3P); - let master_config = - I2SChanConfig::new(I2SDir::Tx).set_frame_sync_active_high(false); + let master_config = I2SChanConfig::new(I2SDir::Tx).set_frame_sync_active_high(true); let slave_config = I2SChanConfig::new(I2SDir::Rx) .set_sync_type(I2SSync::Internal) - .set_frame_sync_active_high(false); + .set_frame_sync_active_high(true); let pins_a = ( sai_mclk_a.into_alternate(), @@ -480,10 +478,10 @@ impl Audio { info!("Set up SAI..."); let sai1_rec = sai1_p.kernel_clk_mux(SAI1SEL_A::Pll3P); let master_config = - sai::I2SChanConfig::new(sai::I2SDir::Rx).set_frame_sync_active_high(false); + sai::I2SChanConfig::new(sai::I2SDir::Rx).set_frame_sync_active_high(true); let slave_config = sai::I2SChanConfig::new(sai::I2SDir::Tx) .set_sync_type(sai::I2SSync::Internal) - .set_frame_sync_active_high(false); + .set_frame_sync_active_high(true); let pins_a = ( sai_mclk_a.into_alternate(), From 78c83f1da74e5923e939a4ddd1e232f6fd221730 Mon Sep 17 00:00:00 2001 From: Stephen Hensley Date: Mon, 23 Mar 2026 10:08:39 -0700 Subject: [PATCH 2/2] secondary fix: resolves secondary channel-swap, and audio input buzz on seed1.1 (rev5) and patch sm --- src/audio.rs | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/audio.rs b/src/audio.rs index 0708d94..1ff1f45 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -182,6 +182,8 @@ impl Audio { .memory_increment(true) .peripheral_increment(false) .circular_buffer(true) + .transfer_complete_interrupt(true) + .half_transfer_interrupt(true) .fifo_enable(false); let mut output_stream = dma::Transfer::init( dma1_stream0, @@ -257,16 +259,9 @@ impl Audio { input_stream.start(|_sai1_rb| { sai.enable_dma(SaiChannel::ChannelA); }); - - output_stream.start(|sai1_rb| { + sai.enable(); + output_stream.start(|_sai1_rb| { sai.enable_dma(SaiChannel::ChannelB); - - // wait until sai1's fifo starts to receive data - info!("Sai1 fifo waiting to receive data."); - while sai1_rb.chb().sr.read().flvl().is_empty() {} - info!("Audio started!"); - sai.enable(); - sai.try_send(0, 0).unwrap(); }); let max_transfer_size = block_size * 2; @@ -451,6 +446,8 @@ impl Audio { .memory_increment(true) .peripheral_increment(false) .circular_buffer(true) + .transfer_complete_interrupt(true) + .half_transfer_interrupt(true) .fifo_enable(false); let mut output_stream = dma::Transfer::init( @@ -567,12 +564,12 @@ impl Audio { } info!("Start audio stream..."); - input_stream.start(|_sai1_rb| sai.enable_dma(sai::SaiChannel::ChannelA)); - output_stream.start(|sai1_rb| { - sai.enable_dma(sai::SaiChannel::ChannelB); - while sai1_rb.chb().sr.read().flvl().is_empty() {} - sai.enable(); - sai.try_send(0, 0).unwrap(); + input_stream.start(|_sai1_rb| { + sai.enable_dma(SaiChannel::ChannelA); + }); + sai.enable(); + output_stream.start(|_sai1_rb| { + sai.enable_dma(SaiChannel::ChannelB); }); let max_transfer_size = block_size * 2; @@ -602,15 +599,15 @@ impl Audio { // Check interrupt(s) match &mut self.audio_stream { AudioStream::Normal { input, output } => { - output.clear_interrupts(); + input.clear_interrupts(); - if input.get_half_transfer_flag() { - input.clear_half_transfer_interrupt(); + if output.get_half_transfer_flag() { + output.clear_half_transfer_interrupt(); self.input.set_index(0); self.output.set_index(0); true - } else if input.get_transfer_complete_flag() { - input.clear_transfer_complete_interrupt(); + } else if output.get_transfer_complete_flag() { + output.clear_transfer_complete_interrupt(); self.input.set_index(self.max_transfer_size); self.output.set_index(self.max_transfer_size); true @@ -643,8 +640,8 @@ impl Audio { // Check interrupt(s) match &mut self.audio_stream { AudioStream::Normal { input, output } => { - output.clear_interrupts(); - input.get_half_transfer_flag() || input.get_transfer_complete_flag() + input.clear_interrupts(); + output.get_half_transfer_flag() || output.get_transfer_complete_flag() } AudioStream::S2dfm { output, input } => { input.clear_interrupts();