Skip to content

Commit 3112b29

Browse files
committed
Add capabilities to redefine QSPI pins
Signed-off-by: Frederic Pillon <frederic.pillon@st.com>
1 parent 94ec36d commit 3112b29

File tree

6 files changed

+496
-383
lines changed

6 files changed

+496
-383
lines changed

README.md

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,69 @@
11
# MX25R6435F
2-
Arduino library to support the Quad-SPI NOR Flash memory MX25R6435F
2+
Arduino library to support the Quad-SPI NOR Flash memory MX25R6435F using the Quad SPI flash memories interface. Since library version 2.0.0 and [STM32 core](https://github.com/stm32duino/Arduino_Core_STM32) version 2.0.0 the OctoSPI Flash memories interface can also be used.
33

44
## API
55

66
The library provides the following API:
77

8-
* begin()
9-
* end()
10-
* write()
11-
* read()
12-
* mapped()
13-
* erase()
14-
* eraseChip()
15-
* eraseSector()
16-
* suspendErase()
17-
* resumeErase()
18-
* sleep()
19-
* wakeup()
20-
* status()
21-
* info()
22-
* length()
8+
* `begin()`
9+
* `end()`
10+
* `write()`
11+
* `read()`
12+
* `mapped()`
13+
* `erase()`
14+
* `eraseChip()`
15+
* `eraseSector()`
16+
* `suspendErase()`
17+
* `resumeErase()`
18+
* `sleep()`
19+
* `wakeup()`
20+
* `status()`
21+
* `info()`
22+
* `length()`
23+
24+
Since library version 2.0.0, xSPI pins can be defined at sketch level, using:
25+
26+
* To redefine the default one before call of `begin()`:
27+
28+
* `setDx(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3)`
29+
* `setDx(PinName data0, PinName data1, PinName data2, PinName data3)`
30+
* `setSSEL(uint32_t ssel)`
31+
* `setSSEL(PinName ssel)`
32+
* `setSCLK(uint32_t sclk)`
33+
* `setSCLK(PinName sclk)`
34+
35+
*Code snippet:*
36+
```C++
37+
MX25R6435F.setDx(PE12, PE13, PE14, PE15); // using pin number
38+
MX25R6435F.setSCLK(PE10);
39+
MX25R6435F.setSSEL(PE_11); // using PinName
40+
MX25R6435F.begin();
41+
```
42+
43+
* or using the `begin()` method:
44+
45+
* `MX25R6435FClass(uint8_t data0, uint8_t data1, uint8_t data2, uint8_t data3, uint8_t clk, uint8_t ssel)`
46+
47+
*Code snippet:*
48+
```C++
49+
MX25R6435F.begin(PE12, PE13, PE14, PE15, PE10, PE11);
50+
```
51+
52+
* or by redefining the default pins definition (using [build_opt.h](https://github.com/stm32duino/wiki/wiki/Customize-build-options-using-build_opt.h) or [hal_conf_extra.h](https://github.com/stm32duino/wiki/wiki/HAL-configuration#customize-hal-or-variant-definition)):
53+
54+
* `MX25R6435F_D0`
55+
* `MX25R6435F_D1`
56+
* `MX25R6435F_D2`
57+
* `MX25R6435F_D3`
58+
* `MX25R6435F_SCLK`
59+
* `MX25R6435F_SSEL`
2360

2461
## Examples
2562

26-
3 sketches provide basic examples to show how to use the library API.
27-
demo.ino uses basic read/write functions.
28-
eraseChip.ino erases all data present in the memory.
29-
memoryMappedMode.ino shows how to use the mapped mode.
63+
3 sketches provide basic examples to show how to use the library API:
64+
* `demo.ino` uses basic read/write functions.
65+
* `eraseChip.ino` erases all data present in the memory.
66+
* `memoryMappedMode.ino` shows how to use the mapped mode.
3067

3168
## Documentation
3269

keywords.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ wakeup KEYWORD2
2626
status KEYWORD2
2727
info KEYWORD2
2828
length KEYWORD2
29+
setDx KEYWORD2
30+
setSCLK KEYWORD2
31+
setSSEL KEYWORD2
2932

3033
#######################################
3134
# Constants (LITERAL1)

src/MX25R6435F.cpp

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,24 @@ MX25R6435FClass MX25R6435F;
4242

4343
MX25R6435FClass::MX25R6435FClass(): initDone(0)
4444
{
45-
4645
}
4746

48-
void MX25R6435FClass::begin(void)
47+
void MX25R6435FClass::begin(uint8_t data0, uint8_t data1, uint8_t data2, uint8_t data3, uint8_t sclk, uint8_t ssel)
4948
{
50-
if(BSP_QSPI_Init() == MEMORY_OK)
49+
_qspi.pin_d0 = digitalPinToPinName(data0);
50+
_qspi.pin_d1 = digitalPinToPinName(data1);
51+
_qspi.pin_d2 = digitalPinToPinName(data2);
52+
_qspi.pin_d3 = digitalPinToPinName(data3);
53+
_qspi.pin_sclk = digitalPinToPinName(sclk);
54+
_qspi.pin_ssel = digitalPinToPinName(ssel);
55+
56+
if (BSP_QSPI_Init(&_qspi) == MEMORY_OK) {
5157
initDone = 1;
5258
}
5359

5460
void MX25R6435FClass::end(void)
5561
{
56-
BSP_QSPI_DeInit();
62+
BSP_QSPI_DeInit(&_qspi);
5763
initDone = 0;
5864
}
5965

@@ -67,7 +73,7 @@ uint32_t MX25R6435FClass::write(uint8_t *pData, uint32_t addr, uint32_t size)
6773
if((pData == NULL) || (initDone == 0))
6874
return 0;
6975

70-
if(BSP_QSPI_Write(pData, addr, size) != MEMORY_OK)
76+
if(BSP_QSPI_Write(&_qspi, pData, addr, size) != MEMORY_OK)
7177
return 0;
7278

7379
return size;
@@ -85,12 +91,12 @@ uint8_t MX25R6435FClass::read(uint32_t addr)
8591
void MX25R6435FClass::read(uint8_t *pData, uint32_t addr, uint32_t size)
8692
{
8793
if((pData != NULL) && (initDone == 1))
88-
BSP_QSPI_Read(pData, addr, size);
94+
BSP_QSPI_Read(&_qspi, pData, addr, size);
8995
}
9096

9197
uint8_t *MX25R6435FClass::mapped(void)
9298
{
93-
if(BSP_QSPI_EnableMemoryMappedMode() != MEMORY_OK)
99+
if(BSP_QSPI_EnableMemoryMappedMode(&_qspi) != MEMORY_OK)
94100
return NULL;
95101

96102
return (uint8_t *)MEMORY_MAPPED_ADDRESS;
@@ -101,60 +107,60 @@ uint8_t MX25R6435FClass::erase(uint32_t addr)
101107
if(initDone == 0)
102108
return MEMORY_ERROR;
103109

104-
return BSP_QSPI_Erase_Block(addr);
110+
return BSP_QSPI_Erase_Block(&_qspi, addr);
105111
}
106112

107113
uint8_t MX25R6435FClass::eraseChip(void)
108114
{
109115
if(initDone == 0)
110116
return MEMORY_ERROR;
111117

112-
return BSP_QSPI_Erase_Chip();
118+
return BSP_QSPI_Erase_Chip(&_qspi);
113119
}
114120

115121
uint8_t MX25R6435FClass::eraseSector(uint32_t sector)
116122
{
117123
if(initDone == 0)
118124
return MEMORY_ERROR;
119125

120-
return BSP_QSPI_Erase_Sector(sector);
126+
return BSP_QSPI_Erase_Sector(&_qspi, sector);
121127
}
122128

123129
uint8_t MX25R6435FClass::suspendErase(void)
124130
{
125131
if(initDone == 0)
126132
return MEMORY_ERROR;
127133

128-
return BSP_QSPI_SuspendErase();
134+
return BSP_QSPI_SuspendErase(&_qspi);
129135
}
130136

131137
uint8_t MX25R6435FClass::resumeErase(void)
132138
{
133139
if(initDone == 0)
134140
return MEMORY_ERROR;
135141

136-
return BSP_QSPI_ResumeErase();
142+
return BSP_QSPI_ResumeErase(&_qspi);
137143
}
138144

139145
uint8_t MX25R6435FClass::sleep(void)
140146
{
141147
if(initDone == 0)
142148
return MEMORY_ERROR;
143149

144-
return BSP_QSPI_EnterDeepPowerDown();
150+
return BSP_QSPI_EnterDeepPowerDown(&_qspi);
145151
}
146152

147153
uint8_t MX25R6435FClass::wakeup(void)
148154
{
149155
if(initDone == 0)
150156
return MEMORY_ERROR;
151157

152-
return BSP_QSPI_LeaveDeepPowerDown();
158+
return BSP_QSPI_LeaveDeepPowerDown(&_qspi);
153159
}
154160

155161
uint8_t MX25R6435FClass::status(void)
156162
{
157-
return BSP_QSPI_GetStatus();
163+
return BSP_QSPI_GetStatus(&_qspi);
158164
}
159165

160166
uint32_t MX25R6435FClass::info(memory_info_t info)

src/MX25R6435F.h

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,28 @@
3939
#ifndef _MX25R6435F_H_
4040
#define _MX25R6435F_H_
4141

42+
#include "Arduino.h"
4243
#include "mx25r6435f_driver.h"
4344

45+
#ifndef MX25R6435F_D0
46+
#define MX25R6435F_D0 NC
47+
#endif
48+
#ifndef MX25R6435F_D1
49+
#define MX25R6435F_D1 NC
50+
#endif
51+
#ifndef MX25R6435F_D2
52+
#define MX25R6435F_D2 NC
53+
#endif
54+
#ifndef MX25R6435F_D3
55+
#define MX25R6435F_D3 NC
56+
#endif
57+
#ifndef MX25R6435F_SCLK
58+
#define MX25R6435F_SCLK NC
59+
#endif
60+
#ifndef MX25R6435F_SSEL
61+
#define MX25R6435F_SSEL NC
62+
#endif
63+
4464
/* Memory configuration paremeters */
4565
typedef enum {
4666
MEMORY_SIZE,
@@ -65,8 +85,41 @@ class MX25R6435FClass
6585
public:
6686
MX25R6435FClass();
6787

88+
// setDx/SCLK/SSEL have to be called before begin()
89+
void setDx(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3)
90+
{
91+
_qspi.pin_d0 = digitalPinToPinName(data0);
92+
_qspi.pin_d1 = digitalPinToPinName(data1);
93+
_qspi.pin_d2 = digitalPinToPinName(data2);
94+
_qspi.pin_d3 = digitalPinToPinName(data3);
95+
};
96+
void setSCLK(uint32_t sclk)
97+
{
98+
_qspi.pin_sclk = digitalPinToPinName(sclk);
99+
};
100+
void setSSEL(uint32_t ssel)
101+
{
102+
_qspi.pin_ssel = digitalPinToPinName(ssel);
103+
};
104+
105+
void setDx(PinName data0, PinName data1, PinName data2, PinName data3)
106+
{
107+
_qspi.pin_d0 = (data0);
108+
_qspi.pin_d1 = (data1);
109+
_qspi.pin_d2 = (data2);
110+
_qspi.pin_d3 = (data3);
111+
};
112+
void setSCLK(PinName sclk)
113+
{
114+
_qspi.pin_sclk = (sclk);
115+
};
116+
void setSSEL(PinName ssel)
117+
{
118+
_qspi.pin_ssel = (ssel);
119+
};
120+
68121
/* Initializes the memory interface. */
69-
void begin(void);
122+
void begin(uint8_t data0 = MX25R6435F_D0, uint8_t data1 = MX25R6435F_D1, uint8_t data2 = MX25R6435F_D2, uint8_t data3 = MX25R6435F_D3, uint8_t sclk = MX25R6435F_SCLK, uint8_t ssel = MX25R6435F_SSEL);
70123

71124
/* De-Initializes the memory interface. */
72125
void end(void);
@@ -174,6 +227,7 @@ class MX25R6435FClass
174227

175228
private:
176229
uint8_t initDone;
230+
QSPI_t _qspi;
177231
};
178232

179233
extern MX25R6435FClass MX25R6435F;

0 commit comments

Comments
 (0)