Перейти к содержанию
    

Еще бывает, что активный фронт синхроимпульсов или срез. Когда master и slave настроены неодинаково, то будет проблема. Возможно endianity тоже имеет значение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Записываем, адрес 0х00, значение -- инкремент. Начало

post-25593-1499976969_thumb.png

0xDB - это команда записи страницы? Какого размера? какова разрядность адреса? 16 бит?

Если адрес 16-разрядный, то получается - записываете один байт ==0 по адресу 0? Вы это хотели сделать?

И где чтение состояния чипа (регистр статуса) перед командами чтения и записи?

0x05 - это команда чтения статуса? В ней 0-бит равный ==1 - говорит о занятости чипа? Если так, то Вас разве не настораживает, что сразу после команды записи у чипа статус "свободен"? Или чип очень быстро успел записать или записи не было вообще. В таком тесте нужно писать на большей SCLK и писать не байт, а сразу полную страницу. Чтобы было видно, что чип выставил BUSY после операции.

Далее - хвост этой осциллограммы: 0x02 - это что за команда? Перед ней идёт WEL, т.е. - получается 0x02 - это опять команда записи чего-то? Чего?

 

Как говорит инет: M25PE16 имеет ёмкость 16Мб, а значит адрес должен быть 24-разрядным. Если так - то почему у Вас передаётся только адрес, а где данные? Тогда понятно почему у чипа статус "свободен" сразу после "записи"...

 

PS: Вы даташит на чип открывали вообще?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

0xDB - это команда записи страницы?

0xDB - это PAGE ERASE

 

0x05 - это команда чтения статуса? В ней 0-бит равный ==1

Где вы увидели что в ней 0-бит равный ==1 ?

 

Вас разве не настораживает, что сразу после команды записи у чипа статус "свободен"?

Настораживает, поэтому и спрашиваю сообщество что не так

 

0x02 - это что за команда?

0x02 - это PAGE PROGRAM

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласен с предыдущим оратором.

Раз ID читается нормально, значит на физическом уровне интерфейс настроен правильно.

Осталось разобраться с протоколом.

 

P.S. Предлагаю воспользоваться анализатором QSPI для Saleae Logic, который я когда-то нашел на просторах интернета - он показывает не просто значения байтов, а команды в соответствии с протоколом: Saleae QSPI analyzer

Закинуть в папку "Analyzers" и перезапустить прогу. Для работы с обычным SPI оставить в настройках DQ2/DQ3 как "none".

 

Стираем чип

post-25593-1499976957_thumb.png

А Вас не смутило, что бит BUSY оказался сброшенным сразу после стирания (если судить по картинке)?

По документации полное стирание занимает от 25 до 60 сек.

Аналогично со стиранием страницы.

Вы случайно вывод W на ноль не посадили?

Изменено пользователем Harvester

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где вы увидели что в ней 0-бит равный ==1 ?

Я не увидел, я спрашивал: правильно ли я понимаю, что состояние ==1 - "чип занят"?

Состояние ноги защиты от записи каково? Состояние регистров защиты от записи каково?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В M25PE16 каких-либо проблем замечено не было.

Перед каждой операцией чтения/записи отправляем команду release from deep power down - 0xab.

После выполнения каждой операцией чтения/записи отправляем команду deep power downn - 0xd9.

 

Чтение согласно документации - CS_LOW, команда read data bytes 0x03, 3 байта адреса, чтение нужного кол-ва байт, CS_HIGH

 

Запись согласно документации -

CS_LOW, команда write enable 0x06, CS_HIGH,

CS_LOW, команда page write 0x0a, 3 байта адреса, запись от 1 до 256 байт, CS_HIGH

Ожидание завершения записи опросом байта статуса

 

Статус читаем так (приведу кусок готового кода, чтобы было понятнее)

unsigned int waitBusy(void)
{
  volatile unsigned int status;
  
  SELECT_SPI(nSS_SFLASH);
  SPIWriteChar(MP25_RDSR); //0x05 - read status register
  for(unsigned int i=0; i<50; i++)
  {
    status = SPIWriteChar(0x00);
    //MP25_WIP = 0x01 write in progress
    if((status & MP25_WIP) == 0)
    {
      DESELECT_SPI();
      return 1;
    }
    
    delay_ms(1);
  }
  
  DESELECT_SPI();
  
  return 0;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавил чтение состояния чипа (регистр статуса) перед командами чтения и записи.

А так-же специально для скептиков добавил отображение сигналов RESET и WP

 

Старт MCU, сброс RESET

post-25593-1500060489_thumb.png

 

Стираем чип. Сразу после команды стирания видим что в регистре статуса WIP==0

post-25593-1500060503_thumb.png

 

Стираем Страницу перед записью. Сразу после команды стирания видим что в регистре статусе WIP==0

post-25593-1500060707_thumb.png

 

Записываем данные. Бит WEL устанавливается только после повторного чтения регистра статуса

post-25593-1500060747_thumb.png

 

Окончание записи. Сразу после команды записи видим что в регистре статуса WIP==0

post-25593-1500060842_thumb.png

 

Чтение Lock регистра. Все по нулям

post-25593-1500060768_thumb.png

 

Попытка чтения записанных данных -- все 0xFF

post-25593-1500060776_thumb.png

post-25593-1500060534_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Записываем данные. Бит WEL устанавливается только после повторного чтения регистра статуса

А вот это должно было сразу Вас насторожить. После команды WriteEnable, бит WEL должен быть ==1.

Разбирайтесь с сигналами, задержками, вых.током ног SPI-контроллера, может ещё с питанием проблемы.

То, что Вы показываете на этих картинках, похоже не совпадает с тем, что видит чип. Поэтому он просто не воспринимает каких-то ваших команд.

Ещё сам этот лог.анализатор может вносить помеху в сигнал - мой например аналогичный китайский часто невозможно использовать на частотах выше 1-2 МГц, из-за его малого вх. сопротивления или ёмкости ног - искажает исследуемые сигналы.

Нужно посмотреть нормальным осциллографом.

Либо снизить SCLK до очень-очень малых значений.

Также добавить задержки между CS=0 и первым клоком, и последним клоком и CS=1, а также между CS=1 и последующим CS=0 последующей команды.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е. WEL всё-таки появляется, но сразу пропадает — действительно похоже на проблему с питанием, в частности, отсутствие в требуемом производителем месте силового конденсатора.

 

А ещё, при подаче питания, либо CS должен быть подтянут резистором, либо RESET в нуле.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А еще никто не предложил поменять микросхему? От другого поставщика из другой партии?

Уже давно сделано.

Поставил память от Winbond. Запустилась с первого раза и работает как часики.

Но поскольку с SPI Flash работаю впервые, возможно что-то упустил в отношении проблемной микросхемы. Вот теперь и пытаюсь разобраться в чем может быть причина что бы в следующий раз не наступать на данные грабли

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уже давно сделано.

Поставил память от Winbond. Запустилась с первого раза и работает как часики.

Но поскольку с SPI Flash работаю впервые, возможно что-то упустил в отношении проблемной микросхемы. Вот теперь и пытаюсь разобраться в чем может быть причина что бы в следующий раз не наступать на данные грабли

Это вы про другого производителя (наверно), а я вам про другого поставщика или другую партию этого же производителя памяти говорил, может проблема в самой микросхеме и она уже давно погорела.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...