@@ -9,8 +9,8 @@ mod app {
99 use embedded_hal:: spi:: { Mode , Phase , Polarity } ;
1010 use hal:: {
1111 dma:: {
12- config:: DmaConfig , traits :: StreamISR , MemoryToPeripheral , PeripheralToMemory , Stream0 ,
13- Stream5 , StreamsTuple , Transfer ,
12+ config:: DmaConfig , MemoryToPeripheral , PeripheralToMemory , Stream0 , Stream5 ,
13+ StreamsTuple , Transfer ,
1414 } ,
1515 gpio:: { gpioc:: PC13 , GpioExt , Output , PushPull } ,
1616 pac:: { DMA1 , SPI3 } ,
@@ -138,50 +138,40 @@ mod app {
138138 // The led lights up if the first byte we receive is a 1, it turns off otherwise
139139 #[ task( binds = DMA1_STREAM0 , shared = [ rx_transfer, led] , local = [ rx_buffer] ) ]
140140 fn on_receiving ( cx : on_receiving:: Context ) {
141- let on_receiving:: Context { mut shared, local } = cx;
142- if Stream0 :: < DMA1 > :: get_fifo_error_flag ( ) {
143- shared
144- . rx_transfer
145- . lock ( |spi_dma| spi_dma. clear_fifo_error_interrupt ( ) ) ;
146- }
147- if Stream0 :: < DMA1 > :: get_transfer_complete_flag ( ) {
148- shared
149- . rx_transfer
150- . lock ( |spi_dma| spi_dma. clear_transfer_complete_interrupt ( ) ) ;
151- let filled_buffer = shared. rx_transfer . lock ( |spi_dma| {
152- let ( result, _) = spi_dma
153- . next_transfer ( local. rx_buffer . take ( ) . unwrap ( ) )
154- . unwrap ( ) ;
155- result
156- } ) ;
157- match filled_buffer[ 0 ] {
158- 1 => shared. led . lock ( |led| led. set_low ( ) ) ,
159- _ => shared. led . lock ( |led| led. set_high ( ) ) ,
141+ let mut rx_transfer = cx. shared . rx_transfer ;
142+ let mut led = cx. shared . led ;
143+ let rx_buffer = cx. local . rx_buffer ;
144+ rx_transfer. lock ( |transfer| {
145+ if transfer. is_fifo_error ( ) {
146+ transfer. clear_fifo_error ( ) ;
160147 }
161- * local. rx_buffer = Some ( filled_buffer) ;
162- }
148+ if transfer. is_transfer_complete ( ) {
149+ transfer. clear_transfer_complete ( ) ;
150+
151+ let ( filled_buffer, _) = transfer. next_transfer ( rx_buffer. take ( ) . unwrap ( ) ) . unwrap ( ) ;
152+ match filled_buffer[ 0 ] {
153+ 1 => led. lock ( |led| led. set_low ( ) ) ,
154+ _ => led. lock ( |led| led. set_high ( ) ) ,
155+ }
156+ * rx_buffer = Some ( filled_buffer) ;
157+ }
158+ } ) ;
163159 }
164160
165161 // We either send [1,2,3] or [4,5,6] depending on which buffer was loaded
166- #[ task( binds = DMA1_STREAM5 , shared = [ tx_transfer, led ] , local = [ tx_buffer] ) ]
162+ #[ task( binds = DMA1_STREAM5 , shared = [ tx_transfer] , local = [ tx_buffer] ) ]
167163 fn on_sending ( cx : on_sending:: Context ) {
168- let on_sending:: Context { mut shared, local } = cx;
169- if Stream5 :: < DMA1 > :: get_fifo_error_flag ( ) {
170- shared
171- . tx_transfer
172- . lock ( |spi_dma| spi_dma. clear_fifo_error_interrupt ( ) ) ;
173- }
174- if Stream5 :: < DMA1 > :: get_transfer_complete_flag ( ) {
175- shared
176- . tx_transfer
177- . lock ( |spi_dma| spi_dma. clear_transfer_complete_interrupt ( ) ) ;
178- let filled_buffer = shared. tx_transfer . lock ( |spi_dma| {
179- let ( result, _) = spi_dma
180- . next_transfer ( local. tx_buffer . take ( ) . unwrap ( ) )
181- . unwrap ( ) ;
182- result
183- } ) ;
184- * local. tx_buffer = Some ( filled_buffer) ;
185- }
164+ let mut tx_transfer = cx. shared . tx_transfer ;
165+ let tx_buffer = cx. local . tx_buffer ;
166+ tx_transfer. lock ( |transfer| {
167+ if transfer. is_fifo_error ( ) {
168+ transfer. clear_fifo_error ( ) ;
169+ }
170+ if transfer. is_transfer_complete ( ) {
171+ transfer. clear_transfer_complete ( ) ;
172+ let ( filled_buffer, _) = transfer. next_transfer ( tx_buffer. take ( ) . unwrap ( ) ) . unwrap ( ) ;
173+ * tx_buffer = Some ( filled_buffer) ;
174+ }
175+ } ) ;
186176 }
187177}
0 commit comments