diff options
| -rw-r--r-- | examples/stm32h723/src/bin/spdifrx.rs | 53 |
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 | ||
| 8 | use defmt::{info, trace}; | 8 | use defmt::{info, trace}; |
| 9 | use embassy_executor::Spawner; | 9 | use embassy_executor::Spawner; |
| 10 | use embassy_futures::select::{self, select, Either}; | ||
| 10 | use embassy_stm32::spdifrx::{self, Spdifrx}; | 11 | use embassy_stm32::spdifrx::{self, Spdifrx}; |
| 11 | use embassy_stm32::{bind_interrupts, peripherals, sai}; | 12 | use embassy_stm32::{bind_interrupts, peripherals, sai}; |
| 12 | use grounded::uninit::GroundedArrayCell; | 13 | use 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. |
