1
+ use crate :: dma:: mux:: DmaMuxResources ;
2
+ use crate :: dma:: traits:: TargetAddress ;
3
+ use crate :: dma:: MemoryToPeripheral ;
1
4
use crate :: gpio:: { gpioa:: * , gpiob:: * , gpioc:: * , gpiof:: * , Alternate , AF5 , AF6 } ;
2
5
#[ cfg( any(
3
6
feature = "stm32g471" ,
@@ -20,6 +23,7 @@ use crate::stm32::{RCC, SPI1, SPI2, SPI3};
20
23
use crate :: time:: Hertz ;
21
24
use core:: cell:: UnsafeCell ;
22
25
use core:: ptr;
26
+
23
27
pub use hal:: spi:: { Mode , Phase , Polarity , MODE_0 , MODE_1 , MODE_2 , MODE_3 } ;
24
28
25
29
/// SPI error
@@ -74,6 +78,7 @@ macro_rules! spi {
74
78
sck: [ $( $( #[ $pmetasck: meta ] ) * $SCK: ty, ) + ] ,
75
79
miso: [ $( $( #[ $pmetamiso: meta ] ) * $MISO: ty, ) + ] ,
76
80
mosi: [ $( $( #[ $pmetamosi: meta ] ) * $MOSI: ty, ) + ] ,
81
+ $mux: expr,
77
82
) => {
78
83
impl PinSck <$SPIX> for NoSck { }
79
84
@@ -166,6 +171,14 @@ macro_rules! spi {
166
171
pub fn release( self ) -> ( $SPIX, PINS ) {
167
172
( self . spi, self . pins)
168
173
}
174
+
175
+ pub fn enable_tx_dma( self ) -> Spi <$SPIX, PINS > {
176
+ self . spi. cr2. modify( |_, w| w. txdmaen( ) . set_bit( ) ) ;
177
+ Spi {
178
+ spi: self . spi,
179
+ pins: self . pins,
180
+ }
181
+ }
169
182
}
170
183
171
184
impl SpiExt <$SPIX> for $SPIX {
@@ -220,6 +233,18 @@ macro_rules! spi {
220
233
} )
221
234
}
222
235
}
236
+ unsafe impl <Pin > TargetAddress <MemoryToPeripheral > for Spi <$SPIX, Pin > {
237
+ #[ inline( always) ]
238
+ fn address( & self ) -> u32 {
239
+ // unsafe: only the Tx part accesses the Tx register
240
+ & unsafe { & * <$SPIX>:: ptr( ) } . dr as * const _ as u32
241
+ }
242
+
243
+ type MemSize = u8 ;
244
+
245
+ const REQUEST_LINE : Option <u8 > = Some ( $mux as u8 ) ;
246
+ }
247
+
223
248
224
249
impl <PINS > :: hal:: blocking:: spi:: transfer:: Default <u8 > for Spi <$SPIX, PINS > { }
225
250
@@ -266,6 +291,7 @@ spi!(
266
291
) ) ]
267
292
PG4 <Alternate <AF5 >>,
268
293
] ,
294
+ DmaMuxResources :: SPI1_TX ,
269
295
) ;
270
296
271
297
spi ! (
@@ -285,6 +311,7 @@ spi!(
285
311
PA11 <Alternate <AF5 >>,
286
312
PB15 <Alternate <AF5 >>,
287
313
] ,
314
+ DmaMuxResources :: SPI2_TX ,
288
315
) ;
289
316
290
317
spi ! (
@@ -310,6 +337,7 @@ spi!(
310
337
PB5 <Alternate <AF6 >>,
311
338
PC12 <Alternate <AF6 >>,
312
339
] ,
340
+ DmaMuxResources :: SPI3_TX ,
313
341
) ;
314
342
315
343
#[ cfg( any(
@@ -334,4 +362,5 @@ spi!(
334
362
PE6 <Alternate <AF5 >>,
335
363
PE14 <Alternate <AF5 >>,
336
364
] ,
365
+ DmaMuxResources :: SPI4_TX ,
337
366
) ;
0 commit comments