Преобразование кода ESP32 SPI в Arduino для платы драйвера MAX6921 IV-18

Я купил модуль драйвера трубки VFD IV-18, который шел вместе с некоторым примером кода для платы ESP32. Модуль драйвера имеет 20 выходных последовательных микросхем MAX6921 для привода вакуумной трубки. Я хочу использовать этот модуль драйвера с Arduino Uno, а затем, в конечном счете, с Raspberry Pi.

Я думаю , что у меня есть очень приблизительное понимание электроники и демонстрационного кода, но, похоже, я не могу заставить свои SPI-вызовы работать. Вместо того чтобы пытаться перевести демонстрационный код целиком, моя первая цель-просто заставить засветиться один сегмент.

Краткая предыстория

Трубка IV18 имеет 9 решеток. Первая сетка имеет только точку и тире, но остальные 8 сетки имеют 7 сегментов и десятичную точку.

IV-18 Tube

Чтобы зажечь сегмент, вы подаете питание на контакты сегмента / десятичную точку и на сетку для этого сегмента. Чтобы отобразить несколько чисел, вы должны быстро циклически освещать каждую из позиций сетки и соответствующие сегменты для этой позиции. Если вы пройдете этот цикл достаточно быстро, человеческий глаз увидит всю сетку с числами (постоянство зрения).

То, что я пробовал

До сих пор я подключал Arduino Uno к плате драйвера

Driver GND   - Uno GND
Driver 5V    - Uno +5V
Driver Din   - Uno digital pin 11 / MOSI
Driver CLK   - Uno digital pin 13 / SCK
Driver LOAD  - Uno digital pin 2
Driver BLANK - Uno digital pin 3
Driver Dout  - Not connected

Пример кода содержит шестнадцатеричные коды, которые, как я полагаю, затем переводятся в 24-битный буфер (хотя требуется только 17 бит) для отправки через SPI для установки ВЫСОКИХ или НИЗКИХ выходов MAX6921.

Я думаю, что необходимые биты следующие:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
G7 G6 G5 G4 G3 G2 G1 G0 SEG_G SEG_F SEG_E SEG_D SEG_C SEG_B СЕГ_А ЗНАК ДП

Поэтому, чтобы осветить число 8 в самой правой сетке, я предположил, что мне понадобится 8-й бит high (сетка) и биты 9,10,11,12,13,14 и 15 для 7 семен для "8".

В своей функции настройки я вызываю SPI.begin, а затем SPI.transfer с тем, что, как я предполагал, было соответствующими двоичными данными (справа налево, я думаю, из-за порядка битов LSB/MSB?):

SPI.transfer(0b000000000111111110000000);

Этот свет первой сетке (то что после диплома и знака "минус"), но не чего я хочу, - я вижу, что некоторые сегменты левая решетка (полной сетки, не таблицы с точкой и минус), но эти легкие в разной фактуры каждый раз (изменяется каждый раз, когда я сбросить и повторно загрузить что я думаю, что вполне ожидаемо, когда я нажимаю данные в MAX6921 каждый раз).

Пока что это мой код

#include "SPI.h"

#define DISP_CLK 13   // White - SPI SCK
#define DISP_DATA 11  // Yellow - SPI MOSI
#define DISP_LOAD 2   // Blue
#define DISP_BLANK 3  // Green


void setup() {
  Serial.begin(9600);
  Serial.println("IV18 Test");

  SPI.begin();

  pinMode(DISP_BLANK, OUTPUT);
  digitalWrite(DISP_BLANK, LOW);
  
  pinMode(DISP_LOAD, OUTPUT);
  digitalWrite(DISP_LOAD, HIGH);

  SPI.transfer(0b000000000111111110000000);
}


void loop() {

}

Я почти уверен, что две фундаментальные вещи, которые я неправильно здесь, - это биты данных для отправки, а затем правильное использование SPI.

Может ли кто-нибудь помочь мне правильно понять код ESP32 и в идеале помочь мне получить правильные данные для отправки через SPI, чтобы я мог осветить сегменты и позиции сетки, которые я ожидаю.

, 👍2

Обсуждение

SPI.transfer() служит только для часов и записи/чтения MOSI/MISO. Это не приносит CS низкий уровень для выбора ведомого SPI., @Sim Son


1 ответ


2

Так что, оказывается, я кое в чем ошибся.

ОБНОВЛЕНИЕ: Рабочий код теперь на моем GitHub, если кто-то заинтересован.

Во-первых, я неправильно понял пример кода и перепутал биты для отправки на MAX6921. Чтобы выработать правильное отображение, я пошел и исследовал каждый вывод IV-18 и отметил соединение с выводами / выходами MAX6921, которое дало мне эту таблицу:

БИТ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
IV-18 G9 G8 G7 G6 G5 G4 G3 G2 G1 А Б В D E F Г ДП
МАКС 6921 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Обратите внимание что значение MAX6921 это ВЫХОДНОЙ номер а не КОНТАКТ

Затем это дало мне правильный порядок отправки каждого бита, как указано в верхней строке таблицы.

Следующей ошибкой была попытка отправить все 24 бита за один раз. Вместо этого я разбил каждый байт на отдельный вызов SPI.transfer (), который, наконец, позволил мне отобразить сегменты в том положении сетки, которое я ожидал.

Например, чтобы отобразить "ПРИВЕТ", моя функция цикла имеет следующее значение:

void loop() {
  //             XXXXXXXDP                 GFEDCBA1                  23456789
  SPI.transfer(0b00000000); SPI.transfer(0b11101100); SPI.transfer(0b10000000); delay(1);
  SPI.transfer(0b00000000); SPI.transfer(0b11110010); SPI.transfer(0b01000000); delay(1);
  SPI.transfer(0b00000000); SPI.transfer(0b01110000); SPI.transfer(0b00100000); delay(1);
  SPI.transfer(0b00000000); SPI.transfer(0b01110000); SPI.transfer(0b00010000); delay(1);
  SPI.transfer(0b00000001); SPI.transfer(0b01111110); SPI.transfer(0b00001000); delay(1);
}

IV-18 with hello message

У меня есть настройка TIMER1 для использования вместо кода цикла/задержки, так что, надеюсь, я смогу закончить преобразование остальной части примера кода в Arduino.

,