Тут тоже никак не поискать?
Хз ![]()
Я не знаю как залезть в мозги чипа и понять что ему не нравится.
Вру, знаю: выучить английский в совершенстве и изучить все ххх страниц даташита ![]()
Вероятнее всего я что то упускаю в инициализации периферии.
И при чем тут картинка дампа памяти мк?
В моем случае общение идёт тупо по одному 4х байтному регистру.
слушай, у тебя должен формироваться файл *.list в папке debug рядом с прошивкой, если на него посмотреть, при объявлении переменной и без нее?
Мысль, посмотрю.
Это не дамп памяти, это вся память мк в реал-тайм (в том числе ОЗУ, стэк и тд).
Но советчик из меня тот ещё… )))
Короче, “дело было не в бобине”(с) (не в МК), не в памяти и не в периферии.
Прогнал отладчиком, никакого криминала не увидел, регистры в норме, а в буфер идет мусор (впрочем это и лог анализатором было видно).
Оказалось, что W25Q64 после команды чтения QuadSPI необходимо сколько то времени подумать и несколько раз прочитать регистр статуса (бит BUSY) и дождаться пока чип одумается.
Всем спасибо!
то-есть внутри он одноканальный ;-)))
в смысле?
так то скорость чтения на 100МГц в четырехканальном режиме очень даже достойная.
Вероятнее всего в ДШ какое нибудь упоминание есть, сделать что либо после команды чтения, но я не нашел.
для чего то ему нужна задержка, если в память укладывать по 4-ре кирпича сразу она ни к чему, а раз нужна значит внутри идут какие-то процессы
но данная задержка нужна именно после чтения всего пакета, т е в легкую за раз можно вычитать все 8 мегабайт.
так что несколько микросекунд на 1 сектор не играют никакой роли.
как это вяжется с проблемой?
и ее отсутствии при объявления переменной как static?
ниче не понимаю ![]()
никак не вяжется, но проблема исчезла.
сам не понимаю ![]()
У тебя там массив есть , в функции. Размером с сектор.
Он размещается на стеке. Там под капотом вызывается alloca(…). Это типа malloc(), но память выделяется не из кучи, а со стека.
Размер сектора у твоей флешки (я не смотрел даташит, пардон, но имею мнение Ж)) скорее всего 4кб. Это многовато.
Надо его или malloc/free делать, или, проще всего - вытащи его наружу, сделай глобальной переменной. Статической.
Иначе есть риск перетереть стек а там уж одому богу известно, какие будут эффекты. Если ты говоришь, что стек там 0x400 байт, то это очень мало и скорее всего вылазишь за границы стека
я ж выше написал, все работает.
И если уж про стек и про буфер, я после нахождения причины, сделал три буфера по 4 КБ - все норм работает.
И да, это тестовый буфер, когда доберусь до USB накопителя, там уже все будет по другому.
Подозруха. В ДШ написано
BUSY is a read only bit in the status register (S0) that is set to a 1 state when the device is executing a Page Program, Quad Page Program, Sector Erase, Block Erase, Chip Erase, Write Status Register or Erase/Program Security Register instruction. During this time the device will ignore further instructions except for the Read Status Register and Erase/Program Suspend instruction (see tW, tPP, tSE, tBE, and tCE in AC Characteristics). When the program, erase or write status/security register instruction has completed, the BUSY bit will be cleared to a 0 state indicating the device is ready for further instructions.
Т.е. к чтению отношения вроде бы не имеет вовсе.
Да и про задержки при чтении я что-то в ДШ не нашел пока.
к чтению не относиться.
Подозреваю что флэшке необходим не проверка именно статусного регистра, а просто смена режима работы.
Т е банально выполнить какую либо другую операцию, не чтение QuadSPI.
Пробовал подряд чтение нескольких секторов, на первом чтении все ок, начиная со второго все ломается.
А несколько подряд сделанных запись/чтение - все ОК.
а если там не ноль читать можно разве
ДШ не запрещает читать.
Я же выше запостил цитату из даташита.
