Tarbal 4 14 июля, 2017 Опубликовано 14 июля, 2017 · Жалоба Еще бывает, что активный фронт синхроимпульсов или срез. Когда master и slave настроены неодинаково, то будет проблема. Возможно endianity тоже имеет значение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 14 июля, 2017 Опубликовано 14 июля, 2017 · Жалоба Записываем, адрес 0х00, значение -- инкремент. Начало 0xDB - это команда записи страницы? Какого размера? какова разрядность адреса? 16 бит? Если адрес 16-разрядный, то получается - записываете один байт ==0 по адресу 0? Вы это хотели сделать? И где чтение состояния чипа (регистр статуса) перед командами чтения и записи? 0x05 - это команда чтения статуса? В ней 0-бит равный ==1 - говорит о занятости чипа? Если так, то Вас разве не настораживает, что сразу после команды записи у чипа статус "свободен"? Или чип очень быстро успел записать или записи не было вообще. В таком тесте нужно писать на большей SCLK и писать не байт, а сразу полную страницу. Чтобы было видно, что чип выставил BUSY после операции. Далее - хвост этой осциллограммы: 0x02 - это что за команда? Перед ней идёт WEL, т.е. - получается 0x02 - это опять команда записи чего-то? Чего? Как говорит инет: M25PE16 имеет ёмкость 16Мб, а значит адрес должен быть 24-разрядным. Если так - то почему у Вас передаётся только адрес, а где данные? Тогда понятно почему у чипа статус "свободен" сразу после "записи"... PS: Вы даташит на чип открывали вообще? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bureau 0 14 июля, 2017 Опубликовано 14 июля, 2017 · Жалоба 0xDB - это команда записи страницы? 0xDB - это PAGE ERASE 0x05 - это команда чтения статуса? В ней 0-бит равный ==1 Где вы увидели что в ней 0-бит равный ==1 ? Вас разве не настораживает, что сразу после команды записи у чипа статус "свободен"? Настораживает, поэтому и спрашиваю сообщество что не так 0x02 - это что за команда? 0x02 - это PAGE PROGRAM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 14 июля, 2017 Опубликовано 14 июля, 2017 (изменено) · Жалоба Согласен с предыдущим оратором. Раз ID читается нормально, значит на физическом уровне интерфейс настроен правильно. Осталось разобраться с протоколом. P.S. Предлагаю воспользоваться анализатором QSPI для Saleae Logic, который я когда-то нашел на просторах интернета - он показывает не просто значения байтов, а команды в соответствии с протоколом: Saleae QSPI analyzer Закинуть в папку "Analyzers" и перезапустить прогу. Для работы с обычным SPI оставить в настройках DQ2/DQ3 как "none". Стираем чип А Вас не смутило, что бит BUSY оказался сброшенным сразу после стирания (если судить по картинке)? По документации полное стирание занимает от 25 до 60 сек. Аналогично со стиранием страницы. Вы случайно вывод W на ноль не посадили? Изменено 14 июля, 2017 пользователем Harvester Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 14 июля, 2017 Опубликовано 14 июля, 2017 · Жалоба Где вы увидели что в ней 0-бит равный ==1 ? Я не увидел, я спрашивал: правильно ли я понимаю, что состояние ==1 - "чип занят"? Состояние ноги защиты от записи каково? Состояние регистров защиты от записи каково? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 14 июля, 2017 Опубликовано 14 июля, 2017 · Жалоба В 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bureau 0 14 июля, 2017 Опубликовано 14 июля, 2017 · Жалоба Добавил чтение состояния чипа (регистр статуса) перед командами чтения и записи. А так-же специально для скептиков добавил отображение сигналов RESET и WP Старт MCU, сброс RESET Стираем чип. Сразу после команды стирания видим что в регистре статуса WIP==0 Стираем Страницу перед записью. Сразу после команды стирания видим что в регистре статусе WIP==0 Записываем данные. Бит WEL устанавливается только после повторного чтения регистра статуса Окончание записи. Сразу после команды записи видим что в регистре статуса WIP==0 Чтение Lock регистра. Все по нулям Попытка чтения записанных данных -- все 0xFF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 15 июля, 2017 Опубликовано 15 июля, 2017 · Жалоба Записываем данные. Бит WEL устанавливается только после повторного чтения регистра статуса А вот это должно было сразу Вас насторожить. После команды WriteEnable, бит WEL должен быть ==1. Разбирайтесь с сигналами, задержками, вых.током ног SPI-контроллера, может ещё с питанием проблемы. То, что Вы показываете на этих картинках, похоже не совпадает с тем, что видит чип. Поэтому он просто не воспринимает каких-то ваших команд. Ещё сам этот лог.анализатор может вносить помеху в сигнал - мой например аналогичный китайский часто невозможно использовать на частотах выше 1-2 МГц, из-за его малого вх. сопротивления или ёмкости ног - искажает исследуемые сигналы. Нужно посмотреть нормальным осциллографом. Либо снизить SCLK до очень-очень малых значений. Также добавить задержки между CS=0 и первым клоком, и последним клоком и CS=1, а также между CS=1 и последующим CS=0 последующей команды. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 15 июля, 2017 Опубликовано 15 июля, 2017 · Жалоба А еще никто не предложил поменять микросхему? От другого поставщика из другой партии? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 220 15 июля, 2017 Опубликовано 15 июля, 2017 · Жалоба Т.е. WEL всё-таки появляется, но сразу пропадает — действительно похоже на проблему с питанием, в частности, отсутствие в требуемом производителем месте силового конденсатора. А ещё, при подаче питания, либо CS должен быть подтянут резистором, либо RESET в нуле. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bureau 0 15 июля, 2017 Опубликовано 15 июля, 2017 · Жалоба А еще никто не предложил поменять микросхему? От другого поставщика из другой партии? Уже давно сделано. Поставил память от Winbond. Запустилась с первого раза и работает как часики. Но поскольку с SPI Flash работаю впервые, возможно что-то упустил в отношении проблемной микросхемы. Вот теперь и пытаюсь разобраться в чем может быть причина что бы в следующий раз не наступать на данные грабли Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 17 июля, 2017 Опубликовано 17 июля, 2017 · Жалоба Уже давно сделано. Поставил память от Winbond. Запустилась с первого раза и работает как часики. Но поскольку с SPI Flash работаю впервые, возможно что-то упустил в отношении проблемной микросхемы. Вот теперь и пытаюсь разобраться в чем может быть причина что бы в следующий раз не наступать на данные грабли Это вы про другого производителя (наверно), а я вам про другого поставщика или другую партию этого же производителя памяти говорил, может проблема в самой микросхеме и она уже давно погорела. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться