1+ use crate :: dma:: mux:: DmaMuxResources ;
2+ use crate :: dma:: traits:: TargetAddress ;
3+ use crate :: dma:: MemoryToPeripheral ;
14use crate :: gpio:: { gpioa:: * , gpiob:: * , gpioc:: * , gpiof:: * , Alternate , AF5 , AF6 } ;
25#[ cfg( any(
36 feature = "stm32g471" ,
@@ -20,6 +23,7 @@ use crate::stm32::{RCC, SPI1, SPI2, SPI3};
2023use crate :: time:: Hertz ;
2124use core:: cell:: UnsafeCell ;
2225use core:: ptr;
26+
2327pub use hal:: spi:: { Mode , Phase , Polarity , MODE_0 , MODE_1 , MODE_2 , MODE_3 } ;
2428
2529/// SPI error
@@ -74,6 +78,7 @@ macro_rules! spi {
7478 sck: [ $( $( #[ $pmetasck: meta ] ) * $SCK: ty, ) + ] ,
7579 miso: [ $( $( #[ $pmetamiso: meta ] ) * $MISO: ty, ) + ] ,
7680 mosi: [ $( $( #[ $pmetamosi: meta ] ) * $MOSI: ty, ) + ] ,
81+ $mux: expr,
7782 ) => {
7883 impl PinSck <$SPIX> for NoSck { }
7984
@@ -166,6 +171,14 @@ macro_rules! spi {
166171 pub fn release( self ) -> ( $SPIX, PINS ) {
167172 ( self . spi, self . pins)
168173 }
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+ }
169182 }
170183
171184 impl SpiExt <$SPIX> for $SPIX {
@@ -220,6 +233,18 @@ macro_rules! spi {
220233 } )
221234 }
222235 }
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+
223248
224249 impl <PINS > :: hal:: blocking:: spi:: transfer:: Default <u8 > for Spi <$SPIX, PINS > { }
225250
@@ -266,6 +291,7 @@ spi!(
266291 ) ) ]
267292 PG4 <Alternate <AF5 >>,
268293 ] ,
294+ DmaMuxResources :: SPI1_TX ,
269295) ;
270296
271297spi ! (
@@ -285,6 +311,7 @@ spi!(
285311 PA11 <Alternate <AF5 >>,
286312 PB15 <Alternate <AF5 >>,
287313 ] ,
314+ DmaMuxResources :: SPI2_TX ,
288315) ;
289316
290317spi ! (
@@ -310,6 +337,7 @@ spi!(
310337 PB5 <Alternate <AF6 >>,
311338 PC12 <Alternate <AF6 >>,
312339 ] ,
340+ DmaMuxResources :: SPI3_TX ,
313341) ;
314342
315343#[ cfg( any(
@@ -334,4 +362,5 @@ spi!(
334362 PE6 <Alternate <AF5 >>,
335363 PE14 <Alternate <AF5 >>,
336364 ] ,
365+ DmaMuxResources :: SPI4_TX ,
337366) ;
0 commit comments