@@ -9,8 +9,8 @@ mod app {
9
9
use embedded_hal:: spi:: { Mode , Phase , Polarity } ;
10
10
use hal:: {
11
11
dma:: {
12
- config:: DmaConfig , traits :: StreamISR , MemoryToPeripheral , PeripheralToMemory , Stream0 ,
13
- Stream5 , StreamsTuple , Transfer ,
12
+ config:: DmaConfig , MemoryToPeripheral , PeripheralToMemory , Stream0 , Stream5 ,
13
+ StreamsTuple , Transfer ,
14
14
} ,
15
15
gpio:: { gpioc:: PC13 , GpioExt , Output , PushPull } ,
16
16
pac:: { DMA1 , SPI3 } ,
@@ -138,50 +138,40 @@ mod app {
138
138
// The led lights up if the first byte we receive is a 1, it turns off otherwise
139
139
#[ task( binds = DMA1_STREAM0 , shared = [ rx_transfer, led] , local = [ rx_buffer] ) ]
140
140
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 ( ) ;
160
147
}
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
+ } ) ;
163
159
}
164
160
165
161
// 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] ) ]
167
163
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
+ } ) ;
186
176
}
187
177
}
0 commit comments