@@ -675,6 +675,7 @@ where
675
675
/// Write bytes to SPI. After writing, flush is called to ensure all data
676
676
/// has been transmitted.
677
677
pub fn write ( & mut self , words : & [ u8 ] ) -> Result < ( ) , Error > {
678
+ self . driver ( ) . setup_full_duplex ( ) ?;
678
679
self . driver ( ) . write ( words) ?;
679
680
self . driver ( ) . flush ( ) ?;
680
681
@@ -684,11 +685,13 @@ where
684
685
/// Read bytes from SPI. The provided slice is filled with data received
685
686
/// from the slave.
686
687
pub fn read ( & mut self , words : & mut [ u8 ] ) -> Result < ( ) , Error > {
688
+ self . driver ( ) . setup_full_duplex ( ) ?;
687
689
self . driver ( ) . read ( words)
688
690
}
689
691
690
692
/// Sends `words` to the slave. Returns the `words` received from the slave.
691
693
pub fn transfer < ' w > ( & mut self , words : & ' w mut [ u8 ] ) -> Result < & ' w [ u8 ] , Error > {
694
+ self . driver ( ) . setup_full_duplex ( ) ?;
692
695
self . driver ( ) . transfer ( words)
693
696
}
694
697
}
@@ -880,6 +883,7 @@ impl<'d> Spi<'d, Async> {
880
883
// We need to flush because the blocking transfer functions may return while a
881
884
// transfer is still in progress.
882
885
self . flush_async ( ) . await ?;
886
+ self . driver ( ) . setup_full_duplex ( ) ?;
883
887
self . driver ( ) . transfer_in_place_async ( words) . await
884
888
}
885
889
}
@@ -1747,7 +1751,9 @@ mod dma {
1747
1751
mut buffer : TX ,
1748
1752
) -> Result < SpiDmaTransfer < ' d , Dm , TX > , ( Error , Self , TX ) > {
1749
1753
self . wait_for_idle ( ) ;
1750
-
1754
+ if let Err ( e) = self . driver ( ) . setup_full_duplex ( ) {
1755
+ return Err ( ( e, self , buffer) ) ;
1756
+ } ;
1751
1757
match unsafe { self . start_dma_write ( bytes_to_write, & mut buffer) } {
1752
1758
Ok ( _) => Ok ( SpiDmaTransfer :: new ( self , buffer) ) ,
1753
1759
Err ( e) => Err ( ( e, self , buffer) ) ,
@@ -1781,6 +1787,9 @@ mod dma {
1781
1787
mut buffer : RX ,
1782
1788
) -> Result < SpiDmaTransfer < ' d , Dm , RX > , ( Error , Self , RX ) > {
1783
1789
self . wait_for_idle ( ) ;
1790
+ if let Err ( e) = self . driver ( ) . setup_full_duplex ( ) {
1791
+ return Err ( ( e, self , buffer) ) ;
1792
+ } ;
1784
1793
match unsafe { self . start_dma_read ( bytes_to_read, & mut buffer) } {
1785
1794
Ok ( _) => Ok ( SpiDmaTransfer :: new ( self , buffer) ) ,
1786
1795
Err ( e) => Err ( ( e, self , buffer) ) ,
@@ -1818,6 +1827,9 @@ mod dma {
1818
1827
mut tx_buffer : TX ,
1819
1828
) -> Result < SpiDmaTransfer < ' d , Dm , ( RX , TX ) > , ( Error , Self , RX , TX ) > {
1820
1829
self . wait_for_idle ( ) ;
1830
+ if let Err ( e) = self . driver ( ) . setup_full_duplex ( ) {
1831
+ return Err ( ( e, self , rx_buffer, tx_buffer) ) ;
1832
+ } ;
1821
1833
match unsafe {
1822
1834
self . start_dma_transfer (
1823
1835
bytes_to_read,
@@ -2081,6 +2093,7 @@ mod dma {
2081
2093
#[ instability:: unstable]
2082
2094
pub fn read ( & mut self , words : & mut [ u8 ] ) -> Result < ( ) , Error > {
2083
2095
self . wait_for_idle ( ) ;
2096
+ self . spi_dma . driver ( ) . setup_full_duplex ( ) ?;
2084
2097
for chunk in words. chunks_mut ( self . rx_buf . capacity ( ) ) {
2085
2098
self . rx_buf . set_length ( chunk. len ( ) ) ;
2086
2099
@@ -2106,6 +2119,7 @@ mod dma {
2106
2119
#[ instability:: unstable]
2107
2120
pub fn write ( & mut self , words : & [ u8 ] ) -> Result < ( ) , Error > {
2108
2121
self . wait_for_idle ( ) ;
2122
+ self . spi_dma . driver ( ) . setup_full_duplex ( ) ?;
2109
2123
for chunk in words. chunks ( self . tx_buf . capacity ( ) ) {
2110
2124
self . tx_buf . fill ( chunk) ;
2111
2125
@@ -2128,6 +2142,7 @@ mod dma {
2128
2142
#[ instability:: unstable]
2129
2143
pub fn transfer ( & mut self , read : & mut [ u8 ] , write : & [ u8 ] ) -> Result < ( ) , Error > {
2130
2144
self . wait_for_idle ( ) ;
2145
+ self . spi_dma . driver ( ) . setup_full_duplex ( ) ?;
2131
2146
let chunk_size = min ( self . tx_buf . capacity ( ) , self . rx_buf . capacity ( ) ) ;
2132
2147
2133
2148
let common_length = min ( read. len ( ) , write. len ( ) ) ;
@@ -2168,6 +2183,7 @@ mod dma {
2168
2183
#[ instability:: unstable]
2169
2184
pub fn transfer_in_place ( & mut self , words : & mut [ u8 ] ) -> Result < ( ) , Error > {
2170
2185
self . wait_for_idle ( ) ;
2186
+ self . spi_dma . driver ( ) . setup_full_duplex ( ) ?;
2171
2187
let chunk_size = min ( self . tx_buf . capacity ( ) , self . rx_buf . capacity ( ) ) ;
2172
2188
2173
2189
for chunk in words. chunks_mut ( chunk_size) {
@@ -2325,6 +2341,7 @@ mod dma {
2325
2341
#[ instability:: unstable]
2326
2342
pub async fn read_async ( & mut self , words : & mut [ u8 ] ) -> Result < ( ) , Error > {
2327
2343
self . spi_dma . wait_for_idle_async ( ) . await ;
2344
+ self . spi_dma . driver ( ) . setup_full_duplex ( ) ?;
2328
2345
let chunk_size = self . rx_buf . capacity ( ) ;
2329
2346
2330
2347
for chunk in words. chunks_mut ( chunk_size) {
@@ -2351,6 +2368,7 @@ mod dma {
2351
2368
#[ instability:: unstable]
2352
2369
pub async fn write_async ( & mut self , words : & [ u8 ] ) -> Result < ( ) , Error > {
2353
2370
self . spi_dma . wait_for_idle_async ( ) . await ;
2371
+ self . spi_dma . driver ( ) . setup_full_duplex ( ) ?;
2354
2372
2355
2373
let mut spi = DropGuard :: new ( & mut self . spi_dma , |spi| spi. cancel_transfer ( ) ) ;
2356
2374
let chunk_size = self . tx_buf . capacity ( ) ;
@@ -2378,6 +2396,7 @@ mod dma {
2378
2396
write : & [ u8 ] ,
2379
2397
) -> Result < ( ) , Error > {
2380
2398
self . spi_dma . wait_for_idle_async ( ) . await ;
2399
+ self . spi_dma . driver ( ) . setup_full_duplex ( ) ?;
2381
2400
2382
2401
let mut spi = DropGuard :: new ( & mut self . spi_dma , |spi| spi. cancel_transfer ( ) ) ;
2383
2402
let chunk_size = min ( self . tx_buf . capacity ( ) , self . rx_buf . capacity ( ) ) ;
@@ -2423,6 +2442,7 @@ mod dma {
2423
2442
#[ instability:: unstable]
2424
2443
pub async fn transfer_in_place_async ( & mut self , words : & mut [ u8 ] ) -> Result < ( ) , Error > {
2425
2444
self . spi_dma . wait_for_idle_async ( ) . await ;
2445
+ self . spi_dma . driver ( ) . setup_full_duplex ( ) ?;
2426
2446
2427
2447
let mut spi = DropGuard :: new ( & mut self . spi_dma , |spi| spi. cancel_transfer ( ) ) ;
2428
2448
for chunk in words. chunks_mut ( self . tx_buf . capacity ( ) ) {
@@ -2603,13 +2623,15 @@ mod ehal1 {
2603
2623
// We need to flush because the blocking transfer functions may return while a
2604
2624
// transfer is still in progress.
2605
2625
self . flush_async ( ) . await ?;
2626
+ self . driver ( ) . setup_full_duplex ( ) ?;
2606
2627
self . driver ( ) . read_async ( words) . await
2607
2628
}
2608
2629
2609
2630
async fn write ( & mut self , words : & [ u8 ] ) -> Result < ( ) , Self :: Error > {
2610
2631
// We need to flush because the blocking transfer functions may return while a
2611
2632
// transfer is still in progress.
2612
2633
self . flush_async ( ) . await ?;
2634
+ self . driver ( ) . setup_full_duplex ( ) ?;
2613
2635
self . driver ( ) . write_async ( words) . await
2614
2636
}
2615
2637
@@ -3379,6 +3401,23 @@ impl Driver {
3379
3401
future. await ;
3380
3402
}
3381
3403
3404
+ fn setup_full_duplex ( & self ) -> Result < ( ) , Error > {
3405
+ self . regs ( ) . user ( ) . modify ( |_, w| {
3406
+ w. usr_miso ( ) . set_bit ( ) ;
3407
+ w. usr_mosi ( ) . set_bit ( ) ;
3408
+ w. doutdin ( ) . set_bit ( ) ;
3409
+ w. usr_dummy ( ) . clear_bit ( ) ;
3410
+ w. sio ( ) . clear_bit ( )
3411
+ } ) ;
3412
+
3413
+ self . init_spi_data_mode (
3414
+ DataMode :: SingleTwoDataLines ,
3415
+ DataMode :: SingleTwoDataLines ,
3416
+ DataMode :: SingleTwoDataLines ,
3417
+ ) ?;
3418
+ Ok ( ( ) )
3419
+ }
3420
+
3382
3421
#[ allow( clippy:: too_many_arguments) ]
3383
3422
fn setup_half_duplex (
3384
3423
& self ,
0 commit comments