aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/stm32h723/src/bin/spdifrx.rs53
1 files changed, 29 insertions, 24 deletions
diff --git a/examples/stm32h723/src/bin/spdifrx.rs b/examples/stm32h723/src/bin/spdifrx.rs
index 36c017592..69ef5cd07 100644
--- a/examples/stm32h723/src/bin/spdifrx.rs
+++ b/examples/stm32h723/src/bin/spdifrx.rs
@@ -7,6 +7,7 @@
7 7
8use defmt::{info, trace}; 8use defmt::{info, trace};
9use embassy_executor::Spawner; 9use embassy_executor::Spawner;
10use embassy_futures::select::{self, select, Either};
10use embassy_stm32::spdifrx::{self, Spdifrx}; 11use embassy_stm32::spdifrx::{self, Spdifrx};
11use embassy_stm32::{bind_interrupts, peripherals, sai}; 12use embassy_stm32::{bind_interrupts, peripherals, sai};
12use grounded::uninit::GroundedArrayCell; 13use grounded::uninit::GroundedArrayCell;
@@ -75,7 +76,6 @@ async fn main(_spawner: Spawner) {
75 core::slice::from_raw_parts_mut(ptr, len) 76 core::slice::from_raw_parts_mut(ptr, len)
76 }; 77 };
77 78
78 let mut spdif_receiver = new_spdif_receiver(&mut p.SPDIFRX1, &mut p.PD7, &mut p.DMA2_CH7, spdifrx_buffer);
79 let mut sai_transmitter = new_sai_transmitter( 79 let mut sai_transmitter = new_sai_transmitter(
80 &mut p.SAI4, 80 &mut p.SAI4,
81 &mut p.PD13, 81 &mut p.PD13,
@@ -84,32 +84,15 @@ async fn main(_spawner: Spawner) {
84 &mut p.BDMA_CH0, 84 &mut p.BDMA_CH0,
85 sai_buffer, 85 sai_buffer,
86 ); 86 );
87 87 let mut spdif_receiver = new_spdif_receiver(&mut p.SPDIFRX1, &mut p.PD7, &mut p.DMA2_CH7, spdifrx_buffer);
88 spdif_receiver.start(); 88 spdif_receiver.start();
89 89
90 let mut renew_sai = false;
90 loop { 91 loop {
91 let mut buf = [0u32; HALF_DMA_BUFFER_LENGTH]; 92 let mut buf = [0u32; HALF_DMA_BUFFER_LENGTH];
92 93
93 match spdif_receiver.read_data(&mut buf).await { 94 if renew_sai {
94 Ok(_) => (), 95 renew_sai = false;
95 Err(spdifrx::Error::RingbufferError(_)) => {
96 trace!("SPDIFRX ringbuffer error. Renew.");
97 drop(spdif_receiver);
98 spdif_receiver = new_spdif_receiver(&mut p.SPDIFRX1, &mut p.PD7, &mut p.DMA2_CH7, spdifrx_buffer);
99 spdif_receiver.start();
100 continue;
101 }
102 Err(spdifrx::Error::ChannelSyncError) => {
103 trace!("SPDIFRX channel sync (left/right assignment) error.");
104 continue;
105 }
106 Err(spdifrx::Error::SourceSyncError) => {
107 trace!("SPDIFRX source sync error, e.g. disconnect.");
108 continue;
109 }
110 };
111
112 if sai_transmitter.write(&buf).await.is_err() {
113 trace!("Renew SAI."); 96 trace!("Renew SAI.");
114 drop(sai_transmitter); 97 drop(sai_transmitter);
115 sai_transmitter = new_sai_transmitter( 98 sai_transmitter = new_sai_transmitter(
@@ -120,8 +103,30 @@ async fn main(_spawner: Spawner) {
120 &mut p.BDMA_CH0, 103 &mut p.BDMA_CH0,
121 sai_buffer, 104 sai_buffer,
122 ); 105 );
123 sai_transmitter.start();
124 } 106 }
107
108 match select(spdif_receiver.read(&mut buf), sai_transmitter.wait_write_error()).await {
109 Either::First(spdif_read_result) => match spdif_read_result {
110 Ok(_) => (),
111 Err(spdifrx::Error::RingbufferError(_)) => {
112 trace!("SPDIFRX ringbuffer error. Renew.");
113 drop(spdif_receiver);
114 spdif_receiver = new_spdif_receiver(&mut p.SPDIFRX1, &mut p.PD7, &mut p.DMA2_CH7, spdifrx_buffer);
115 spdif_receiver.start();
116 continue;
117 }
118 Err(spdifrx::Error::ChannelSyncError) => {
119 trace!("SPDIFRX channel sync (left/right assignment) error.");
120 continue;
121 }
122 },
123 Either::Second(_) => {
124 renew_sai = true;
125 continue;
126 }
127 };
128
129 renew_sai = sai_transmitter.write(&buf).await.is_err();
125 } 130 }
126} 131}
127 132
@@ -134,7 +139,7 @@ fn new_spdif_receiver<'d>(
134 dma: &'d mut peripherals::DMA2_CH7, 139 dma: &'d mut peripherals::DMA2_CH7,
135 buf: &'d mut [u32], 140 buf: &'d mut [u32],
136) -> Spdifrx<'d, peripherals::SPDIFRX1> { 141) -> Spdifrx<'d, peripherals::SPDIFRX1> {
137 Spdifrx::new_data_only(spdifrx, Irqs, spdifrx::Config::default(), input_pin, dma, buf) 142 Spdifrx::new(spdifrx, Irqs, spdifrx::Config::default(), input_pin, dma, buf)
138} 143}
139 144
140/// Creates a new SAI4 instance for transmitting sample data. 145/// Creates a new SAI4 instance for transmitting sample data.