Изобретаем жесткий диск. STM32 Nucleo-64. Часть 19.

После перерыва в год, мы выпускаем новую публикацию по исследованию WD21000. Такая длительная пауза была обусловлена постепенным усилением технологической базы всех проводимых исследований, как программных, так и аппаратных. Итак, после того, как уровень поднят, можно пользоваться наработками.

Начнем с того, что обновлена принципиальная схема. Уточнено подключение процессора 80С196.

А еще вкусного в этом посте то, что он сопровождается ассемблер-листингом из IDA базы на github.

Итак, пришло время задействовать анализатор. Подключение к шине процессора рассматривалось тут (часть 16).

Теперь, хорошо бы понять, как идет управление шпиндельным двигателем, а именно: разгон, стабилизация скорости и торможение. Плюс еще в микросхеме WD61C13A находится синтезатор частоты. Возможно, он как-то тоже управляется. Полученные знания попробую протестировать на макете — при помощи подключенного к этой микросхеме процессора STM32 (Часть 15)

Еще важный момент. У автора этого опуса нет глубоких знаний ассемблера процессора 80С196, так как он никогда не писал на нем программы и не отлаживал их. Нет коллекции библиотек и исходников для него, чтобы что-то посмотреть по аналогии. Автор знакомится с героем своего повествования по мере написания этого текста. Поэтому, набираться опыта и знаний нужно по схеме: смотрим анализатором, как работает и ищем это в коде. Находим — хорошо! Пытаемся понять зачем. А вот если не находим, то отмечаем, что есть какое-то непонимание. Формулируем вопрос и заносим его в список неизвестного.

Для решения задачи потребуется прибор, назовем его «счетчик/синхронизатор». Проблема в том, что анализатор ловит случайный пакет по входу синхронизации. Не получается посмотреть, например, первый от включения диска запрос к интересующей микросхеме, второй и так далее.

Чтобы посмотреть номерные обращения нужен счетчик импульсов сигнала «CS3#», который когда досчитает до заданного номера выдаст сигнал синхронизации. А уже от этого сигнала сработает анализатор и запишет кадр.

Проект счетчика/синхронизатора сделан в среде Arduino под плату STM32 Nucleo-64, F091RC.

Исходный код программы на github.

Для того, чтобы среда разработки Arduino могла работать с STM32 нужно поставить соответствующий модуль.

Используется аппаратный таймер в режиме счета импульсов, поступающих на вход «D2».

В процедуре void InputCapture_IT_callback(void) есть условие вида:

« if(isInputCapture >= 9) {», где число 9 задает количество отсчетов до срабатывания выхода «D4».

Процесс постановки опыта по записи осциллограммы одного обращения по сигнал CS3#:

1) установить значение условия срабатывания;

2) собрать и загрузить программу в плату;

3) запускать кнопкой RUN/STOP осциллограф в режим ожидания сигнала триггера;

4) подавать питание на жесткий диск.

Тестовая установка:

IMG_0963s

Пример осциллограммы цифрового анализатора:

IMG_0965s

Захват кадра цифровым анализатором (триггер) производится от положительного перепада на аналоговом канале 1 осциллографа. Так сделано потому, что по какой-то странной причине от цифрового входа захват кадра работает неверно. Аналоговый канал 1 подключен к сигналу срабатывания платы счетчика/синхронизатора, описанному выше.

Подключение цифрового анализатора к плате жесткого диска:

D0-D7 — младшие 8 бит шины данных процессора;

D8 — сигнал ALE, который показывает, что по линиям данных передается адрес;

D9 — сигнал WR#, в момент активности которого производится запись данных;

D10 — сигнал RD#, в момент активности которого производится чтение данных;

D11 — сигнал EXTINT1 обозначающий запрос на прерывание от микросхемы WD61C13A (в данном исследовании не используется).

А теперь, результаты поисков номерных транзакций — в студию! Сканирование первых 9 обращений к WD61C13A и сравнение с дизассемблером.

Шаг сканирования 0.

Какая-то странность первого срабатывания. Объяснения почему так у меня нет.

NewFile0_dz0

Видно, что CS3# длиться несколько транзакция явно не относящихся к обращению к микросхеме WD61C13A.

Шаг сканирования 1.

NewFile1_dz1

Белая вертикальная пунктирная линия соответствует фазе адреса. К микросхеме подключены только 8 бит шины адрес/данные. В этой фазе бит D0 = 1, D1 = 1, D2 = 0, D3 = 0, D4 = 0, D5 = 1, D6 = 0 и D7 = 1. Собираем биты: D[7:0] = 10100011 или в шестнадцатиричной форме 0xA3.

Найденный фрагмент кода:

WD61C13A_dz01

Инструкция stb записывает байт регистра EAX в ячейку памяти соответствующую обращению по CS3# и адресу 0xA3.

Когда сигнал D9 в нуле, а он соответствует сигналу процессора WR#, производится передача и запись байта данных в выбранный ранее адрес. Собираем из осциллограммы байт данный так же, как выше был собран байт адреса: D0 = 1, D1 = 0, D2 = 0, D3 = 0, D4 = 1, D5 = 1, D6 = 0 и D7 = 0. Собираем биты: D[7:0] = 00110001 = 0x31. В найденном фрагменте кода инструкция ldb загружает младший байт регистра EAX как раз кодом 0x31.

От старта программы управления диском — это действительно первое обращение. Все сошлось, т.е. мы явно на верном пути!

Шаг сканирования 2

NewFile2_dz2

Адрес: D[7:0] = 10000100 = 0x84.

Запись данных: D[7:0] = 11111111 = 0xFF.

Найденный фрагмент кода:

WD61C13A_dz02

Шаг сканирования 3

NewFile3_dz3

Адрес: D[7:0] = 10000100 = 0x81.

Запись данных: D[7:0] = 00001100 = 0x0C.

Адрес: D[7:0] = 10000100 = 0x81.

Запись данных: D[7:0] = 00000000 = 0x00.

Найденный фрагмент кода:

WD61C13A_dz03

Шаг сканирования 4

NewFile4_dz4

Адрес: D[7:0] = 10011000 = 0x98.

Обе записи 16-и битные!

Запись данных: D[7:0] = 10110100 = 0xB4.

Найденный фрагмент кода:

WD61C13A_dz04

Шаг сканирования 5

NewFile5_dz5

Адрес: D[7:0] = 10100010 = 0xA2.

Запись данных: D[7:0] = 00000010 = 0x02.

Найденный фрагмент кода:

WD61C13A_dz05

Шаг сканирования 6

NewFile6_dz6

Адрес: D[7:0] = 10000001 = 0x81.

Запись данных: D[7:0] = 00000001 = 0x01.

Найденный фрагмент кода:

WD61C13A_dz06

Шаг сканирования 7

NewFile7_dz7

Адрес: D[7:0] = 10011100 = 0x9C.

Чтение данных: D[7:0] = 00010101 = 0x15.

Адрес: D[7:0] = 10011100 = 0x9С.

Запись данных: D[7:0] = 00000000 = 0x00.

Найденный фрагмент кода:

WD61C13A_dz07

Шаг сканирования 8

NewFile8_dz8

Найденный фрагмент кода:

WD61C13A_dz08

Выводы:

1) Похоже, что STM32 как устройство-счетчик не особенно подходит. Он работает, но явно пропускает события. Нужно делать подобное устройство на ПЛИС. Но есть проблема с 5-ю вольтами…

2) Можно переходить к повторению всего наблюдаемого на своем макете, о котором говорилось в части 15.

Не забывайте делать бэкап. До новых встреч!

PS. Все публикации этой серии доступны по метке «WD21000».

Поделиться ссылкой на пост в соц. сетях

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *