mirror of
https://github.com/embassy-rs/embassy.git
synced 2025-10-02 14:44:32 +00:00
chore: update for latest SAI features
This commit is contained in:
parent
e8b03b75ec
commit
99dd5e79db
@ -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,32 +84,15 @@ 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 {
|
||||||
Ok(_) => (),
|
renew_sai = false;
|
||||||
Err(spdifrx::Error::RingbufferError(_)) => {
|
|
||||||
trace!("SPDIFRX ringbuffer error. Renew.");
|
|
||||||
drop(spdif_receiver);
|
|
||||||
spdif_receiver = new_spdif_receiver(&mut p.SPDIFRX1, &mut p.PD7, &mut p.DMA2_CH7, spdifrx_buffer);
|
|
||||||
spdif_receiver.start();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Err(spdifrx::Error::ChannelSyncError) => {
|
|
||||||
trace!("SPDIFRX channel sync (left/right assignment) error.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Err(spdifrx::Error::SourceSyncError) => {
|
|
||||||
trace!("SPDIFRX source sync error, e.g. disconnect.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if sai_transmitter.write(&buf).await.is_err() {
|
|
||||||
trace!("Renew SAI.");
|
trace!("Renew SAI.");
|
||||||
drop(sai_transmitter);
|
drop(sai_transmitter);
|
||||||
sai_transmitter = new_sai_transmitter(
|
sai_transmitter = new_sai_transmitter(
|
||||||
@ -120,8 +103,30 @@ async fn main(_spawner: Spawner) {
|
|||||||
&mut p.BDMA_CH0,
|
&mut p.BDMA_CH0,
|
||||||
sai_buffer,
|
sai_buffer,
|
||||||
);
|
);
|
||||||
sai_transmitter.start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
match select(spdif_receiver.read(&mut buf), sai_transmitter.wait_write_error()).await {
|
||||||
|
Either::First(spdif_read_result) => match spdif_read_result {
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(spdifrx::Error::RingbufferError(_)) => {
|
||||||
|
trace!("SPDIFRX ringbuffer error. Renew.");
|
||||||
|
drop(spdif_receiver);
|
||||||
|
spdif_receiver = new_spdif_receiver(&mut p.SPDIFRX1, &mut p.PD7, &mut p.DMA2_CH7, spdifrx_buffer);
|
||||||
|
spdif_receiver.start();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Err(spdifrx::Error::ChannelSyncError) => {
|
||||||
|
trace!("SPDIFRX channel sync (left/right assignment) error.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Either::Second(_) => {
|
||||||
|
renew_sai = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
renew_sai = sai_transmitter.write(&buf).await.is_err();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user