Skip to content

Commit 2fb35f1

Browse files
committed
fix: properly set SD pins
Only set*() methods and SDx_* definitions allows to manage the pins else the first pin available in the associated PinMap_SD_* arrays will be used. Fixes #75. Signed-off-by: Frederic Pillon <[email protected]>
1 parent 7b69085 commit 2fb35f1

File tree

7 files changed

+53
-152
lines changed

7 files changed

+53
-152
lines changed

README.md

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ Some default definitions can be overridden using:
3838

3939
#### SDIO/SDMMC pins definition
4040

41-
Since STM32 core v2.6.0, the `PinMap_SD[]` array defined in the `PeripheralPins*.c` has been split per signals:
41+
> [!IMPORTANT]
42+
> Since STM32 core v2.6.0, the `PinMap_SD[]` array defined in the `PeripheralPins*.c` has been splitted per signals:
43+
4244
```C
4345
PinMap_SD_CK[]
4446
PinMap_SD_DATA0[]
@@ -74,9 +76,11 @@ By default, if no pins are explicitly defined, the first one from each array is
7476
* `SDX_D0DIR`
7577
* `SDX_D123DIR`
7678

77-
* or redefine the default one before call of `begin()` of `SDClass` or `init()` of `Sd2Card`, use the following methods:
79+
* or redefine the default one before call of `begin()` of `SDClass` or `init()` of `Sd2Card`, using the following methods:
7880

7981
* `setDx(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3)`
82+
> [!NOTE]
83+
> If `SD_BUS_WIDE_1B` is used only `data0` is needed.
8084
* `setCK(uint32_t ck)`
8185
* `setCK(PinName ck)`
8286
* `setCMD(uint32_t cmd)`
@@ -106,31 +110,6 @@ By default, if no pins are explicitly defined, the first one from each array is
106110
SD.begin();
107111
```
108112

109-
* or using the `begin()` of `SDClass` or `init()` of `Sd2Card` methods:
110-
111-
* For `SDIO`:
112-
* `SDClass`:
113-
* `begin(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd)`
114-
* `begin(uint32_t detect = SD_DETECT_NONE, uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1, uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CK, uint32_t cmd = SDX_CMD, uint32_t ckin = SDX_CKIN, uint32_t cdir = SDX_CDIR, uint32_t d0dir = SDX_D0DIR, uint32_t d123dir = SDX_D123DIR);`
115-
* `Sd2Card`:
116-
* `init(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd)`
117-
* `init(uint32_t detect = SD_DETECT_NONE, uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1, uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CK, uint32_t cmd = SDX_CMD);`
118-
119-
* For `SDMMC`:
120-
* `SDClass`:
121-
* `begin(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd, uint32_t ckin, uint32_t cdir, uint32_t d0dir, uint32_t d123dir);`
122-
* `begin(uint32_t detect = SD_DETECT_NONE, uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1, uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CK, uint32_t cmd = SDX_CMD, uint32_t ckin = SDX_CKIN, uint32_t cdir = SDX_CDIR, uint32_t d0dir = SDX_D0DIR, uint32_t d123dir = SDX_D123DIR);`
123-
*
124-
* * `Sd2Card`:
125-
* `init(uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1, uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CK, uint32_t cmd = SDX_CMD, uint32_t ckin = SDX_CKIN, uint32_t cdir = SDX_CDIR, uint32_t d0dir = SDX_D0DIR, uint32_t d123dir = SDX_D123DIR)`
126-
* `init(uint32_t detect = SD_DETECT_NONE, uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1, uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CK, uint32_t cmd = SDX_CMD, uint32_t ckin = SDX_CKIN, uint32_t cdir = SDX_CDIR, uint32_t d0dir = SDX_D0DIR, uint32_t d123dir = SDX_D123DIR);`
127-
128-
*Code snippet:*
129-
```C++
130-
card.init(PE12, PE13, PE14, PE15, PB14, PB15);
131-
SD.begin(SD_DETECT_PIN, PE12, PE13, PE14, PE15, PB14, PB15);
132-
```
133-
134113
#### SD configurations
135114

136115
* `SD_INSTANCE`: some STM32 can have 2 SD peripherals `SDMMC1` and `SDMMC2`, note that this library can managed only one peripheral

src/SD.cpp

Lines changed: 1 addition & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -56,69 +56,14 @@ extern "C" {
5656
#include "STM32SD.h"
5757
SDClass SD;
5858

59-
/**
60-
* @brief Link SD, register the file system object to the FatFs mode and configure
61-
* relatives SD IOs including SD Detect Pin if any
62-
* @param data0: data0 pin number (default SDX_D0)
63-
* @param data1: data1 pin number (default SDX_D1)
64-
* @param data2: data2 pin number (default SDX_D2)
65-
* @param data3: data3 pin number (default SDX_D3)
66-
* @param ck: ck pin number (default SDX_CK)
67-
* @param cmd: cmd pin number (default SDX_CMD)
68-
* @param ckin: ckin pin number only for SDMMC (default SDX_CKIN)
69-
* @param cdir: cdir pin number only for SDMMC (default SDX_CDIR)
70-
* @param d0dir: d0dir pin number only for SDMMC (default SDX_D0DIR)
71-
* @param d123dir: d123dir pin number only for SDMMC (default SDX_D123DIR)
72-
* @retval true or false
73-
*/
74-
#if defined(SDMMC1) || defined(SDMMC2)
75-
bool SDClass::begin(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3,
76-
uint32_t ck, uint32_t cmd, uint32_t ckin, uint32_t cdir,
77-
uint32_t d0dir, uint32_t d123dir)
78-
{
79-
return begin(SD_DETECT_NONE, data0, data1, data2, data3, ck, cmd, ckin, cdir, d0dir, d123dir);
80-
}
81-
82-
#else
83-
bool SDClass::begin(uint32_t data0, uint32_t data1, uint32_t data2,
84-
uint32_t data3, uint32_t ck, uint32_t cmd)
85-
{
86-
return begin(SD_DETECT_NONE, data0, data1, data2, data3, ck, cmd);
87-
}
88-
#endif
89-
9059
/**
9160
* @brief Link SD, register the file system object to the FatFs mode and configure
9261
* relatives SD IOs including SD Detect Pin if any
9362
* @param detect: detect pin number (default SD_DETECT_NONE)
94-
* @param data0: data0 pin number (default SDX_D0)
95-
* @param data1: data1 pin number (default SDX_D1)
96-
* @param data2: data2 pin number (default SDX_D2)
97-
* @param data3: data3 pin number (default SDX_D3)
98-
* @param ck: ck pin number (default SDX_CK)
99-
* @param cmd: cmd pin number (default SDX_CMD)
100-
* @param ckin: ckin pin number only for SDMMC (default SDX_CKIN)
101-
* @param cdir: cdir pin number only for SDMMC (default SDX_CDIR)
102-
* @param d0dir: d0dir pin number only for SDMMC (default SDX_D0DIR)
103-
* @param d123dir: d123dir pin number only for SDMMC (default SDX_D123DIR)
10463
* @retval true or false
10564
*/
106-
#if defined(SDMMC1) || defined(SDMMC2)
107-
bool SDClass::begin(uint32_t detect, uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3,
108-
uint32_t ck, uint32_t cmd, uint32_t ckin, uint32_t cdir, uint32_t d0dir, uint32_t d123dir)
109-
#else
110-
bool SDClass::begin(uint32_t detect, uint32_t data0, uint32_t data1, uint32_t data2,
111-
uint32_t data3, uint32_t ck, uint32_t cmd)
112-
#endif
65+
bool SDClass::begin(uint32_t detect)
11366
{
114-
setDx(data0, data1, data2, data3);
115-
setCK(ck);
116-
setCMD(cmd);
117-
#if defined(SDMMC1) || defined(SDMMC2)
118-
setCKIN(ckin);
119-
setCDIR(cdir);
120-
setDxDIR(d0dir, d123dir);
121-
#endif
12267
/*##-1- Initializes SD IOs #############################################*/
12368
if (_card.init(detect)) {
12469
return _fatFs.init();

src/STM32SD.h

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -86,23 +86,10 @@ class SDClass {
8686

8787
public:
8888
/* Initialize the SD peripheral */
89-
#if defined(SDMMC1) || defined(SDMMC2)
90-
bool begin(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd,
91-
uint32_t ckin, uint32_t cdir, uint32_t d0dir, uint32_t d123dir
92-
);
93-
bool begin(uint32_t detect = SD_DETECT_NONE, uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1,
94-
uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CK, uint32_t cmd = SDX_CMD,
95-
uint32_t ckin = SDX_CKIN, uint32_t cdir = SDX_CDIR, uint32_t d0dir = SDX_D0DIR, uint32_t d123dir = SDX_D123DIR
96-
);
97-
#else
98-
bool begin(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd);
99-
bool begin(uint32_t detect = SD_DETECT_NONE, uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1,
100-
uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CMD, uint32_t cmd = SDX_CMD
101-
);
102-
#endif
89+
bool begin(uint32_t detect = SD_DETECT_NONE);
10390

10491
// set* have to be called before begin()
105-
void setDx(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3)
92+
void setDx(uint32_t data0, uint32_t data1 = PNUM_NOT_DEFINED, uint32_t data2 = PNUM_NOT_DEFINED, uint32_t data3 = PNUM_NOT_DEFINED)
10693
{
10794
_card.setDx(data0, data1, data2, data3);
10895
};
@@ -115,7 +102,7 @@ class SDClass {
115102
_card.setCMD(cmd);
116103
};
117104

118-
void setDx(PinName data0, PinName data1, PinName data2, PinName data3)
105+
void setDx(PinName data0, PinName data1 = NC, PinName data2 = NC, PinName data3 = NC)
119106
{
120107
_card.setDx(data0, data1, data2, data3);
121108
};

src/Sd2Card.cpp

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -37,35 +37,23 @@
3737
#include <Arduino.h>
3838
#include "Sd2Card.h"
3939

40-
#if defined(SDMMC1) || defined(SDMMC2)
41-
bool Sd2Card::init(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd,
42-
uint32_t ckin, uint32_t cdir, uint32_t d0dir, uint32_t d123dir)
43-
{
44-
return init(SD_DETECT_NONE, data0, data1, data2, data3, ck, cmd, ckin, cdir, d0dir, d123dir);
45-
}
46-
#else
47-
bool Sd2Card::init(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd)
40+
/**
41+
* @brief Default constructor. Use default pins definition.
42+
*/
43+
Sd2Card::Sd2Card()
4844
{
49-
return init(SD_DETECT_NONE, data0, data1, data2, data3, ck, cmd);
50-
}
51-
#endif
52-
45+
setDx(SDX_D0, SDX_D1, SDX_D2, SDX_D3);
46+
setCK(SDX_CK);
47+
setCMD(SDX_CMD);
5348
#if defined(SDMMC1) || defined(SDMMC2)
54-
bool Sd2Card::init(uint32_t detect, uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3,
55-
uint32_t ck, uint32_t cmd, uint32_t ckin, uint32_t cdir, uint32_t d0dir, uint32_t d123dir)
56-
#else
57-
bool Sd2Card::init(uint32_t detect, uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3,
58-
uint32_t ck, uint32_t cmd)
49+
setCKIN(SDX_CKIN);
50+
setCDIR(SDX_CDIR);
51+
setDxDIR(SDX_D0DIR, SDX_D123DIR);
5952
#endif
53+
}
54+
55+
bool Sd2Card::init(uint32_t detect)
6056
{
61-
setDx(data0, data1, data2, data3);
62-
setCK(ck);
63-
setCMD(cmd);
64-
#if defined(SDMMC1) || defined(SDMMC2)
65-
setCKIN(ckin);
66-
setCDIR(cdir);
67-
setDxDIR(d0dir, d123dir);
68-
#endif
6957
if (detect != SD_DETECT_NONE) {
7058
PinName p = digitalPinToPinName(detect);
7159
if ((p == NC) || \

src/Sd2Card.h

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,23 +52,12 @@
5252

5353
class Sd2Card {
5454
public:
55-
#if defined(SDMMC1) || defined(SDMMC2)
56-
bool init(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd,
57-
uint32_t ckin, uint32_t cdir, uint32_t d0dir, uint32_t d123dir
58-
);
59-
bool init(uint32_t detect = SD_DETECT_NONE, uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1,
60-
uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CK, uint32_t cmd = SDX_CMD,
61-
uint32_t ckin = SDX_CKIN, uint32_t cdir = SDX_CDIR, uint32_t d0dir = SDX_D0DIR, uint32_t d123dir = SDX_D123DIR
62-
);
63-
#else
64-
bool init(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3, uint32_t ck, uint32_t cmd);
65-
bool init(uint32_t detect = SD_DETECT_NONE, uint32_t data0 = SDX_D0, uint32_t data1 = SDX_D1,
66-
uint32_t data2 = SDX_D2, uint32_t data3 = SDX_D3, uint32_t ck = SDX_CK, uint32_t cmd = SDX_CMD
67-
);
68-
#endif
55+
Sd2Card();
56+
57+
bool init(uint32_t detect = SD_DETECT_NONE);
6958

7059
// set* have to be called before init()
71-
void setDx(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3)
60+
void setDx(uint32_t data0, uint32_t data1 = PNUM_NOT_DEFINED, uint32_t data2 = PNUM_NOT_DEFINED, uint32_t data3 = PNUM_NOT_DEFINED)
7261
{
7362
SD_PinNames.pin_d0 = digitalPinToPinName(data0);
7463
SD_PinNames.pin_d1 = digitalPinToPinName(data1);
@@ -84,7 +73,7 @@ class Sd2Card {
8473
SD_PinNames.pin_cmd = digitalPinToPinName(cmd);
8574
};
8675

87-
void setDx(PinName data0, PinName data1, PinName data2, PinName data3)
76+
void setDx(PinName data0, PinName data1 = NC, PinName data2 = NC, PinName data3 = NC)
8877
{
8978
SD_PinNames.pin_d0 = data0;
9079
SD_PinNames.pin_d1 = data1;

src/bsp_sd.c

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,31 +145,44 @@ uint8_t BSP_SD_GetInstance(void)
145145
SD_TypeDef *sd_cmd = NP;
146146
SD_TypeDef *sd_ck = NP;
147147

148+
/* If a pin is not defined, use the first pin available in the associated PinMap_SD_* arrays */
148149
if (SD_PinNames.pin_d0 == NC) {
149-
/* No pin defined assume to use first pin available in each PinMap_SD_* arrays */
150150
SD_PinNames.pin_d0 = PinMap_SD_DATA0[0].pin;
151151
#if SD_BUS_WIDE == SD_BUS_WIDE_4B
152152
SD_PinNames.pin_d1 = PinMap_SD_DATA1[0].pin;
153153
SD_PinNames.pin_d2 = PinMap_SD_DATA2[0].pin;
154154
SD_PinNames.pin_d3 = PinMap_SD_DATA3[0].pin;
155155
#endif
156+
}
157+
if (SD_PinNames.pin_cmd == NC) {
156158
SD_PinNames.pin_cmd = PinMap_SD_CMD[0].pin;
159+
}
160+
if (SD_PinNames.pin_ck == NC) {
157161
SD_PinNames.pin_ck = PinMap_SD_CK[0].pin;
162+
}
158163
#if defined(SDMMC1) || defined(SDMMC2)
159164
#if !defined(SDMMC_CKIN_NA)
165+
if (SD_PinNames.pin_ckin == NC) {
160166
SD_PinNames.pin_ckin = PinMap_SD_CKIN[0].pin;
167+
}
161168
#endif
162169
#if !defined(SDMMC_CDIR_NA)
170+
if (SD_PinNames.pin_cdir == NC) {
163171
SD_PinNames.pin_cdir = PinMap_SD_CDIR[0].pin;
172+
}
164173
#endif
165174
#if !defined(SDMMC_D0DIR_NA)
175+
if (SD_PinNames.pin_d0dir == NC) {
166176
SD_PinNames.pin_d0dir = PinMap_SD_D0DIR[0].pin;
177+
}
167178
#endif
168179
#if !defined(SDMMC_D123DIR_NA)
180+
if (SD_PinNames.pin_d123dir == NC) {
169181
SD_PinNames.pin_d123dir = PinMap_SD_D123DIR[0].pin;
182+
}
170183
#endif
171184
#endif /* SDMMC1 || SDMMC2 */
172-
}
185+
173186
/* Get SD instance from pins */
174187
sd_d0 = pinmap_peripheral(SD_PinNames.pin_d0, PinMap_SD_DATA0);
175188
#if SD_BUS_WIDE == SD_BUS_WIDE_4B

src/bsp_sd.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -115,35 +115,35 @@ Please update the core or install previous library version."
115115

116116
/* Default SDx pins definitions */
117117
#ifndef SDX_D0
118-
#define SDX_D0 NUM_DIGITAL_PINS
118+
#define SDX_D0 PNUM_NOT_DEFINED
119119
#endif
120120
#ifndef SDX_D1
121-
#define SDX_D1 NUM_DIGITAL_PINS
121+
#define SDX_D1 PNUM_NOT_DEFINED
122122
#endif
123123
#ifndef SDX_D2
124-
#define SDX_D2 NUM_DIGITAL_PINS
124+
#define SDX_D2 PNUM_NOT_DEFINED
125125
#endif
126126
#ifndef SDX_D3
127-
#define SDX_D3 NUM_DIGITAL_PINS
127+
#define SDX_D3 PNUM_NOT_DEFINED
128128
#endif
129129
#ifndef SDX_CMD
130-
#define SDX_CMD NUM_DIGITAL_PINS
130+
#define SDX_CMD PNUM_NOT_DEFINED
131131
#endif
132132
#ifndef SDX_CK
133-
#define SDX_CK NUM_DIGITAL_PINS
133+
#define SDX_CK PNUM_NOT_DEFINED
134134
#endif
135135
#if defined(SDMMC1) || defined(SDMMC2)
136136
#ifndef SDX_CKIN
137-
#define SDX_CKIN NUM_DIGITAL_PINS
137+
#define SDX_CKIN PNUM_NOT_DEFINED
138138
#endif
139139
#ifndef SDX_CDIR
140-
#define SDX_CDIR NUM_DIGITAL_PINS
140+
#define SDX_CDIR PNUM_NOT_DEFINED
141141
#endif
142142
#ifndef SDX_D0DIR
143-
#define SDX_D0DIR NUM_DIGITAL_PINS
143+
#define SDX_D0DIR PNUM_NOT_DEFINED
144144
#endif
145145
#ifndef SDX_D123DIR
146-
#define SDX_D123DIR NUM_DIGITAL_PINS
146+
#define SDX_D123DIR PNUM_NOT_DEFINED
147147
#endif
148148
#endif /* SDMMC1 || SDMMC2 */
149149

0 commit comments

Comments
 (0)