"Защелкнуть" SPI (LE / CS / SS) для определенного количества циклов SCLK?

Контекст

Я работаю над проектом, который включает в себя 13 каскадных светодиодов STMicroelectronics LED1642GWs. Эти драйверы светодиодов по существу представляют собой 16-битные регистры сдвига, благодаря чему буферизованные последовательные данные могут быть загружены в несколько различных регистров в зависимости от требуемой функции.

Функция выбирается с помощью "цифровых клавиш", которые выбираются по количеству циклов CLK, для которых вывод LE (CS / SS) является ВЫСОКИМ. Например, значение LE, являющееся ВЫСОКИМ для 1-2 циклов CLK, переключит 16 выходов в соответствии с буферизованными битами, тогда как значение LE, являющееся ВЫСОКИМ для 3-4 циклов CLK, загрузит 16 бит в регистр яркости.

Digital Keys

Вопрос

Как я могу переключить свой вывод LE / CS / SS на определенное количество циклов SCLK? Я намеревался использовать библиотеку SPI, однако я не уверен, что это может быть поддержано.

Большое спасибо!

, 👍1

Обсуждение

SPI работает с байтами, а не с отдельными тактами. Вам придется немного изменить свой собственный протокол., @Majenko

Ну, он все равно может быть записан как полные байты, "3-4 такта" записываются как 0x7 или 0xF, например (00000111 или 00001111). Это просто запись в файл, и это та часть, которую я не могу понять., @George Kerwood

Да, но вы можете запускать свой файл только на тактах, кратных 8 тактам. Вам придется немного изменить свой собственный протокол. Это совсем не сложно., @Majenko


1 ответ


Лучший ответ:

4

Я добился этого путем "битового удара" с помощью модифицированного shiftOut() ArduinoCore-avr/cores/arduino/wiring_shift.c, по сути, позволяя использовать две строки данных с одинаковой тактовой частотой:

void keyedShiftOut(
  uint8_t dataPin,
  uint8_t clockPin,
  uint8_t latchPin,
  uint8_t bitOrder,
  uint16_t val,
  uint16_t key)
{
    uint8_t i;

    for (i = 0; i < 16; i++)  {
        if (bitOrder == LSBFIRST) {
            digitalWrite(dataPin, val & 1);
            val >>= 1;
            digitalWrite(latchPin, key & 1);
            key >>= 1;
        } else {    
            digitalWrite(dataPin, (val & 0x8000) != 0);
            val <<= 1;
            digitalWrite(latchPin, (key & 0x8000) != 0);
            key <<= 1;
        }
            
        digitalWrite(clockPin, HIGH);
        digitalWrite(clockPin, LOW);        
    }
}

Я использовал это для реализации последовательности, описанной в техническом описании (рис. 24. Настройка регистра яркости), чтобы установить для всех моих 16 регистров яркости половинное значение (0x7FFF) с временным файлом, обеспечивающим цифровой ключ. Это выглядело следующим образом:

ScopeOutput

Работая на Arduino Nano 33 IoT, он работал на частоте 150 кГц, что достаточно для моего приложения.

,