Перейти к основному содержимому

ParallelSpiView (параллельный вывод)

Окно ParallelSpiView (меню → Options → ParallelSpiView) предназначено для диагностики работы микросхемы 5400NH065A-022 в режиме параллельной выдачи данных конвертера HAND. В этом режиме микросхема выдаёт данные через 4-битный параллельный интерфейс, что позволяет принимать неограниченный поток данных в реальном времени. В отличие от анализатора HandTap, который захватывает ограниченный буфер (192 отсчёта) через разделяемую RAM, ParallelSpiView обеспечивает непрерывное отображение двух каналов одновременно.

Окно ParallelSpiView

Принцип работы

Микросхема 5400NH065A-022 имеет режим параллельной выдачи, при котором данные конвертера HAND выдаются через 4-битный параллельный интерфейс. Каждые 16 тактовых циклов формируется один набор из четырёх 16-битных слов, которые на стороне ПК объединяются в два 28-битных значения — по одному на каждый канал (Addr1 и Addr2).

Ключевое отличие от HandTap:

ПараметрHandTapParallelSpiView
Способ передачиРазделяемая 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 выполняется следующая последовательность:

  1. Настройка C1 ResCntrl — в регистре C1ResCntrl сбрасывается бит Enc_en, устанавливаются биты SPI_ext_en, Vel_from_cpu, Coord_from_cpu.
  2. Настройка C2 ResCntrl — аналогично в регистре C2ResCntrl: Enc_en = 0, SPI_ext_en = 1, Vel_from_cpu = 1, Coord_from_cpu = 1.
  3. Отключение CPU1 — в регистре Mode_config (адрес 71) сбрасывается бит CPU1_en.
  4. Загрузка программы — в программную память CPU1 (начиная с адреса 512) загружается скомпилированная программа dma_asm/cpu1_data.hex.
  5. Включение CPU1 — в регистре Mode_config устанавливается бит CPU1_en.

После успешного включения кнопка меняет текст на OFF, кнопка Loading... становится доступной.

Выключение (OFF)

При нажатии кнопки OFF:

  1. В регистре C1 ResCntrl сбрасываются биты SPI_ext_en, Vel_from_cpu, Coord_from_cpu.
  2. В регистре C2 ResCntrl сбрасываются биты SPI_ext_en, Vel_from_cpu, Coord_from_cpu.
  3. В регистре Mode_config сбрасывается бит CPU1_en — CPU1 останавливается.
предупреждение

При выключении режима параллельной выдачи микросхема остаётся с отключённым CPU1. Для восстановления штатной работы необходимо перезагрузить микросхему или вручную загрузить рабочие программы CPU.

Процесс захвата данных

После нажатия Loading... выполняется следующая последовательность:

  1. Из полей Addr1 и Addr2 формируется составной адрес: addr2 << 8 | addr1.
  2. На МК отправляется команда SET_DMA_QUAD (0x11) с подкомандой 1 и данными [addr1, addr2]. МК конфигурирует режим параллельной выдачи микросхемы для захвата двух потоков данных.
  3. Выдерживается пауза 200 мс для стабилизации.
  4. Запускается циклический опрос — в бесконечном цикле на МК отправляется команда SET_DMA_QUAD с подкомандой 2 (чтение). МК считывает данные из параллельного интерфейса микросхемы и возвращает их на ПК.
  5. Ответы обрабатываются таймером рендеринга (период опроса 40 мс). При получении нового ответа данные декодируются и отображаются на графиках.

Декодирование данных

Данные приходят от МК в упакованном виде. Декодирование выполняется следующим образом:

  1. Из ответа удаляются 8 байт заголовка и 1 байт контрольной суммы.
  2. Каждый байт разделяется на два 4-битных полубайта (nibble): старший и младший.
  3. Каждая группа из 16 полубайтов объединяется в четыре 16-битных слова (a, b, c, d) — по одному биту из каждого полубайта:
    • Бит 0 каждого полубайта → поток a
    • Бит 1 → поток b
    • Бит 2 → поток c
    • Бит 3 → поток d
  4. Пары потоков объединяются в 28-битные значения:
    • val = (stream_hi & 0xFFFF) | ((stream_lo & 0xFFF) << 16)
  5. Коммутация потоков зависит от флага VC:
Флаг VCAddr1 — потокиAddr2 — потоки
Выключенc (старшие) + a (младшие)d (старшие) + b (младшие)
Включёнd (старшие) + b (младшие)c (старшие) + a (младшие)
  1. Каждое 28-битное значение разбирается на именованные поля в соответствии с адресом (Addr1 или Addr2) по таблице HandValueSetting.

Адреса блоков данных

Поля Addr1 и Addr2 определяют, какие данные считываются из конвертера HAND. Адресация соответствует команде микровычислителя SET_A_HAND (подробнее в разделе CPU). Адреса одинаковы для обоих каналов:

AddrБлокПоля на графике
0Coord (Координата)FullAngle (28 бит)
1SinCos (АЦП)Wca (12 бит, зн.), BScos, ex_shifted, Wsa (12 бит, зн.), BSsin, ex_ref
2OutVirtSinVirtualS (13 бит, зн.), ex_recovered_S, BSsin_V (13 бит, зн.), ex_recovered_90dgr_S
3ErrAmpMetricAmp_metric (12 бит), Err_metric (16 бит, зн.)
4Vel (Скорость)FullVel (28 бит, зн.)
5PhiModelPhiC (14 бит, зн.), PhiS (14 бит, зн.)
6OutVirtCosVirtualC (13 бит, зн.), ex_recovered_C, BScos_V (13 бит, зн.), ex_recovered_90dgr_C
7Stat (Статус)STAT (16 бит)

Многоразрядные поля (размер > 1 бит) отображаются на верхнем графике Values. Одноразрядные поля — на нижнем графике Signals. Данные обоих адресов (Addr1 и Addr2) отображаются одновременно на одних графиках.

Режим синхронизации (Trig)

При установленном флаге Trig полученные данные обрезаются от первого обнаруженного положительного фронта выбранного одноразрядного сигнала (из раскрывающегося списка). Алгоритм ищет переход 0→1 в данных выбранного сигнала, и все данные (числовые и одноразрядные) обрезаются, оставляя только часть после фронта. Это позволяет привязать осциллограмму к определённой фазе сигнала.

Распространённый вариант — синхронизация по сигналу ex_ref (бит возбуждения) для анализа поведения контура синхронно с возбуждением.

Типичное использование

  1. Подключите микросхему и убедитесь в связи (Test Board → Find IC).
  2. Откройте Options → ParallelSpiView — появится отдельное окно.
  3. Нажмите ON — выполнится процедура включения (настройка регистров, загрузка программы CPU1).
  4. В раскрывающемся списке Addr1 выберите «1 - Wca, BScos, ex_shifted, Wsa, BSsin, ex_ref» для просмотра сигналов АЦП.
  5. В раскрывающемся списке Addr2 выберите «4 - FullVel» для одновременного просмотра скорости.
  6. При необходимости включите VC или SDI для управления коммутацией.
  7. Нажмите Loading... — начнётся непрерывный захват и отображение данных.
  8. Используйте курсор (клик на графике) для точного отсчёта значений.
  9. Для привязки к фазе возбуждения включите Trig и выберите сигнал ex_ref.
  10. По окончании нажмите 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 инструкций). Каждая итерация:

  1. Читает адрес чтения из SPI_0 (регистр IC 760, младший байт — это Addr1, заданный пользователем в UI).
  2. Читает адрес записи из SPI_2 (задаётся МК при конфигурации — Addr2 или другой адрес для второго потока).
  3. Выбирает адрес чтения HAND (HFIX R1), ожидает обновление данных через WAIT_EXT_HAND, считывает 28-битное значение в R4.
  4. Переключает на фиктивный адрес (HFIX R0 = 0), записывает значение через STORE32 — формирует данные для потока A/B через параллельный интерфейс.
  5. Выбирает второй адрес чтения (HFIX R2), считывает очередное 28-битное значение.
  6. Переключает на фиктивный адрес (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–229ROM-константы
230CONST_50 = 0x50 (80)
231CONST_7F = 0x7F (127)
232–234Зарезервировано
235PREV_EX_REF — предыдущее значение бита EXI
236TO_OUT_READY — флаг готовности данных
237BUFFERED_SPI_0 — буфер SPI
238–239Константы (50, 7F)
240–247EXTCPU_0EXTCPU_7 — регистры внешнего CPU
248–251SPI_0SPI_3 — данные SPI от МК
252–255HAND1_L, HAND1_H, HAND2_L, HAND2_H — данные конвертера HAND
256–319BUF_L_0/BUF_H_0BUF_L_31/BUF_H_31 — буфер 32 записи
320–383BUF_L_32/BUF_H_32BUF_L_63/BUF_H_63 — буфер (продолжение)

Состав файлов проекта dma_asm

Проект dma_asm в директории dist/risc_programs/dma_asm/ содержит:

ФайлТипОписание
cpu1_com.asmASMИсходный текст программы CPU1 (15 инструкций)
cpu1_data.hexHEXСкомпилированный образ CPU1 (512 × 14-битных слов) — загружается по адресу 512
cpu1_ram.txtTXTКарта памяти CPU1 с символьными именами
cpu2_com.asmASMИсходный текст программы CPU2 (не используется в текущей реализации)
cpu2_data.hexHEXСкомпилированный образ CPU2
cpu2_ram.txtTXTКарта памяти CPU2
base_ram.txtTXTНачальные значения базовой RAM микросхемы (96 × 16-битных слов)
base_ram.hexHEXСкомпилированный образ базовой RAM
mode.configCFGКонфигурация загрузки: типы файлов, размеры, адреса

Взаимодействие CPU1, МК и ПК — полная диаграмма

┌──────────┐ SET_DMA_QUAD ┌──────────────┐ SPI ┌───────────────┐
│ ПК │ ──────────────► │ МК (ESP32) │ ───────────► │ IC 5400NH │
│ (Java) │ (USB CDC) │ LED Console │ конфигурация│ 065A-022 │
│ │ │ │ │ │
│ │ ◄────────────── │ │ ◄─────────── │ CPU1 │
│ │ Данные │ │ 4-бит паралл│ (программа │
│ │ (USB CDC) │ │ чтение │ паралл. │
└──────────┘ └──────────────┘ │ выдачи) │
└───────────────┘
  1. ПК отправляет команду SET_DMA_QUAD (0x11) на МК с подкомандой 1 и адресами [addr1, addr2].
  2. МК конфигурирует режим параллельной выдачи микросхемы через SPI.
  3. CPU1 (программа cpu1_com.asm) выполняет непрерывный цикл чтения/записи данных конвертера HAND, обеспечивая поток данных через параллельный интерфейс.
  4. МК циклически отправляет SET_DMA_QUAD с подкомандой 2, считывает 4-битные параллельные данные из микросхемы.
  5. МК передаёт данные на ПК через USB CDC.
  6. ПК декодирует 4 параллельных потока, объединяет в два 28-битных значения, разбирает на поля и отображает на графиках.
к сведению

Режим параллельной выдачи микросхемы 5400NH065A-022 обеспечивает непрерывный поток данных без ограничений на количество отсчётов. В текущей реализации ПО каждый цикл опроса возвращает один кадр данных, который немедленно отображается на графиках. Обновление происходит с периодом таймера рендеринга (40 мс), что обеспечивает частоту обновления около 25 кадров/с.