@@ -45,9 +45,8 @@ bool stm32l4_sdcard_spi_init(dosfs_sdcard_t *sdcard)
45
45
pins .sck = GPIO_PIN_PC10_SPI3_SCK ;
46
46
pins .ss = GPIO_PIN_NONE ;
47
47
48
- stm32l4_gpio_pin_configure (GPIO_PIN_PD2 , (GPIO_PUPD_NONE | GPIO_OSPEED_HIGH | GPIO_OTYPE_PUSHPULL | GPIO_MODE_INPUT ));
49
-
50
- stm32l4_spi_create (& sdcard -> spi , SPI_INSTANCE_SPI3 , & pins , 2 , SPI_MODE_RX_DMA | SPI_MODE_TX_DMA | SPI_MODE_RX_DMA_SECONDARY | SPI_MODE_TX_DMA_SECONDARY );
48
+ // ### FIXME: IRQ LEVEL needs to be adjusted !!!
49
+ stm32l4_spi_create (& sdcard -> spi , SPI_INSTANCE_SPI3 , & pins , 11 , SPI_MODE_RX_DMA | SPI_MODE_TX_DMA | SPI_MODE_RX_DMA_SECONDARY | SPI_MODE_TX_DMA_SECONDARY );
51
50
stm32l4_spi_enable (& sdcard -> spi , NULL , NULL , 0 );
52
51
53
52
clock = stm32l4_spi_clock (& sdcard -> spi ) / 2 ;
@@ -62,13 +61,32 @@ bool stm32l4_sdcard_spi_init(dosfs_sdcard_t *sdcard)
62
61
sdcard -> control = SPI_CONTROL_MODE_3 | (divide << SPI_CONTROL_DIV_SHIFT );
63
62
sdcard -> pin_cs = GPIO_PIN_PD2 ;
64
63
64
+ stm32l4_gpio_pin_configure (sdcard -> pin_cs , (GPIO_PUPD_NONE | GPIO_OSPEED_HIGH | GPIO_OTYPE_PUSHPULL | GPIO_MODE_OUTPUT ));
65
+ stm32l4_gpio_pin_write (sdcard -> pin_cs , 1 );
66
+
65
67
return true;
66
68
}
67
69
68
70
bool stm32l4_sdcard_spi_present (dosfs_sdcard_t * sdcard )
69
71
{
70
- // return !!stm32l4_gpio_pin_read(sdcard->pin_cs);
71
- return true;
72
+ bool present ;
73
+
74
+ /* This below is kind of fragile. The idea is to first set CS to 0, wait a tad
75
+ * till the input settles to a 0. The switch the mode to input, while will make
76
+ * the external pullup on CS take effect. If internal PULLDOWN does not work,
77
+ * it overpowers the external pullupon CS. The delays are required to let
78
+ * the signal on CS settle.
79
+ */
80
+
81
+ stm32l4_gpio_pin_write (sdcard -> pin_cs , 0 );
82
+ armv7m_clock_spin (2000 );
83
+ stm32l4_gpio_pin_input (sdcard -> pin_cs );
84
+ armv7m_clock_spin (2000 );
85
+ present = !!stm32l4_gpio_pin_read (sdcard -> pin_cs );
86
+ stm32l4_gpio_pin_output (sdcard -> pin_cs );
87
+ stm32l4_gpio_pin_write (sdcard -> pin_cs , 1 );
88
+
89
+ return present ;
72
90
}
73
91
74
92
uint32_t stm32l4_sdcard_spi_mode (dosfs_sdcard_t * sdcard , int mode )
@@ -78,29 +96,15 @@ uint32_t stm32l4_sdcard_spi_mode(dosfs_sdcard_t *sdcard, int mode)
78
96
if (mode == DOSFS_SDCARD_MODE_NONE )
79
97
{
80
98
speed = 0 ;
81
-
82
- /* Switch CS_SDCARD to be input
83
- */
84
- stm32l4_gpio_pin_configure (sdcard -> pin_cs , (GPIO_PUPD_NONE | GPIO_OSPEED_HIGH | GPIO_OTYPE_PUSHPULL | GPIO_MODE_INPUT ));
85
99
}
86
100
else
87
101
{
88
102
if (mode == DOSFS_SDCARD_MODE_IDENTIFY )
89
103
{
90
104
speed = 400000 ;
91
-
92
- /* Switch CS_SDCARD to be output
93
- */
94
-
95
- stm32l4_gpio_pin_configure (sdcard -> pin_cs , (GPIO_PUPD_NONE | GPIO_OSPEED_HIGH | GPIO_OTYPE_PUSHPULL | GPIO_MODE_OUTPUT ));
96
- stm32l4_gpio_pin_write (sdcard -> pin_cs , 1 );
97
105
}
98
106
else
99
107
{
100
- // speed = 20000000;
101
- // speed = 10000000;
102
- speed = 5000000 ;
103
-
104
108
if (mode == DOSFS_SDCARD_MODE_DATA_TRANSFER )
105
109
{
106
110
speed = 25000000 ;
@@ -110,15 +114,13 @@ uint32_t stm32l4_sdcard_spi_mode(dosfs_sdcard_t *sdcard, int mode)
110
114
speed = 50000000 ;
111
115
}
112
116
113
- // speed = 5000000;
114
-
115
117
stm32l4_sdcard_spi_deselect (sdcard );
116
118
}
117
119
118
120
clock = stm32l4_spi_clock (& sdcard -> spi ) / 2 ;
119
121
divide = 0 ;
120
122
121
- while ((clock > 400000 ) && (divide < 7 ))
123
+ while ((clock > speed ) && (divide < 7 ))
122
124
{
123
125
clock /= 2 ;
124
126
divide ++ ;
@@ -198,7 +200,7 @@ uint8_t stm32l4_sdcard_spi_receive(dosfs_sdcard_t *sdcard)
198
200
199
201
void stm32l4_sdcard_spi_send_block (dosfs_sdcard_t * sdcard , const uint8_t * data )
200
202
{
201
- stm32l4_spi_transmit (& sdcard -> spi , data , 512 , SPI_CONTROL_CRC16 );
203
+ stm32l4_spi_transmit (& sdcard -> spi , data , 512 , sdcard -> control | SPI_CONTROL_CRC16 );
202
204
203
205
while (!stm32l4_spi_done (& sdcard -> spi ))
204
206
{
@@ -208,7 +210,7 @@ void stm32l4_sdcard_spi_send_block(dosfs_sdcard_t *sdcard, const uint8_t *data)
208
210
209
211
uint32_t stm32l4_sdcard_spi_receive_block (dosfs_sdcard_t * sdcard , uint8_t * data )
210
212
{
211
- stm32l4_spi_receive (& sdcard -> spi , data , 512 , SPI_CONTROL_CRC16 );
213
+ stm32l4_spi_receive (& sdcard -> spi , data , 512 , sdcard -> control | SPI_CONTROL_CRC16 );
212
214
213
215
while (!stm32l4_spi_done (& sdcard -> spi ))
214
216
{
0 commit comments