Добавить очереди операций PBUS/SBUS, общую консоль, настройки Candle и SLCAN, декодеры DSView и обработку плотных графиков. Обновить протокол Бальзам и проверки общих компонентов.
124 lines
9.6 KiB
Markdown
124 lines
9.6 KiB
Markdown
# Декодеры DSView для шин 96-контактного интерфейса
|
||
|
||
Два независимых декодера: **Plates PBus** и **Plates SBus**. Показывают
|
||
адрес устройства, регистр, сырые 16-битные данные, результат проверок
|
||
и итог каждого обращения. Повторные одинаковые обращения выводятся отдельно.
|
||
|
||
Декодеры устанавливаются в DSView и разбирают цифровой захват шин,
|
||
используемых с SETGUI. Формат взят из `ParallelBusSlave_ver_2_0.vhd`
|
||
и `SerialBusSlave_ver_2_0.vhd` из `ip_repo` репозитория PlatesSim. Зависимости
|
||
от установленного SETGUI или PlatesConf нет. Число 96 относится
|
||
к разъёму; ширина данных PBus составляет 16 бит.
|
||
|
||
## Установка
|
||
|
||
1. Закрыть DSView.
|
||
2. Скопировать обе папки `plates_pbus` и `plates_sbus` из `decoders`
|
||
в каталог `decoders` используемой установки DSView. Внутри каждой
|
||
папки должны непосредственно лежать `__init__.py` и `pd.py`.
|
||
3. Открыть DSView, загрузить захват или получить новый.
|
||
4. В списке декодеров выбрать **Plates PBus** либо **Plates SBus**
|
||
и назначить соответствующие каналы анализатора. При одновременном
|
||
захвате обеих шин добавить оба декодера.
|
||
|
||
Используется sigrok API 3 и синтаксис Python 3.6+. Формат декодеров
|
||
сверён со штатными пакетами установленного DSView и
|
||
[исходниками DSView](https://github.com/DreamSourceLab/DSView/tree/master/libsigrokdecode4DSL/decoders).
|
||
Общие сведения о пользовательских декодерах — в
|
||
[инструкции производителя](https://dreamsourcelab.cn/logic-analyzer/protocol_decoder_howto/).
|
||
|
||
## Каналы PBus
|
||
|
||
| Сигнал декодера | Подключение | Назначение |
|
||
| --- | --- | --- |
|
||
| PBCE | `pbce` | Низкий уровень разрешает транзакцию |
|
||
| PBACK | `pback` | Подтверждения адреса, данных и инверсии |
|
||
| D0…D15 | `pbdata[0]`…`pbdata[15]` | Все 16 разрядов общей двунаправленной шины |
|
||
| PBCLK | `pbclk`, необязательно | Проверка уровня тактовой линии в фазах ответа |
|
||
|
||
Для полного декодирования PBus требуется **18 каналов**, с PBCLK — 19.
|
||
Анализатор на 16 каналов не захватит полный набор одновременно.
|
||
Назначать D0…D15 по номерам разрядов шины, а номера контактов
|
||
96-контактного разъёма брать из схемы конкретной платы.
|
||
|
||
Операция начинается со спада PBCE. Первый спад PBACK подтверждает адрес:
|
||
`PBDATA[15:8] = dev*16 + reg`, `PBDATA[7:0] = ~PBDATA[15:8]`.
|
||
Следующий подъём PBACK подтверждает 16-битные данные; следующий спад —
|
||
их 16-битную инверсию. При назначенном PBCLK данные должны подтверждаться
|
||
при CLK=0, инверсия — при CLK=1. Выборка слов выполняется по ACK.
|
||
|
||
Неверная инверсия адреса, неверная инверсия ответа, нарушение фазы CLK
|
||
и незавершённое ожидание ACK выводятся отдельными предупреждениями.
|
||
Снятие CE до завершения или конец захвата сохраняют частичную операцию
|
||
с признаком `complete=False`. Начальный фрагмент захвата с уже низким CE
|
||
пропускается до следующего полного начала транзакции.
|
||
|
||
## Каналы SBus
|
||
|
||
| Сигнал декодера | Подключение | Направление |
|
||
| --- | --- | --- |
|
||
| SBCLK | `sbclk` | Тактовая линия мастера |
|
||
| SBDATAIN | `sbdatain` | ТМС → платы |
|
||
| SBDATAOUT | `sbdataout` | Платы → ТМС |
|
||
|
||
Для SBus достаточно **трёх каналов**. Имена IN/OUT соответствуют
|
||
входу и выходу ведомого блока в HDL.
|
||
|
||
Кадр содержит 29 бит старшим вперёд: направление (0 — чтение,
|
||
1 — запись), устройство (4), регистр (4), данные (16), CRC (4).
|
||
Декодер выбирает биты по нарастающим фронтам SBCLK. Заголовок и данные
|
||
записи идут по SBDATAIN; данные чтения и CRC ответа — по SBDATAOUT.
|
||
CRC учитывает все 25 бит направления, адреса и данных, а затем
|
||
четыре завершающие единицы по алгоритму HDL. Это собственный алгоритм,
|
||
его нельзя заменять произвольным штатным CRC-4.
|
||
|
||
| Параметр | По умолчанию | Смысл |
|
||
| --- | --- | --- |
|
||
| Frame gap (us) | 3,6 мкс | Минимальное время неподвижного CLK для синхронизации нового кадра |
|
||
| Write ACK sampling delay (us) | 0,5 мкс | Задержка выборки SBDATAOUT после последнего бита CRC записи |
|
||
|
||
Пауза учитывается при обоих уровнях CLK. Значение 3,6 мкс взято
|
||
из текущих COUNT_RESET=180 и частоты блока SBus 50 МГц.
|
||
Задержка ACK 0,5 мкс — настраиваемая точка наблюдения после проверки CRC
|
||
и до сброса по паузе. Для другого ведомого или других времён обмена
|
||
параметры нужно согласовать с захватом. Межкадровая пауза должна превышать
|
||
длительность обычного неподвижного участка CLK внутри кадра;
|
||
задержка ACK должна быть положительной и меньше межкадровой паузы.
|
||
|
||
Низкий SBDATAOUT в точке выборки подтверждает запись. Высокий уровень
|
||
помечается `ACK HIGH (NACK / no response)`: по одному уровню нельзя
|
||
отличить отказ от отсутствия платы. CRC и ACK показываются независимо.
|
||
ACK frontend PlatesSim подтверждает CRC, но не доказывает помещение
|
||
команды в FIFO или её применение CPU1.
|
||
|
||
Если файл закончился до выборки ACK, полная запись сохраняется с `ack=None`.
|
||
Частичный кадр отмечается числом полученных битов; следующий кадр
|
||
синхронизируется после паузы. В начале захвата SBus ожидает наблюдаемую
|
||
паузу, чтобы фрагмент уже идущего обмена не стал ложным заголовком.
|
||
При записи включать в захват паузу перед первым кадром и время после CRC.
|
||
|
||
## Проверки и границы подтверждённого
|
||
|
||
Из корня репозитория:
|
||
|
||
```powershell
|
||
python -m unittest discover -s tools/dsview/tests -p test_plates_buses.py -v # Проверка декодеров на цифровых трассах без запуска DSView.
|
||
```
|
||
|
||
21 тест проверяет оба направления SBus, CRC, отдельную выборку ACK,
|
||
повторы, паузы обоих уровней, восстановление синхронизации, края диапазонов
|
||
PBus, обе инверсные проверки, фазы ACK, отсутствие каналов и обрывы захвата.
|
||
Среда тестов исполняет рабочие методы `decode()` и `end()` через подмену
|
||
API ожидания событий; сигналы формируются независимо от автоматов декодеров.
|
||
Дополнительно проверены синтаксис Python 3.6 и UTF-8 исходников.
|
||
|
||
Загрузка новых пакетов в интерфейсе DSView и захват физического обмена
|
||
с SETGUI пока не проверены. Номера контактов разъёма и соответствие каналам
|
||
анализатора задаются по фактическому подключению. Модели отдельных линий
|
||
TK/PWM/ACK в эти декодеры не входят.
|
||
|
||
Python-выход каждого декодера содержит `['FRAME', словарь]`. Общие поля:
|
||
`bus`, `operation`, `dev`, `reg`, `value`. У SBus отдельно доступны `crc`,
|
||
`crc_expected`, `crc_ok`, `ack`; у PBus — `address_word`, `address_ok`,
|
||
`inverse`, `inverse_ok`, `errors`, `complete`, `ok`.
|