Go Down

Topic: SPIMemory library - Formerly SPIFlash - now supports SPI FRAM as well! :) (Read 71261 times) previous topic - next topic

amirezz

hello thanks for your great work

are that library support  sst25vf010a or LE25U40CMDTWG   cause those are the parts i have

i also try to use sst25vf010a but it return 00h as chip id and manufacture id

thanks in advance

zhliao

hello @Marzogh.

Im having some issues with the SPImemory library, specifically it doesn't work for the writing operations.

Hardware:
Arduino UNO
W25Q80BV

Wiring:
1cs    ----> pin10
2DO   ----> MISO
3WP   ----> 3.3v
4GND  ----> GND
5DI     ----> MOSI
6CLK   ----> SCK
7HOLD ----> 3.3v
8VCC   ----> 3.3v

I interfaced the Arduino and Flash using the level shifter.
 and FlashDiagnostics line 40 has been changed to:
     SPIFlash flash(10);

The library version 3.2.1 and 3.2.0 both do not work.


Any help is appreciated.

The output is below



Code: [Select]
Initialising..........

SPIMemory Library version: 3.2.1

JEDEC ID: 0xEF4014
Man ID: 0xEF
Memory ID: 0x40
Capacity: 1048576
Max Pages: 4294967295
Unique ID: 2815588997737984, 0x60A88003660B2E00
-----------------------------------------------------------------------------------------------------------------------------
Testing library code
-----------------------------------------------------------------------------------------------------------------------------
Function Test result      Runtime
-----------------------------------------------------------------------------------------------------------------------------
Power Down    FAIL Not all chips support power down. Check your datasheet.
Power Up    PASS       0 us

Erase Chip    PASS       0 us
Erase 72KB    PASS       0 us
Erase 64KB    PASS       0 us
Erase 32KB    PASS       0 us
Erase 4KB    PASS       0 us
-----------------------------------------------------------------------------------------------------------------------------
Data type I/O Result       Write time       Read time
-----------------------------------------------------------------------------------------------------------------------------
Byte    FAIL       0 us
Char    FAIL       0 us
Word    FAIL       0 us
Short    FAIL       0 us
ULong    FAIL       0 us
Long    FAIL       0 us
Float    FAIL       0 us
Struct    FAIL       0 us
Byte Array    FAIL 1,    FAIL 2,    FAIL 3,    FAIL 4,    FAIL 5,    FAIL 6,    FAIL 7,    FAIL 8,    FAIL 9,    FAIL 10,    FAIL 11,    FAIL 12,    FAIL 13,    FAIL 14,    FAIL 15,    FAIL 16,    FAIL 17,    FAIL 18,    FAIL 19,    FAIL 20,    FAIL 21,    FAIL 22,    FAIL 23,    FAIL 24,    FAIL 25,    FAIL 26,    FAIL 27,    FAIL 28,    FAIL 29,    FAIL 30,    FAIL 31,    FAIL 32,    FAIL 33,    FAIL 34,    FAIL 35,    FAIL 36,    FAIL 37,    FAIL 38,    FAIL 39,    FAIL 40,    FAIL 41,    FAIL 42,    FAIL 43,    FAIL 44,    FAIL 45,    FAIL 46,    FAIL 47,    FAIL 48,    FAIL 49,    FAIL 50,    FAIL 51,    FAIL 52,    FAIL 53,    FAIL 54,    FAIL 55,    FAIL 56,    FAIL 57,    FAIL 58,    FAIL 59,    FAIL 60,    FAIL 61,    FAIL 62,    FAIL 63,    FAIL 64,    FAIL 65,    FAIL 66,    FAIL 67,    FAIL 68,    FAIL 69,    FAIL 70,    FAIL 71,    FAIL 72,    FAIL 73,    FAIL 74,    FAIL 75,    FAIL 76,    FAIL 77,    FAIL 78,    FAIL 79,    FAIL 80,    FAIL 81,    FAIL 82,    FAIL 83,    FAIL 84,    FAIL 85,    FAIL 86,    FAIL 87,    FAIL 88,    FAIL 89,    FAIL 90,    FAIL 91,    FAIL 92,    FAIL 93,    FAIL 94,    FAIL 95,    FAIL 96,    FAIL 97,    FAIL 98,    FAIL 99,    FAIL 100,    FAIL 101,    FAIL 102,    FAIL 103,    FAIL 104,    FAIL 105,    FAIL 106,    FAIL 107,    FAIL 108,    FAIL 109,    FAIL 110,    FAIL 111,    FAIL 112,    FAIL 113,    FAIL 114,    FAIL 115,    FAIL 116,    FAIL 117,    FAIL 118,    FAIL 119,    FAIL 120,    FAIL 121,    FAIL 122,    FAIL 123,    FAIL 124,    FAIL 125,    FAIL 126,    FAIL 127,    FAIL 128,    FAIL 129,    FAIL 130,    FAIL 131,    FAIL 132,    FAIL 133,    FAIL 134,    FAIL 135,    FAIL 136,    FAIL 137,    FAIL 138,    FAIL 139,    FAIL 140,    FAIL 141,    FAIL 142,    FAIL 143,    FAIL 144,    FAIL 145,    FAIL 146,    FAIL 147,    FAIL 148,    FAIL 149,    FAIL 150,    FAIL 151,    FAIL 152,    FAIL 153,    FAIL 154,    FAIL 155,    FAIL 156,    FAIL 157,    FAIL 158,    FAIL 159,    FAIL 160,    FAIL 161,    FAIL 162,    FAIL 163,    FAIL 164,    FAIL 165,    FAIL 166,    FAIL 167,    FAIL 168,    FAIL 169,    FAIL 170,    FAIL 171,    FAIL 172,    FAIL 173,    FAIL 174,    FAIL 175,    FAIL 176,    FAIL 177,    FAIL 178,    FAIL 179,    FAIL 180,    FAIL 181,    FAIL 182,    FAIL 183,    FAIL 184,    FAIL 185,    FAIL 186,    FAIL 187,    FAIL 188,    FAIL 189,    FAIL 190,    FAIL 191,    FAIL 192,    FAIL 193,    FAIL 194,    FAIL 195,    FAIL 196,    FAIL 197,    FAIL 198,    FAIL 199,    FAIL 200,    FAIL 201,    FAIL 202,    FAIL 203,    FAIL 204,    FAIL 205,    FAIL 206,    FAIL 207,    FAIL 208,    FAIL 209,    FAIL 210,    FAIL 211,    FAIL 212,    FAIL 213,    FAIL 214,    FAIL 215,    FAIL 216,    FAIL 217,    FAIL 218,    FAIL 219,    FAIL 220,    FAIL 221,    FAIL 222,    FAIL 223,    FAIL 224,    FAIL 225,    FAIL 226,    FAIL 227,    FAIL 228,    FAIL 229,    FAIL 230,    FAIL 231,    FAIL 232,    FAIL 233,    FAIL 234,    FAIL 235,    FAIL 236,    FAIL 237,    FAIL 238,    FAIL 239,    FAIL 240,    FAIL 241,    FAIL 242,    FAIL 243,    FAIL 244,    FAIL 245,    FAIL 246,    FAIL 247,    FAIL 248,    FAIL 249,    FAIL 250,    FAIL 251,    FAIL 252,    FAIL 253,    FAIL 254,    FAIL 255,    PASS       0 us
String    FAIL       0 us
-----------------------------------------------------------------------------------------------------------------------------
To see function runtimes ncomment RUNDIAGNOSTIC in SPIMemory.h.

ruslan_x3m

Hi, Im using ESP8266, then executing flash.begin() and without spi flash connected ... >> getting WDT reset. I cant add delay(0) ... is in your library ...

... with spi flash inserted (connected) - all ok.

Code: [Select]

  ESP.wdtDisable();
  ESP.wdtFeed();

  if (!flash.begin()) {
    Serial.println(flash.error(VERBOSE));
  }

  ESP.wdtEnable(1000);


same with wdtDisable() after ~10 seconds  WDT reset .... your library stack in infinite loop on flash.begin()  .... any help ?



OK ... find the bug, in defines.h change  ... for esp8266 BUSY_TIMEOUT set ~2 seconds (was 1000 seconds)

Code: [Select]
// #define BUSY_TIMEOUT  1000000000L
#if defined (ARDUINO_ARCH_ESP8266)
#define BUSY_TIMEOUT  2000000L
#else
#define BUSY_TIMEOUT  1000000000L
#endif


... now work ok




and may be in this code must be done some fixes:

Code: [Select]
// Polls the status register 1 until busy flag is cleared or timeout
 bool SPIFlash::_notBusy(uint32_t timeout) {
   _delay_us(WINBOND_WRITE_DELAY);
   uint32_t _time = micros();

   do {
     #if defined (ARDUINO_ARCH_ESP8266)
     delay(0);
     #endif
     _readStat1();
     if (!(stat1 & BUSY))
     {
       return true;
     }

   } while ((micros() - _time) < timeout);
   if (timeout <= (micros() - _time)) {
     _troubleshoot(CHIPBUSY);
     return false;
   }
   return true;
 }



change code >

do {
    #if defined (ARDUINO_ARCH_ESP8266)
     delay(0);
     #endif

     _readStat1();





same with cheapErase() fix

Code: [Select]
//Erases whole chip. Think twice before using.
bool SPIFlash::eraseChip(void) {
  #ifdef RUNDIAGNOSTIC
    _spifuncruntime = micros();
  #endif
 if(_isChipPoweredDown() || !_notBusy() || !_writeEnable()) {
    return false;
  }

 _beginSPI(chipErase.opcode);
  _endSPI();

 while(_readStat1() & BUSY) {
  #if defined (ARDUINO_ARCH_ESP8266)
     delay(0);
  #endif
    //_delay_us(30000L);
  }
  _endSPI();

  #ifdef RUNDIAGNOSTIC
    _spifuncruntime = micros() - _spifuncruntime;
  #endif
 return true;

}

Marzogh


Just pushed an update through to v3.3.0 with the following changes:

- The SPIMemory now supports SPI FRAM (one chip for now, but the list is going to grow.  :) )

Bugs squashed:
- Fixed a major bug causing issues with page boundaries in writeAnything and writeStr. Thanks for your help @jacky4566 (Issue #151)
- Fixed a major bug with reading Strings (Issue #143)
- Fixes a bug by initialising the SPIBusState to false
- Fixes bug that causes ballooning of pagesize when SFDP is not read. This is because no default _pageSize value was set in this scenario. This has now been fixed.
- Fixes a major bug in how SFDP data is used to calculate chip capacity. The previous version of the library returned a wrong value. This has now been fixed. Refer to comments in _getSFDPFlashParam(void) for further details.

Enhancements:

- Reduce SRAM footprint when running Diagnostics.ino. Thanks @rambo (PR #157)
- Officially supports the ESP32 (tested on the ESP32 Feather)
- Now supports FRAM memory chips via the SPIFram constructor
- Changed Diagnostics output in _chipID() to match situation better.
- Fixed _chipID() to run more efficiently.


New flash memory chips supported:
- GD25Q16C from Giga devices (Used on the Adafruit ItsyBitsy M0 Express)
- W25Q64JV from Winbond
- SST26VF016B & SST26VF032B from Microchip.

New Fram memory chips supported:
- FM25W256 from Cypress


Work on proper documentation continues. As polaroi8d pointed out here, the old ReadMe was getting far too unwieldy and the Github Wiki is not the easiest thing to poke around. I hope to have the documentation done soon - (Rst + Sphinx). Check out the progress of the documentation here! Any recommendations are welcome  8)

Marzogh

@walterpre@BigEyetuna & @jacky4566 : jetty840 identified the issue with the SST26 series and its been fixed with v3.3.0.

@Srmojo & @timoteo_mendes: I've just tested the latest version of the library - v3.3.0 - with the W25Q64JV on the Adafruit 328p feather and it works fine. I do not have an Adalogger handy, but AFAIK, the both of them use the same µC - hope it helps!

@amirezz: There was a bug in v3.2.1 that prevented the library from writing to the SST25 and SST26 series. This has been fixed in v3.3.0. Also, the library supports the LE25U40C.

@zhliao: Could you check and confirm that v3.3.0 also causes the same issue? If it does, please let me know and I will take a look at it right away.

jacky4566

Marzogh you can probably update the compatibility tables. I haven't thoughly tested but it does seem to work just fine with Teensy 3.2 and Teensy LC.
I am also using the Adesto AT25SL641. Which won't be very popular at 1.8v but it passed all checks with the LC and works perfectly.

Marzogh

@jacky4566: Thanks for the heads up. Its good to know its working with the Teensys and with the AT25SL641. Have you had to make any mods to get the library to run on the Teensy?

jacky4566

@jacky4566: Thanks for the heads up. Its good to know its working with the Teensys and with the AT25SL641. Have you had to make any mods to get the library to run on the Teensy?
No mods. Using default SPI pins since its a custom board I cant really test the alternate pins. CPU clock 48MHz, SPI clock speed 12MHz. Power down works fine as well.

BobTrex

Any chance you will support CY15B104Q 4Mbit FRAM, I have one and have never got it working.

Thanks and Regards

tfcroft4

I have been able to run the FlashDiagnostics on the Sparkfun RedBoard Turbo. A M0 processor with W25Q32BV 32M-Bit Winbond memory chip. I had to modify the variant.h and variant.cpp files as Sparkfun had omitted to include Arduino access for the on board SPImemory.

I have posted details of the edits and a copy of the output obtained on the Sparkfun forum:

https://forum.sparkfun.com/viewtopic.php?f=145&t=49805

Thanks for the library
Ted

Marzogh

@tfcroft4 Thank you for the heads up :) I'm glad the library works for you :smiley-grin:

@BobTrex I add support for ICs based on the ones I can get my hands on. Please raise an 'feature request' issue on Github for support for this chip and I'll put it into the pipeline :)

Marzogh

Just pushed an update through to v3.4.0 with the following changes:


Bugs squashed:
- FastRead works properly now. All previous versions of the library has a FastRead bug that prevent it from doing what it was supposed to.

Enhancements:

-An alternate version of the constructor SPIFlash flash(int8_t *SPIPinsArray); can be used (only with ESP32 boards as of now) to enable the use of custom SPI pins. SPIPinsArray has to be a 4 element array containing the custom SPI pin numbers (as signed integers - int8_t) in the following order - sck, miso, mosi, ss. Refer to the wiki for more information. Resolves issue #113
- Created new error code `NOCHIPSELECTDECLARED` for errors with declaring custom SPI pins.
- Using other SPI ports (HSPI, VSPI, SPI1, SPI2 etc.) is now also supported on ESP32 boards - along with SAMD and STM32 boards (supported since v3.0.0). Resolves issue #177
- The new version changes the way setClock() works and allows for the definition of clock speed before the SPI Bus is instantiated. Refer to wiki for further details. Thanks @rambo.(PR #156)

- Reduce SRAM footprint when running Diagnostics.ino. Thanks @rambo
- Officially supports the ESP32 (tested on the ESP32 Feather)
- Now supports FRAM memory chips via the SPIFram constructor
- Changed Diagnostics output in _chipID() to match situation better.
- Fixed _chipID() to run more efficiently.

New µCs supported:
- nRF52832 ARM Cortex M4F (Adafruit nRF52 Feather)
- STM32L0 ARM Cortex M0+ (Nucleo-L031K6)

New flash memory chips supported:
- MX25L4005 & MX25L4005 from Macronix



Work on proper documentation continues. As polaroi8d pointed out here, the old ReadMe was getting far too unwieldy and the Github Wiki is not the easiest thing to poke around. I hope to have the documentation done soon - (Rst + Sphinx). Check out the progress of the documentation here! Any recommendations are welcome  8)

Go Up