chore: update for latest SAI features

This commit is contained in:
elagil 2024-11-18 20:51:23 +01:00
parent e8b03b75ec
commit 99dd5e79db

View File

@ -7,6 +7,7 @@
use defmt::{info, trace}; use defmt::{info, trace};
use embassy_executor::Spawner; use embassy_executor::Spawner;
use embassy_futures::select::{self, select, Either};
use embassy_stm32::spdifrx::{self, Spdifrx}; use embassy_stm32::spdifrx::{self, Spdifrx};
use embassy_stm32::{bind_interrupts, peripherals, sai}; use embassy_stm32::{bind_interrupts, peripherals, sai};
use grounded::uninit::GroundedArrayCell; use grounded::uninit::GroundedArrayCell;
@ -75,7 +76,6 @@ async fn main(_spawner: Spawner) {
core::slice::from_raw_parts_mut(ptr, len) core::slice::from_raw_parts_mut(ptr, len)
}; };
let mut spdif_receiver = new_spdif_receiver(&mut p.SPDIFRX1, &mut p.PD7, &mut p.DMA2_CH7, spdifrx_buffer);
let mut sai_transmitter = new_sai_transmitter( let mut sai_transmitter = new_sai_transmitter(
&mut p.SAI4, &mut p.SAI4,
&mut p.PD13, &mut p.PD13,
@ -84,13 +84,29 @@ async fn main(_spawner: Spawner) {
&mut p.BDMA_CH0, &mut p.BDMA_CH0,
sai_buffer, sai_buffer,
); );
let mut spdif_receiver = new_spdif_receiver(&mut p.SPDIFRX1, &mut p.PD7, &mut p.DMA2_CH7, spdifrx_buffer);
spdif_receiver.start(); spdif_receiver.start();
let mut renew_sai = false;
loop { loop {
let mut buf = [0u32; HALF_DMA_BUFFER_LENGTH]; let mut buf = [0u32; HALF_DMA_BUFFER_LENGTH];
match spdif_receiver.read_data(&mut buf).await { if renew_sai {
renew_sai = false;
trace!("Renew SAI.");
drop(sai_transmitter);
sai_transmitter = new_sai_transmitter(
&mut p.SAI4,
&mut p.PD13,
&mut p.PC1,
&mut p.PD12,
&mut p.BDMA_CH0,
sai_buffer,
);
}
match select(spdif_receiver.read(&mut buf), sai_transmitter.wait_write_error()).await {
Either::First(spdif_read_result) => match spdif_read_result {
Ok(_) => (), Ok(_) => (),
Err(spdifrx::Error::RingbufferError(_)) => { Err(spdifrx::Error::RingbufferError(_)) => {
trace!("SPDIFRX ringbuffer error. Renew."); trace!("SPDIFRX ringbuffer error. Renew.");
@ -103,25 +119,14 @@ async fn main(_spawner: Spawner) {
trace!("SPDIFRX channel sync (left/right assignment) error."); trace!("SPDIFRX channel sync (left/right assignment) error.");
continue; continue;
} }
Err(spdifrx::Error::SourceSyncError) => { },
trace!("SPDIFRX source sync error, e.g. disconnect."); Either::Second(_) => {
renew_sai = true;
continue; continue;
} }
}; };
if sai_transmitter.write(&buf).await.is_err() { renew_sai = sai_transmitter.write(&buf).await.is_err();
trace!("Renew SAI.");
drop(sai_transmitter);
sai_transmitter = new_sai_transmitter(
&mut p.SAI4,
&mut p.PD13,
&mut p.PC1,
&mut p.PD12,
&mut p.BDMA_CH0,
sai_buffer,
);
sai_transmitter.start();
}
} }
} }
@ -134,7 +139,7 @@ fn new_spdif_receiver<'d>(
dma: &'d mut peripherals::DMA2_CH7, dma: &'d mut peripherals::DMA2_CH7,
buf: &'d mut [u32], buf: &'d mut [u32],
) -> Spdifrx<'d, peripherals::SPDIFRX1> { ) -> Spdifrx<'d, peripherals::SPDIFRX1> {
Spdifrx::new_data_only(spdifrx, Irqs, spdifrx::Config::default(), input_pin, dma, buf) Spdifrx::new(spdifrx, Irqs, spdifrx::Config::default(), input_pin, dma, buf)
} }
/// Creates a new SAI4 instance for transmitting sample data. /// Creates a new SAI4 instance for transmitting sample data.