SPIMemory не всегда правильно пишет

Я использую WinBond 25Q128FVIQ (Flash 128 Мбит, 3,3 В) в сочетании с библиотекой Marzogh SpiMemory на моем Arduino. Нано (также 3,3 В).

После использования примера по умолчанию я обнаружил, что прочитанное не всегда полностью соответствует тому, что я написал. Поэтому я создал несколько альтернативный пример записи 16 байтов:

#include<SPIMemory.h>

uint32_t address;

#define BAUD_RATE 115200
#define RANDPIN A0

//SPIFlash flash(SS1, &SPI1); //Используйте этот конструктор при использовании шины SPI, отличной от SPI по умолчанию. Работает только с микросхемами с более чем одной аппаратной шиной SPI.
SPIFlash flash;

bool readSerialStr(String &inputStr);

void setup() {
  Serial.begin(BAUD_RATE);
#if defined (ARDUINO_SAMD_ZERO) || (__AVR_ATmega32U4__)
  while (!Serial) ; // Подождите, пока откроется последовательный монитор
#endif

  flash.begin();
  Serial.println(F("Flash Test"));
  Serial.print(F("Capacity: "));
  Serial.println(flash.getCapacity());

  char writeBuffer[16] = "0123456789ABCDEF";
  char readBuffer[17];

  for (int n = 0; n < 5; n++)
  {
    memset(readBuffer, 17, 0);
    randomSeed(analogRead(RANDPIN));
    address = random(0, flash.getCapacity() - 16);
    bool err = flash.writeAnything(address, writeBuffer, true);
    delay(50);
    Serial.print(F("Write: "));
    Serial.println(err);
    for (int m = 0; m < 10; m++)
    {
      if (flash.readAnything(address, readBuffer, true))
      {
        Serial.print(m);
        Serial.print(F(", read: "));
        Serial.print(readBuffer);
        Serial.print(F(", from address: "));
        Serial.println(address);
      }
      delay(50);
    }
  }
}

void loop() {

}

//Читает строку из Serial
bool readSerialStr(String &inputStr) {
  if (!Serial)
    Serial.begin(115200);
  while (Serial.available()) {
    inputStr = Serial.readStringUntil('\n');
    Serial.println(inputStr);
    return true;
  }
  return false;
} 

Краткое объяснение: 5 раз я пишу строку (шестнадцатеричные числа) и 5 раз читаю это. Результат: (один пример, каждый раз разный):

 Flash Test
Capacity: 8388608
Write: 1
0, read: 0123456789ABCDEF, from address: 6252204
1, read: 0123456789ABCDEF, from address: 6252204
2, read: 0123456789ABCDEF, from address: 6252204
3, read: 0123456789ABCDEF, from address: 6252204
4, read: 0123456789ABCDEF, from address: 6252204
5, read: 0123456789ABCDEF, from address: 6252204
6, read: 0123456789ABCDEF, from address: 6252204
7, read: 0123456789ABCDEF, from address: 6252204
8, read: 0123456789ABCDEF, from address: 6252204
9, read: 0123456789ABCDEF, from address: 6252204
Write: 1
0, read: 0123456789ABCDEF, from address: 5680766
1, read: 0123456789ABCDEF, from address: 5680766
2, read: 0123456789ABCDEF, from address: 5680766
3, read: 0123456789ABCDEF, from address: 5680766
4, read: 0123456789ABCDEF, from address: 5680766
5, read: 0123456789ABCDEF, from address: 5680766
6, read: 0123456789ABCDEF, from address: 5680766
7, read: 0123456789ABCDEF, from address: 5680766
8, read: 0123456789ABCDEF, from address: 5680766
9, read: 0123456789ABCDEF, from address: 5680766
Write: 0
0, read: , from address: 5277398
1, read: , from address: 5277398
2, read: , from address: 5277398
3, read: , from address: 5277398
4, read: , from address: 5277398
5, read: , from address: 5277398
6, read: , from address: 5277398
7, read: , from address: 5277398
8, read: , from address: 5277398
9, read: , from address: 5277398
Write: 0
0, read: , from address: 4941258
1, read: , from address: 4941258
2, read: , from address: 4941258
3, read: , from address: 4941258
4, read: , from address: 4941258
5, read: , from address: 4941258
6, read: , from address: 4941258
7, read: , from address: 4941258
8, read: , from address: 4941258
9, read: , from address: 4941258
Write: 0
0, read: ⸮⸮⸮⸮⸮l⸮څ⸮w⸮r⸮0123456789ABCDEF, from address: 4689153
1, read: ⸮⸮⸮⸮⸮l⸮څ⸮w⸮r⸮0123456789ABCDEF, from address: 4689153
2, read: ⸮⸮⸮⸮⸮l⸮څ⸮w⸮r⸮0123456789ABCDEF, from address: 4689153
3, read: ⸮⸮⸮⸮⸮l⸮څ⸮w⸮r⸮0123456789ABCDEF, from address: 4689153
4, read: ⸮⸮⸮⸮⸮l⸮څ⸮w⸮r⸮0123456789ABCDEF, from address: 4689153
5, read: ⸮⸮⸮⸮⸮l⸮څ⸮w⸮r⸮0123456789ABCDEF, from address: 4689153
6, read: ⸮⸮⸮⸮⸮l⸮څ⸮w⸮r⸮0123456789ABCDEF, from address: 4689153
7, read: ⸮⸮⸮⸮⸮l⸮څ⸮w⸮r⸮0123456789ABCDEF, from address: 4689153
8, read: ⸮⸮⸮⸮⸮l⸮څ⸮w⸮r⸮0123456789ABCDEF, from address: 4689153
9, read: ⸮⸮⸮⸮⸮l⸮څ⸮w⸮r⸮0123456789ABCDEF, from address: 4689153

Вывод: похоже, проблема заключается в записи, поскольку чтение, следовательно, возвращает одно и то же значение (либо мусор, либо правильную строку).

Что я не так?

На самом деле, я даже не хочу задержку в 50 мс (и когда я ее убираю, результат тот же).

, 👍0


1 ответ


Лучший ответ:

1

Я совершил глупую ошибку; Я случайно удалил следующую строку в конце приложения, которая отвечает за стирание сектора. Если это опущено, то в следующий раз действия записи завершатся ошибкой (или иногда ошибкой):

flash.eraseSector(address);
,