"Защелкнуть" SPI (LE / CS / SS) для определенного количества циклов SCLK?
Контекст
Я работаю над проектом, который включает в себя 13 каскадных светодиодов STMicroelectronics LED1642GWs. Эти драйверы светодиодов по существу представляют собой 16-битные регистры сдвига, благодаря чему буферизованные последовательные данные могут быть загружены в несколько различных регистров в зависимости от требуемой функции.
Функция выбирается с помощью "цифровых клавиш", которые выбираются по количеству циклов CLK, для которых вывод LE (CS / SS) является ВЫСОКИМ. Например, значение LE, являющееся ВЫСОКИМ для 1-2 циклов CLK, переключит 16 выходов в соответствии с буферизованными битами, тогда как значение LE, являющееся ВЫСОКИМ для 3-4 циклов CLK, загрузит 16 бит в регистр яркости.
Вопрос
Как я могу переключить свой вывод LE / CS / SS на определенное количество циклов SCLK? Я намеревался использовать библиотеку SPI, однако я не уверен, что это может быть поддержано.
Большое спасибо!
@George Kerwood, 👍1
Обсуждение1 ответ
Лучший ответ:
Я добился этого путем "битового удара" с помощью модифицированного 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) с временным файлом, обеспечивающим цифровой ключ. Это выглядело следующим образом:
Работая на Arduino Nano 33 IoT, он работал на частоте 150 кГц, что достаточно для моего приложения.
- Зависит ли код shiftOut от (низкой) скорости Arduino?
- Точечная матрица arduino выключить прерывистый светодиод
- Как использовать SPI на Arduino?
- Как увеличить скорость записи на SD-карту в Ардуино
- Как считывать данные с помощью Arduino SPI
- Как передать более 1 байта сразу по шине SPI?
- OVF в последовательном мониторе вместо данных
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
SPI работает с байтами, а не с отдельными тактами. Вам придется немного изменить свой собственный протокол., @Majenko
Ну, он все равно может быть записан как полные байты, "3-4 такта" записываются как 0x7 или 0xF, например (00000111 или 00001111). Это просто запись в файл, и это та часть, которую я не могу понять., @George Kerwood
Да, но вы можете запускать свой файл только на тактах, кратных 8 тактам. Вам придется немного изменить свой собственный протокол. Это совсем не сложно., @Majenko