Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 57 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,69 @@
# MX25R6435F
Arduino library to support the Quad-SPI NOR Flash memory MX25R6435F
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.

## API

The library provides the following API:

* begin()
* end()
* write()
* read()
* mapped()
* erase()
* eraseChip()
* eraseSector()
* suspendErase()
* resumeErase()
* sleep()
* wakeup()
* status()
* info()
* length()
* `begin()`
* `end()`
* `write()`
* `read()`
* `mapped()`
* `erase()`
* `eraseChip()`
* `eraseSector()`
* `suspendErase()`
* `resumeErase()`
* `sleep()`
* `wakeup()`
* `status()`
* `info()`
* `length()`

Since library version 2.0.0, xSPI pins can be defined at sketch level, using:

* To redefine the default one before call of `begin()`:

* `setDx(uint32_t data0, uint32_t data1, uint32_t data2, uint32_t data3)`
* `setDx(PinName data0, PinName data1, PinName data2, PinName data3)`
* `setSSEL(uint32_t ssel)`
* `setSSEL(PinName ssel)`
* `setSCLK(uint32_t sclk)`
* `setSCLK(PinName sclk)`

*Code snippet:*
```C++
MX25R6435F.setDx(PE12, PE13, PE14, PE15); // using pin number
MX25R6435F.setSCLK(PE10);
MX25R6435F.setSSEL(PE_11); // using PinName
MX25R6435F.begin();
```

* or using the `begin()` method:

* `MX25R6435FClass(uint8_t data0, uint8_t data1, uint8_t data2, uint8_t data3, uint8_t clk, uint8_t ssel)`

*Code snippet:*
```C++
MX25R6435F.begin(PE12, PE13, PE14, PE15, PE10, PE11);
```

* 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)):

* `MX25R6435F_D0`
* `MX25R6435F_D1`
* `MX25R6435F_D2`
* `MX25R6435F_D3`
* `MX25R6435F_SCLK`
* `MX25R6435F_SSEL`

## Examples

3 sketches provide basic examples to show how to use the library API.
demo.ino uses basic read/write functions.
eraseChip.ino erases all data present in the memory.
memoryMappedMode.ino shows how to use the mapped mode.
3 sketches provide basic examples to show how to use the library API:
* `demo.ino` uses basic read/write functions.
* `eraseChip.ino` erases all data present in the memory.
* `memoryMappedMode.ino` shows how to use the mapped mode.

## Documentation

Expand Down
3 changes: 3 additions & 0 deletions keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ wakeup KEYWORD2
status KEYWORD2
info KEYWORD2
length KEYWORD2
setDx KEYWORD2
setSCLK KEYWORD2
setSSEL KEYWORD2

#######################################
# Constants (LITERAL1)
Expand Down
108 changes: 55 additions & 53 deletions src/MX25R6435F.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,29 +9,13 @@
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
* <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
Expand All @@ -42,18 +26,25 @@ MX25R6435FClass MX25R6435F;

MX25R6435FClass::MX25R6435FClass(): initDone(0)
{

}

void MX25R6435FClass::begin(void)
void MX25R6435FClass::begin(uint8_t data0, uint8_t data1, uint8_t data2, uint8_t data3, uint8_t sclk, uint8_t ssel)
{
if(BSP_QSPI_Init() == MEMORY_OK)
_qspi.pin_d0 = digitalPinToPinName(data0);
_qspi.pin_d1 = digitalPinToPinName(data1);
_qspi.pin_d2 = digitalPinToPinName(data2);
_qspi.pin_d3 = digitalPinToPinName(data3);
_qspi.pin_sclk = digitalPinToPinName(sclk);
_qspi.pin_ssel = digitalPinToPinName(ssel);

if (BSP_QSPI_Init(&_qspi) == MEMORY_OK) {
initDone = 1;
}
}

void MX25R6435FClass::end(void)
{
BSP_QSPI_DeInit();
BSP_QSPI_DeInit(&_qspi);
initDone = 0;
}

Expand All @@ -64,11 +55,13 @@ uint32_t MX25R6435FClass::write(uint8_t data, uint32_t addr)

uint32_t MX25R6435FClass::write(uint8_t *pData, uint32_t addr, uint32_t size)
{
if((pData == NULL) || (initDone == 0))
if ((pData == NULL) || (initDone == 0)) {
return 0;
}

if(BSP_QSPI_Write(pData, addr, size) != MEMORY_OK)
if (BSP_QSPI_Write(&_qspi, pData, addr, size) != MEMORY_OK) {
return 0;
}

return size;
}
Expand All @@ -84,77 +77,86 @@ uint8_t MX25R6435FClass::read(uint32_t addr)

void MX25R6435FClass::read(uint8_t *pData, uint32_t addr, uint32_t size)
{
if((pData != NULL) && (initDone == 1))
BSP_QSPI_Read(pData, addr, size);
if ((pData != NULL) && (initDone == 1)) {
BSP_QSPI_Read(&_qspi, pData, addr, size);
}
}

uint8_t *MX25R6435FClass::mapped(void)
{
if(BSP_QSPI_EnableMemoryMappedMode() != MEMORY_OK)
if (BSP_QSPI_EnableMemoryMappedMode(&_qspi) != MEMORY_OK) {
return NULL;
}

return (uint8_t *)MEMORY_MAPPED_ADDRESS;
}

uint8_t MX25R6435FClass::erase(uint32_t addr)
{
if(initDone == 0)
if (initDone == 0) {
return MEMORY_ERROR;
}

return BSP_QSPI_Erase_Block(addr);
return BSP_QSPI_Erase_Block(&_qspi, addr);
}

uint8_t MX25R6435FClass::eraseChip(void)
{
if(initDone == 0)
if (initDone == 0) {
return MEMORY_ERROR;
}

return BSP_QSPI_Erase_Chip();
return BSP_QSPI_Erase_Chip(&_qspi);
}

uint8_t MX25R6435FClass::eraseSector(uint32_t sector)
{
if(initDone == 0)
if (initDone == 0) {
return MEMORY_ERROR;
}

return BSP_QSPI_Erase_Sector(sector);
return BSP_QSPI_Erase_Sector(&_qspi, sector);
}

uint8_t MX25R6435FClass::suspendErase(void)
{
if(initDone == 0)
if (initDone == 0) {
return MEMORY_ERROR;
}

return BSP_QSPI_SuspendErase();
return BSP_QSPI_SuspendErase(&_qspi);
}

uint8_t MX25R6435FClass::resumeErase(void)
{
if(initDone == 0)
if (initDone == 0) {
return MEMORY_ERROR;
}

return BSP_QSPI_ResumeErase();
return BSP_QSPI_ResumeErase(&_qspi);
}

uint8_t MX25R6435FClass::sleep(void)
{
if(initDone == 0)
if (initDone == 0) {
return MEMORY_ERROR;
}

return BSP_QSPI_EnterDeepPowerDown();
return BSP_QSPI_EnterDeepPowerDown(&_qspi);
}

uint8_t MX25R6435FClass::wakeup(void)
{
if(initDone == 0)
if (initDone == 0) {
return MEMORY_ERROR;
}

return BSP_QSPI_LeaveDeepPowerDown();
return BSP_QSPI_LeaveDeepPowerDown(&_qspi);
}

uint8_t MX25R6435FClass::status(void)
{
return BSP_QSPI_GetStatus();
return BSP_QSPI_GetStatus(&_qspi);
}

uint32_t MX25R6435FClass::info(memory_info_t info)
Expand All @@ -164,30 +166,30 @@ uint32_t MX25R6435FClass::info(memory_info_t info)

BSP_QSPI_GetInfo(&pInfo);

switch(info){
switch (info) {
case MEMORY_SIZE:
res = pInfo.FlashSize;
break;
break;

case MEMORY_SECTOR_SIZE:
res = pInfo.EraseSectorSize;
break;
break;

case MEMORY_SECTOR_NUMBER:
res = pInfo.EraseSectorsNumber;
break;
break;

case MEMORY_PAGE_SIZE:
res = pInfo.ProgPageSize;
break;
break;

case MEMORY_PAGE_NUMBER:
res = pInfo.ProgPagesNumber;
break;
break;

default:
res = 0;
break;
break;
}

return res;
Expand Down
Loading