STM32DISCOVERY копирует SPI Flash на коленке + восстанавливаем пол-матрицы монитора

Началась история с того, что друзья выкидывали монитор Samsung SyncMaster 225BW. Жалобы — не показывает половина матрицы и монитор иногда забывает настройки яркости/контрастности/цветности и т.д. и запускается с «нереальными» настройками, например с отрицательным значением яркости.
Ключевые проблемы: непропай, копирование SPI Flash на STM32DISCOVERY. Скорее для новичков.

«Эдди, половина!»

Для начала нужно было разобраться с половиной матрицы. Вот картинка, я её спёр с интернета, потому что своей не сделал, увы:

Разобрал монитор, снял защитный кожух с платы матрицы, включил монитор, подал на него сигнал и стал аккуратно, держась руками за металлический корпус (дабы быть относительно него заземлённым), прощупывать плату мягкими нажимами на компоненты. В итоге обнаружил, что при касании некоторой области с краю платы, изображение на второй половине появляется, хоть и не очень чётко. Дальнейшая «прощупывание» для сужения области поиска и последующая прозвонка SMD резисторов показала непропай, который был устранён. Для прозвонки одного компонента пришлось скальпелем аккуратно сцарапать с дорожки лак. Лучше всего прозванивать как можно нежнее и подальше от самого компонента, дабы не вызвать ложное замыкание искомого непропая.

Исправляем сбой настроек

После этого небольшого ремонта я ещё долго не подходил к проблеме с настройками. Ну мешала она немного, приходилось частенько по несколько раз включать и выключать, затем настраивать заново, настройки для аналогового входа вообще постоянно «автонастраивались» при включении. Но лень же заниматься…
Тем временем, задача продолжала решаться в ленивом режиме. Достал на монитор «сервис мануал», открыл в нём схему. В схеме обнаружил три микросхемы энергонезависимой памяти.
Одна подключена к порту D-SUB и к сигнальному процессору:

Вторая подключена к порту DVI и к сигнальному процессору:

Третья подключена только к сигнальному процессору:

Те микросхемы, которые соединены с D-SUB и DVI, судя по всему, призваны что-то сообщать компьютеру при подключении к нему монитора. При том схема устроена так, что питаться они могут и от соответствующего D-SUB или DVI порта, то есть при обесточенном мониторе.
Подозрение пало на микросхему, подключенную только к сигнальному процессору:

Пин WP# (Write Protection инвертированый) запитан от высокого уровня, значит аппаратная защита от записи у неё отключена, а это значит, что в неё может писать процессор. Хммм.
Для начала купил микросхему, по принципиальной схеме указана sst25vf010a-33-4C-SAE. В Проме оказалась только sst25vf010a-33-4I-SAE. Качаем на неё документ, смотрим:

Разница в температурных диапазонах, нам предлагают ставить Commercial от 0°C до 70°C, а в Проме есть Industrial от -40°C до +85°C, то есть диапазон полностью перекрыт (и она, наверно дороже, зараза!). Пляшем!
Первая мысль: в сигнальном процессоре, наверно своей энергонезависимой памяти море, впаяю пустую, процессор её сам заполнит. Но нет, после впаивания пустой памяти монитор запускаться отказался. О-кей, значит надо прошивку со старой перекатать на новую.
Под рукой STM32DISCOVERY на STM32F303. Питание там есть, два SPI найдётся, надо только написать программу.
Открываем монитор, ищем микросхему, а там стоит PM25LV010, аналог sst25vf010a. Припаиваем её на сопли к DISCOVERY таким образом:

        ///29 PA4 CS
        ///30 PA5 SPI1_SCK
        ///31 PA6 SPI1_MISO
        ///32 PA7 SPI1_MOSI

Я в коде инициализации оставляю такие комментарии, здесь номер ножки, порт, назначение порта. Всё просто и понятно.
Пин WP# соединяем с VSS, чтобы исключить случайную запись данных в неё.
Читать научились, думал выплюнуть прошивку на компьютер через printf в консоль и куда-нибудь сохранить. Оказалось что пин разъёма программирования и отладки SWD под названием SWO (через который, в частности, работает printf) не подключен. Не беда — подчключаем PB3 к 6ой ноге SWD и получаем нормальный быстрый printf. Есть вариант использования в режиме semihosted, но он очень медленный. При выплёвывании обнаружилось, что не так уж много можно выплюнуть в IAR, с определённого момента консоль начинает съедать информацию, видимо буфер маловат. Ну и хрен с ним, подключу вторую память к SPI2 и напрямую скопирую.
Вторую память подключил к SPI2:

        ///56 PD9 CS
        ///55 PB13 SPI2_SCK
        ///53 PB14 SPI2_MISO
        ///54 PB15 SPI2_MOSI

Пин WP# соединяем с VDD, чтобы можно было в неё писать.
А вот и сопли:

Про написание этой кривой поделки рассказывать долго не буду, обозначу только проблемы, с которыми столкнулся:
1) к SPI1 без проблем микросхему подключил и смог всё прочитать, но вот с SPI2 возникла проблема, в старой версии Datasheet на STM32F303 ошибка в указании SPI2_SCK, что выяснилось проверкой осциллографом. В свежем мануале выяснилось, что перепутали вывод. КАЧАЙТЕ СВЕЖИЕ МАНУАЛЫ ОТ ST Microelectronic!
2) документация на sst25vf010a и PM25LV010 отличается, да так, что в одной написано значительно меньше, и понять, как оно читается и пишется невозможно.
3) первая прошивка прошла неудачно, обнаружилось ДВА байта, только ДВА!!! неправильно переписанных. Как так получилось — не знаю. Чтение и запись производил при максимальных делителях частот для SPI, но ошибка возникла. Может что-то включал в этот момент свой пылесос «Урал» в соседней квартире, а на втором байте он его выключал. В общем, стёр весь чип и скопировал заново — помогло. При первой записи с ошибкой посчитал, что всё и так заработает, ведь подозрение было на битую память, но нет… монитор повис, пришлось снова копировать.

Эта заметка не претендует на хороший код или какие-то претензии на качество. Задача была сделать, чтобы работало, быстрее, ленивее, на коленке. Результат — монитор перестал страдать проблемами, всё отлично работает. Информация, скорее, будет полезна для новичков.

Прикладываю проект IAR, может кому-то пригодится. Осторожно! Внутри наколенный говнокод!

UPD
Спасибо нашему товарищу VGA за помощь в комментариях. Пляски с флэшкой на 128 кБ не помогли, теперь под подозрением IC200, которая именуется у них, судя по наименованию выводов, NVRAM. Это микросхема AT24C08, размером 8 кбит, 64 страницы по 16 байт, т.е. 1 кБайт. + прозвоним обвязку.
И так, вот она:


Микросхему перепаял, обвязку проверил, наличие контакта от памяти до ног сигнального процессора проверил. Микросхема встала на место без копирования данных, первичные настройки были странные, но потом, вроде, устаканились. Всё, вроде, в норме, но увы, не помогло.
Что дальше? Дальше есть желание сделать следующее:
1) Почитать документацию на память, понять как она работает.
2) Вывести сигналы с ног памяти наружу и встать на них осциллографом. Глядишь чего и увижу.
3) Если выше не будет выявлено факта записи в микруху, то м.б. есть цепь, которая оповещает процессор о пропадании питания и необходимости записи настроек. Но это маловероятно.
Какой же, цуко, интересный монитор.
Признаю, с этим монитором я уже дважды обоср***я ошибся, и, пока что, проблему с настройками не решил.
  • +3
  • 31 мая 2016, 23:19
  • toxin65
  • 1
Файлы в топике: STM32F303_SPI_Flash_Copy.zip

Комментарии (36)

RSS свернуть / развернуть
Лучше всего прозванивать как можно нежнее и подальше от самого компонента, дабы не вызвать ложное замыкание искомого непропая.
Я просто устроил ковровое пропаивание подозрительной области. Помогло.
Те микросхемы, которые соединены с D-SUB и DVI, судя по всему, призваны что-то сообщать компьютеру при подключении к нему монитора
EDID'ы это, по ним комп определяет подключение и возможности монитора. К тому же, насколько я вижу, они подключены только к DVI/DSUB, к мозгам монитора только WP идет (видимо, можно из сервисменю снять защиту и прошить чипы по DVI/DSUB кабелю).
Первая мысль: в сигнальном процессоре, наверно своей энергонезависимой памяти море, впаяю пустую, процессор её сам заполнит.
Ну кто будет в здравом уме для настроек монитора ставить мегабитный флеш? Ясно что там прошивка лежит. Алсо, они что, в ней же и настройки хранили? Неудивительно, что оно быстро скисло.
Флешки довольно популярные, так что и программаторов готовых немало придумано. Я обычно использую SPIPGMW, работающию с этими чипами через LPT-порт.
+2
  • avatar
  • Vga
  • 01 июня 2016, 01:49
кто будет в здравом уме для настроек монитора ставить мегабитный флеш?
Вы посеяли во мне сомнение, и, видимо, не зря. Потерев глаза я нашёл ещё одну память, и это, вероятнее всего настройки. А то, что он несколько дней работает без сбоев, это не моя заслуга…

Ну я доложу об изменениях в состоянии пациента. Видимо для этой задачи я напрасно огород городил.
0
Ага. Вот NVRAM — это точно хранилище настроек. Его и надо менять/пропаивать.
0
Ну, у пациента проявились те же симптомы, как и ожидалось. На днях поменяю эту микруху.
0
Проверь еще ее обвязку, пайку R210-R215 в частности.
0
Я проверил обвязку, заменил микруху, см. UPD. В общем, пока не помогло. Буду рад любой помощи. Спасибо.
0
Стоит поискать на форумах по ремонту, таких как Monitor или ROM.by, типичные неисправности этого монитора и прошивки. Вот, например, тема, посвященная прошивкам (правда, прошивка флеша там упоминается исключительно в виде «проверьте почту», зато есть прошивка NVRAM).
+1
Проверь, кстати, питание микры.
+1
Практический и грамотный подход приятно посмотреть. +1
0
Спасибо, но, видимо, проблему с настройками я не решил, см. комментарий выше.
0
Нда, поторопился я плюсовать))) Сам потом смотрю — выходит ты из выпаянной микросхемы память скопировал в новую, так память выходит живая была раз скопировалась, так выходит ты вообще это зря сделал)) и дело в непропае где-нибудь рядом с ней, или вообще в чем нибудь другом, как ты сейчас говоришь. Резюме не надо торопиться с выводами))))
-1
Ну, она бы скопировалась и мертвая, а вот на этапе верификации можно было найти ошибки, а можно было и не найти. Но что-то мне общение с этим монитором подсказывает, что это непропай. А вот схему я действительно невнимательно смотрел, что не увидел нужную память.
0
так память выходит живая была раз скопировалась,
скопировалась и заработала, понятно.
0
Мог быть мёртвым один блок памяти, если бы его постоянно переписывали, а всё остальное было бы живым. И заработало бы так же, как и случилось у меня, ведь помещать настройки в тот блок, где основная программа лежит — верх критинизма, чего за Samsung'ами замечено не было. Хотя, тот факт, что я предположил расположение настроек в микрухе на 128 кБ тоже не от большого ума.
0
Растолкуй подробней все этапы чтения и записи микросхем SPI Flash.
0
В двух словах: чтение — послал команду на чтение (1 байт), послал адрес (3 байта), потом посылаешь нули (может и мусор можно), а в ответ получаешь байты из памяти, продолжается это до бесконечности, пока память не кончится, потом снова начинает передавать сначала.
Перед записью нужно её разрешить через WREN и записать в Status Register значение, помоему 0x00, чтобы отключить биты защиты (их два, защищают либо верхнюю четверть, либо верхнюю половину, либо всё, либо ничего). Это можно в коде проекта посмотреть, там весь ритуал описан. Аппаратная ножка защиты должна быть в соответствующем положении.
Сама запись — я не мудрил, использовал команду которая пишет один байт, «синтаксис» такой же: 1 байт команда, 3 байта адрес, 1 байт — данные для записи. После записи опрашиваем Status Register командой READSR, чтобы убедиться что запись закончилась и флаг занятости опущен. Есть команда для записи с автоматическим инкрементом адреса, которая позволяет писать так же как и читать — последовательно байт за байтом, но я её в этот проект не включил…
Если этого вам достаточно — рад был помочь. Статью на эту тему писать я пока не планировал, вроде как премудрости там немного…
0
Что здесь есть адрес?
0
Физический адрес ячейки памяти. Допустим у меня 1 Мбит, значит это 128 кБайт, значит адресное пространство от 0x000000 до 0x01FFFF.
0
Всегда думал, что в SPI Serial Flash обращение возможно только к секторам, блокам, страницам и невозможно обратиться только к одной конкретной единственной ячейке. Выходит ошибался.
0
Стирание возможно только блоком, когда все ячейки блока становятся в 0xFF. А запись и чтение — как угодно. Но запись, конечно, после стирания в ячейку делается только один раз. Хочешь переписать одну ячейку в блоке — запоминай блок, стирай блок, вноси изменения, пиши обратно.
0
Оп-ля вот это нижданчик((( Таки есть множество нюансов.
Эх статью бы на эту тему, по контроллеру SPI в STM32 и его применению для записи/чтения SPI Flash.
0
Ну изваяю как время будет, раз есть потребность.
0
В даташите ж все написано, достаточно подробно. Когда я хотел аналогичное сделать, запнулся не на протоколе, а на том, что флешка отказалась работать через встроенный в пинборд преобразователь уровней) Так что я на него забил и взял SPIPGM…
0
В даташите как то все разрознено и раскидано, нет пошаговых инструкций как происходит чтение, как происходит запись.
0
все разрознено и раскидано, нет пошаговых инструкций
Есть такое дело. Мне тоже хотелось бы видеть блок-схему. Но чтение даташыта + практика в общем-то выручают. У меня не сразу получилось в SR написать, например, но потом разобрался.
0
Возможно, у тебя неудачный даташит. Скачай более понятный, это 25-е семейство, они все более-менее взаимозаменяемы.
+1
думал выплюнуть прошивку на компьютер через printf в консоль и куда-нибудь сохранить.
Можно поподробней изложить этот момент? Не совсем понял как тут можно выдать прошивку на компьютер.
0
Считать данные из чипа и выплюнуть в терминал на компьютере. Запнулось на том, что терминал через SWO оказался недостаточно быстр и терял данные.
+1
Обычно терминал на компьютере работает через COM порт. А тут как?
0
Через отладчик. В данном случае по технологии SWO (есть еще semihosting, но он даже медленнее SWO, и RTT, но для него надо JLink).
+1
А как организовать подобную передачу данных? У меня есть плата STM32L-Discovery, с отладчиком на борту перешитым в JLink. Как мне переслать хоть пару байт?
0
Читай сеггеровские доки на RTT, раз у тебя JLink. Можешь заодно для расширения кругозора погуглить инфу и по остальным упомянутым технологиям, про семихостинг даже тут где-то заметка была.
0
У тебя, кстати, буферы в программе по 255 байт, а читаешь ты в них по 256. Возможно это и есть причина криво скопировавшегося флеша (а вообще — я бы считал на комп родную флешку — в качестве бэкапа — и вернул ее на место).
+1
  • avatar
  • Vga
  • 03 июня 2016, 23:54
Аааа, блин. Да, есть такой косяк.
0
Да… Судя по всему осталась последняя возможность — фтопку, точнее в печку и как удачно заметил Vga — ковровое пропаивание, если нестабильность присутствует после всего этого, то дело скорее всего в этом, или компонент полудохлый, так от нагрева додохнет и можно будет наконец-то найти.
0
BGA тут нет, так что ковровое пропаивание лучше делать паялом, надежнее.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.