ParallelSpiView (параллельный вывод)
Окно ParallelSpiView (меню → Options → ParallelSpiView) предназначено для диагностики работы микросхемы 5400NH065A-022 в режиме параллельной выдачи данных конвертера HAND. В этом режиме микросхема выдаёт данные через 4-битный параллельный интерфейс, что позволяет принимать неограниченный поток данных в реальном времени. В отличие от анализатора HandTap, который захватывает ограниченный буфер (192 отсчёта) через разделяемую RAM, ParallelSpiView обеспечивает непрерывное отображение двух каналов одновременно.
Принцип работы
Микросхема 5400NH065A-022 имеет режим параллельной выдачи, при котором данные конвертера HAND выдаются через 4-битный параллельный интерфейс. Каждые 16 тактовых циклов формируется один набор из четырёх 16-битных слов, которые на стороне ПК объединяются в два 28-битных значения — по одному на каждый канал (Addr1 и Addr2).
Ключевое отличие от HandTap:
| Параметр | HandTap | ParallelSpiView |
|---|---|---|
| Способ передачи | Разделяемая RAM + SPI | Параллельный вывод (4-бит) |
| Объём данных | 192 отсчёта (фиксированный буфер) | Неограниченный поток (циклическое чтение) |
| Количество каналов | 1 (HAND1 или HAND2) | 2 одновременно (Addr1 и Addr2) |
| Обновление | По запросу (кнопка) | Непрерывное (циклический опрос) |
| Команда МК | READ_HANDTAP (0x0E) | SET_DMA_QUAD (0x11) |
Расположение элементов
Окно ParallelSpiView открывается как отдельное плавающее окно и разделено на три области:
+------------------------------------------------------------------+
| Верхний график (Values) |
| Многоразрядные числовые сигналы каналов Addr1 и Addr2 |
+------------------------------------------------------------------+
| Панель управления: |
| [ON] Addr1:[▼] Addr2:[▼] [VC] [SDI] |
| [Loading...] [Trig:▼signal] [Scale] [____] |
+------------------------------------------------------------------+
| Нижний график (Signals) |
| Одноразрядные цифровые сигналы (exi, ex_ref, BSsin и пр.) |
+------------------------------------------------------------------+
- Верхний график (Values) — отображение многоразрядных числовых сигналов обоих каналов (например, sin, cos, координата, скорость). По горизонтали — номер отсчёта, по вертикали — значение.
- Панель управления — строка с кнопками и настройками (см. ниже).
- Нижний график (Signals) — отображение одноразрядных цифровых сигналов (например,
exi,exi_recovered).
На обоих графиках доступен курсор: клик левой кнопкой устанавливает вертикальную пунктирную линию, на пересечении которой с каждым сигналом отображается кружок и числовое значение. Правый клик убирает курсор.
Органы управления
| Элемент | Назначение |
|---|---|
| ON / OFF | Включение/выключение режима параллельной выдачи. Кнопка работает как toggle — при нажатии ON выполняется процедура включения (см. ниже), кнопка меняет текст на OFF. Повторное нажатие выключает режим и возвращает микросхему в исходное состояние. |
| Addr1 | Раскрывающийся список (0–7) для выбора адреса блока данных первого канала. Каждый пункт показывает номер адреса и список сигналов через запятую (например, «1 - Wca, BScos, ex_shifted, Wsa, BSsin, ex_ref»). Определяет, какие поля будут декодированы из первого потока. По умолчанию — 1 (SinCos). |
| Addr2 | Раскрывающийся список (0–7) для выбора адреса блока данных второго канала. По умолчанию — 2 (OutVirtSin). |
| VC | Флажок управления сигналом VC (Voltage Control). При установке отправляется команда SET_VC(1) на МК, при снятии — SET_VC(0). Управляет коммутацией каналов в параллельном потоке: при включённом VC потоки d/b назначаются на Addr1, а c/a — на Addr2; при выключенном — наоборот. |
| SDI | Флажок управления сигналом SDI (SPI Data Input). При установке отправляется SET_SDI(1), при снятии — SET_SDI(0). Управляет режимом SPI-интерфейса микросхемы. |
| Loading... / Stop | Запуск/остановка циклического чтения данных. При нажатии Loading... на МК отправляется команда с адресами Addr1/Addr2, затем начинается непрерывный циклический опрос данных. Кнопка меняет текст на Stop. |
| Trig | Флажок режима синхронизации (triggered). При установке данные обрезаются от первого положительного фронта выбранного одноразрядного сигнала (из раскрывающегося списка). |
| (раскрывающийся список) | Выбор одноразрядного сигнала для синхронизации (Trig). Заполняется автоматически после первого захвата данных на основе доступных 1-битных полей. |
| Scale | Флажок авто-масштабирования оси Y верхнего графика. При установке диапазон определяется автоматически по амплитуде данных (с округлением до сотен). Поле справа отображает текущее значение. |
| (поле Y-диапазона) | Текстовое поле, диапазон оси Y верхнего графика (± значение). Доступно только когда Scale снят. |
Включение и выключение режима
Включение (ON)
При нажатии кнопки ON выполняется следующая последовательность:
- Настройка C1 ResCntrl — в регистре C1ResCntrl сбрасывается бит
Enc_en, устанавливаются битыSPI_ext_en,Vel_from_cpu,Coord_from_cpu. - Настройка C2 ResCntrl — аналогично в регистре C2ResCntrl:
Enc_en= 0,SPI_ext_en= 1,Vel_from_cpu= 1,Coord_from_cpu= 1. - Отключение CPU1 — в регистре Mode_config (адрес 71) сбрасывается бит
CPU1_en. - Загрузка программы — в программную память CPU1 (начиная с адреса 512) загружается скомпилированная программа
dma_asm/cpu1_data.hex. - Включение CPU1 — в регистре Mode_config устанавливается бит
CPU1_en.
После успешного включения кнопка меняет текст на OFF, кнопка Loading... становится доступной.
Выключение (OFF)
При нажатии кнопки OFF:
- В регистре C1 ResCntrl сбрасываются биты
SPI_ext_en,Vel_from_cpu,Coord_from_cpu. - В регистре C2 ResCntrl сбрасываются биты
SPI_ext_en,Vel_from_cpu,Coord_from_cpu. - В регистре Mode_config сбрасывается бит
CPU1_en— CPU1 останавливается.
При выключении режима параллельной выдачи микросхема остаётся с отключённым CPU1. Для восстановления штатной работы необходимо перезагрузить микросхему или вручную загрузить рабочие программы CPU.
Процесс захвата данных
После нажатия Loading... выполняется следующая последовательность:
- Из полей Addr1 и Addr2 формируется составной адрес:
addr2 << 8 | addr1. - На МК отправляется команда
SET_DMA_QUAD(0x11) с подкомандой 1 и данными[addr1, addr2]. МК конфигурирует режим параллельной выдачи микросхемы для захвата двух потоков данных. - Выдерживается пауза 200 мс для стабилизации.
- Запускается циклический опрос — в бесконечном цикле на МК отправляется команда
SET_DMA_QUADс подкомандой 2 (чтение). МК считывает данные из параллельного интерфейса микросхемы и возвращает их на ПК. - Ответы обрабатываются таймером рендеринга (период опроса 40 мс). При получении нового ответа данные декодируются и отображаются на графиках.
Декодирование данных
Данные приходят от МК в упакованном виде. Декодирование выполняется следующим образом:
- Из ответа удаляются 8 байт заголовка и 1 байт контрольной суммы.
- Каждый байт разделяется на два 4-битных полубайта (nibble): старший и младший.
- Каждая группа из 16 полубайтов объединяется в четыре 16-битных слова (a, b, c, d) — по одному биту из каждого полубайта:
- Бит 0 каждого полубайта → поток a
- Бит 1 → поток b
- Бит 2 → поток c
- Бит 3 → поток d
- Пары потоков объединяются в 28-битные значения:
val = (stream_hi & 0xFFFF) | ((stream_lo & 0xFFF) << 16)
- Коммутация потоков зависит от флага VC:
| Флаг VC | Addr1 — потоки | Addr2 — потоки |
|---|---|---|
| Выключен | c (старшие) + a (младшие) | d (старшие) + b (младшие) |
| Включён | d (старшие) + b (младшие) | c (старшие) + a (младшие) |
- Каждое 28-битное значение разбирается на именованные поля в соответствии с адресом (Addr1 или Addr2) по таблице
HandValueSetting.
Адреса блоков данных
Поля Addr1 и Addr2 определяют, какие данные считываются из конвертера HAND. Адресация соответствует команде микровычислителя SET_A_HAND (подробнее в разделе CPU). Адреса одинаковы для обоих каналов:
| Addr | Блок | Поля на графике |
|---|---|---|
| 0 | Coord (Координата) | FullAngle (28 бит) |
| 1 | SinCos (АЦП) | Wca (12 бит, зн.), BScos, ex_shifted, Wsa (12 бит, зн.), BSsin, ex_ref |
| 2 | OutVirtSin | VirtualS (13 бит, зн.), ex_recovered_S, BSsin_V (13 бит, зн.), ex_recovered_90dgr_S |
| 3 | ErrAmpMetric | Amp_metric (12 бит), Err_metric (16 бит, зн.) |
| 4 | Vel (Скорость) | FullVel (28 бит, зн.) |
| 5 | PhiModel | PhiC (14 бит, зн.), PhiS (14 бит, зн.) |
| 6 | OutVirtCos | VirtualC (13 бит, зн.), ex_recovered_C, BScos_V (13 бит, зн.), ex_recovered_90dgr_C |
| 7 | Stat (Статус) | STAT (16 бит) |
Многоразрядные поля (размер > 1 бит) отображаются на верхнем графике Values. Одноразрядные поля — на нижнем графике Signals. Данные обоих адресов (Addr1 и Addr2) отображаются одновременно на одних графиках.
Режим синхронизации (Trig)
При установленном флаге Trig полученные данные обрезаются от первого обнаруженного положительного фронта выбранного одноразрядного сигнала (из раскрывающегося списка). Алгоритм ищет переход 0→1 в данных выбранного сигнала, и все данные (числовые и одноразрядные) обрезаются, оставляя только часть после фронта. Это позволяет привязать осциллограмму к определённой фазе сигнала.
Распространённый вариант — синхронизация по сигналу ex_ref (бит возбуждения) для анализа поведения контура синхронно с возбуждением.
Типичное использование
- Подключите микросхему и убедитесь в связи (Test Board → Find IC).
- Откройте Options → ParallelSpiView — появится отдельное окно.
- Нажмите ON — выполнится процедура включения (настройка регистров, загрузка программы CPU1).
- В раскрывающемся списке Addr1 выберите «1 - Wca, BScos, ex_shifted, Wsa, BSsin, ex_ref» для просмотра сигналов АЦП.
- В раскрывающемся списке Addr2 выберите «4 - FullVel» для одновременного просмотра скорости.
- При необходимости включите VC или SDI для управления коммутацией.
- Нажмите Loading... — начнётся непрерывный захват и отображение данных.
- Используйте курсор (клик на графике) для точного отсчёта значений.
- Для привязки к фазе возбуждения включите Trig и выберите сигнал
ex_ref. - По окончании нажмите Stop, затем OFF для выхода из режима параллельной выдачи.
Программа CPU1 режима параллельной выдачи
При включении режима в программную память CPU1 загружается программа из файла dma_asm/cpu1_data.hex. Она не записывает данные в разделяемую RAM. Вместо этого CPU1 работает в тесном цикле, непрерывно переключая адрес конвертера HAND и обеспечивая поток данных через параллельный интерфейс микросхемы. Адреса чтения/записи задаются через SPI-регистры МК, что позволяет динамически менять привязку каналов без перезагрузки программы CPU1.
Исходный текст программы — файл cpu1_com.asm:
CLR R0 ; R0 = 0 (аргумент для HFIX — фиктивный адрес)
CONST 4 R3 ; R3 = 4 (аргумент для HFIX — фиктивный адрес)
LOOP: LOAD32 SPI_0 R1 ; Прочитать адрес чтения из SPI_0 (Addr1 из UI)
LOAD32 SPI_2 R2 ; Прочитать адрес записи из SPI_2 (Addr2 из UI)
HFIX R1 ; Выбрать адрес чтения HAND (из SPI_0)
WAIT_EXT_HAND ; Ожидать обновление данных
LOAD32 HAND1_L R4 ; Прочитать 28-битное значение HAND → R4
HFIX R0 ; Выбрать фиктивный адрес (R0 = 0)
STORE32 HAND1_L R4 ; Записать значение в HAND (поток A/B)
HFIX R2 ; Выбрать адрес чтения HAND (из SPI_2)
LOAD32 HAND1_L R4 ; Прочитать 28-битное значение HAND → R4
HFIX R3 ; Выбрать фиктивный адрес (R3 = 4)
STORE32 HAND1_L R4 ; Записать значение в HAND (поток C/D)
JUMP LOOP ; Повторить
Описание алгоритма
Программа выполняется в бесконечном цикле (14 инструкций). Каждая итерация:
- Читает адрес чтения из
SPI_0(регистр IC 760, младший байт — это Addr1, заданный пользователем в UI). - Читает адрес записи из
SPI_2(задаётся МК при конфигурации — Addr2 или другой адрес для второго потока). - Выбирает адрес чтения HAND (HFIX R1), ожидает обновление данных через
WAIT_EXT_HAND, считывает 28-битное значение в R4. - Переключает на фиктивный адрес (HFIX R0 = 0), записывает значение через
STORE32— формирует данные для потока A/B через параллельный интерфейс. - Выбирает второй адрес чтения (HFIX R2), считывает очередное 28-битное значение.
- Переключает на фиктивный адрес (HFIX R3 = 4), записывает значение — данные для потока C/D.
Таким образом, за каждый проход цикла через параллельный интерфейс проходят данные от двух адресов конвертера, упакованные в 4-битный поток.
Адреса чтения/записи не жёстко заданы в программе — они поступают через SPI-регистры от МК. Это позволяет менять привязку каналов на лету: пользователь выбирает Addr1/Addr2 в UI, МК записывает их в SPI-регистры, и CPU1 немедленно начинает использовать новые адреса без перезагрузки программы.
Карта памяти CPU1
Программа использует следующее распределение памяти (адреса указаны в 14-битных словах):
| Адреса | Назначение |
|---|---|
| 0–14 | Программная память (код cpu1_com.asm, 15 инструкций) |
| 15–95 | Не используется (нули) |
| 96–223 | Буфер TAPBUF_0 (128 слов) — не используется в данном режиме |
| 224–229 | ROM-константы |
| 230 | CONST_50 = 0x50 (80) |
| 231 | CONST_7F = 0x7F (127) |
| 232–234 | Зарезервировано |
| 235 | PREV_EX_REF — предыдущее значение бита EXI |
| 236 | TO_OUT_READY — флаг готовности данных |
| 237 | BUFFERED_SPI_0 — буфер SPI |
| 238–239 | Константы (50, 7F) |
| 240–247 | EXTCPU_0 … EXTCPU_7 — регистры внешнего CPU |
| 248–251 | SPI_0 … SPI_3 — данные SPI от МК |
| 252–255 | HAND1_L, HAND1_H, HAND2_L, HAND2_H — данные конвертера HAND |
| 256–319 | BUF_L_0/BUF_H_0 … BUF_L_31/BUF_H_31 — буфер 32 записи |
| 320–383 | BUF_L_32/BUF_H_32 … BUF_L_63/BUF_H_63 — буфер (продолжение) |
Состав файлов проекта dma_asm
Проект dma_asm в директории dist/risc_programs/dma_asm/ содержит:
| Файл | Тип | Описание |
|---|---|---|
cpu1_com.asm | ASM | Исходный текст программы CPU1 (15 инструкций) |
cpu1_data.hex | HEX | Скомпилированный образ CPU1 (512 × 14-битных слов) — загружается по адресу 512 |
cpu1_ram.txt | TXT | Карта памяти CPU1 с символьными именами |
cpu2_com.asm | ASM | Исходный текст программы CPU2 (не используется в текущей реализации) |
cpu2_data.hex | HEX | Скомпилированный образ CPU2 |
cpu2_ram.txt | TXT | Карта памяти CPU2 |
base_ram.txt | TXT | Начальные значения базовой RAM микросхемы (96 × 16-битных слов) |
base_ram.hex | HEX | Скомпилированный образ базовой RAM |
mode.config | CFG | Конфигурация загрузки: типы файлов, размеры, адреса |
Взаимодействие CPU1, МК и ПК — полная диаграмма
┌──────────┐ SET_DMA_QUAD ┌──────────────┐ SPI ┌───────────────┐
│ ПК │ ──────────────► │ МК (ESP32) │ ───────────► │ IC 5400NH │
│ (Java) │ (USB CDC) │ LED Console │ конфигурация│ 065A-022 │
│ │ │ │ │ │
│ │ ◄────────────── │ │ ◄─────────── │ CPU1 │
│ │ Данные │ │ 4-бит паралл│ (программа │
│ │ (USB CDC) │ │ чтение │ паралл. │
└──────────┘ └──────────────┘ │ выдачи) │
└───────────────┘
- ПК отправляет команду
SET_DMA_QUAD(0x11) на МК с подкомандой 1 и адресами[addr1, addr2]. - МК конфигурирует режим параллельной выдачи микросхемы через SPI.
- CPU1 (программа
cpu1_com.asm) выполняет непрерывный цикл чтения/записи данных конвертера HAND, обеспечивая поток данных через параллельный интерфейс. - МК циклически отправляет
SET_DMA_QUADс подкомандой 2, считывает 4-битные параллельные данные из микросхемы. - МК передаёт данные на ПК через USB CDC.
- ПК декодирует 4 параллельных потока, объединяет в два 28-битных значения, разбирает на поля и отображает на графиках.
Режим параллельной выдачи микросхемы 5400NH065A-022 обеспечивает непрерывный поток данных без ограничений на количество отсчётов. В текущей реализации ПО каждый цикл опроса возвращает один кадр данных, который немедленно отображается на графиках. Обновление происходит с периодом таймера рендеринга (40 мс), что обеспечивает частоту обновления около 25 кадров/с.