Команда SPI против данных?
У меня есть сук ЖК-дисплей TFT сенсорный экран для Arduino UNO R3.
А Для инициализации мне даются следующие команды:
write_SPI_commond(0xFF);
write_SPI_commond(0xFF);
delay_nms(5);
write_SPI_commond(0xFF);
write_SPI_commond(0xFF);
write_SPI_commond(0xFF);
write_SPI_commond(0xFF);
delay_nms(10);
write_SPI_commond(0xB0);
write_SPI_data(0x00);
write_SPI_commond(0xB3);
write_SPI_data(0x02);
write_SPI_data(0x00);
write_SPI_data(0x00);
write_SPI_data(0x10);
write_SPI_commond(0xB4);
write_SPI_data(0x11);//0X10
write_SPI_commond(0xC0);
write_SPI_data(0x13);
write_SPI_data(0x3B);//
write_SPI_data(0x00);
write_SPI_data(0x00);
write_SPI_data(0x00);
write_SPI_data(0x01);
write_SPI_data(0x00);//NW
write_SPI_data(0x43);
write_SPI_commond(0xC1);
write_SPI_data(0x08);
write_SPI_data(0x15);//CLOCK
write_SPI_data(0x08);
write_SPI_data(0x08);
write_SPI_commond(0xC4);
write_SPI_data(0x15);
write_SPI_data(0x03);
write_SPI_data(0x03);
write_SPI_data(0x01);
write_SPI_commond(0xC6);
write_SPI_data(0x02);
write_SPI_commond(0xC8);
write_SPI_data(0x0c);
write_SPI_data(0x05);
write_SPI_data(0x0A);//0X12
write_SPI_data(0x6B);//0x7D
write_SPI_data(0x04);
write_SPI_data(0x06);//0x08
write_SPI_data(0x15);//0x0A
write_SPI_data(0x10);
write_SPI_data(0x00);
write_SPI_data(0x31);//0x23
write_SPI_data(0x10);
write_SPI_data(0x15);//0x0A
write_SPI_data(0x06);//0x08
write_SPI_data(0x64);//0x74
write_SPI_data(0x0D);//0x0B
write_SPI_data(0x0A);//0x12
write_SPI_data(0x05);//0x08
write_SPI_data(0x0C);//0x06
write_SPI_data(0x31);//0x23
write_SPI_data(0x00);
write_SPI_commond(0x35);
write_SPI_data(0x00);
//write_SPI_commond(0x36);
//write_SPI_data(0x00);
write_SPI_commond(0x0C);
write_SPI_data(0x66);
write_SPI_commond(0x3A);
write_SPI_data(0x66);
write_SPI_commond(0x44);
write_SPI_data(0x00);
write_SPI_data(0x01);
write_SPI_commond(0xD0);
write_SPI_data(0x07);
write_SPI_data(0x07);//VCI1
write_SPI_data(0x14);//VRH 0x1D
write_SPI_data(0xA2);//BT 0x06
write_SPI_commond(0xD1);
write_SPI_data(0x03);
write_SPI_data(0x5A);//VCM 0x5A
write_SPI_data(0x10);//VDV
write_SPI_commond(0xD2);
write_SPI_data(0x03);
write_SPI_data(0x04);//0x24
write_SPI_data(0x04);
write_SPI_commond(0x11);
delay_nms(150);
write_SPI_commond(0x2A);
write_SPI_data(0x00);
write_SPI_data(0x00);
write_SPI_data(0x01);
write_SPI_data(0x3F);//320
write_SPI_commond(0x2B);
write_SPI_data(0x00);
write_SPI_data(0x00);
write_SPI_data(0x01);
write_SPI_data(0xDF);//480
//write_SPI_commond(0xB4);
//write_SPI_data(0x00);
delay_nms(100);
write_SPI_commond(0x29);
delay_nms(30);
write_SPI_commond(0x2C);
Эти команды не похожи на команды Arduino для меня. Я разместил их вот так
#include <Arduino.h>
#include <SPI.h>
void setup()
{
Serial.begin(9600);
Serial.println("Test!");
SPI.begin();
write_SPI_commond(0xFF);
write_SPI_commond(0xFF);
delay_nms(5);
write_SPI_commond(0xFF);
write_SPI_commond(0xFF);
write_SPI_commond(0xFF);
write_SPI_commond(0xFF);
delay_nms(10);
write_SPI_commond(0xB0);
write_SPI_data(0x00);
write_SPI_commond(0xB3);
write_SPI_data(0x02);
write_SPI_data(0x00);
write_SPI_data(0x00);
write_SPI_data(0x10);
write_SPI_commond(0xB4);
write_SPI_data(0x11);//0X10
write_SPI_commond(0xC0);
write_SPI_data(0x13);
write_SPI_data(0x3B);//
write_SPI_data(0x00);
write_SPI_data(0x00);
write_SPI_data(0x00);
write_SPI_data(0x01);
write_SPI_data(0x00);//NW
write_SPI_data(0x43);
write_SPI_commond(0xC1);
write_SPI_data(0x08);
write_SPI_data(0x15);//CLOCK
write_SPI_data(0x08);
write_SPI_data(0x08);
write_SPI_commond(0xC4);
write_SPI_data(0x15);
write_SPI_data(0x03);
write_SPI_data(0x03);
write_SPI_data(0x01);
write_SPI_commond(0xC6);
write_SPI_data(0x02);
write_SPI_commond(0xC8);
write_SPI_data(0x0c);
write_SPI_data(0x05);
write_SPI_data(0x0A);//0X12
write_SPI_data(0x6B);//0x7D
write_SPI_data(0x04);
write_SPI_data(0x06);//0x08
write_SPI_data(0x15);//0x0A
write_SPI_data(0x10);
write_SPI_data(0x00);
write_SPI_data(0x31);//0x23
write_SPI_data(0x10);
write_SPI_data(0x15);//0x0A
write_SPI_data(0x06);//0x08
write_SPI_data(0x64);//0x74
write_SPI_data(0x0D);//0x0B
write_SPI_data(0x0A);//0x12
write_SPI_data(0x05);//0x08
write_SPI_data(0x0C);//0x06
write_SPI_data(0x31);//0x23
write_SPI_data(0x00);
write_SPI_commond(0x35);
write_SPI_data(0x00);
//write_SPI_commond(0x36);
//write_SPI_data(0x00);
write_SPI_commond(0x0C);
write_SPI_data(0x66);
write_SPI_commond(0x3A);
write_SPI_data(0x66);
write_SPI_commond(0x44);
write_SPI_data(0x00);
write_SPI_data(0x01);
write_SPI_commond(0xD0);
write_SPI_data(0x07);
write_SPI_data(0x07);//VCI1
write_SPI_data(0x14);//VRH 0x1D
write_SPI_data(0xA2);//BT 0x06
write_SPI_commond(0xD1);
write_SPI_data(0x03);
write_SPI_data(0x5A);//VCM 0x5A
write_SPI_data(0x10);//VDV
write_SPI_commond(0xD2);
write_SPI_data(0x03);
write_SPI_data(0x04);//0x24
write_SPI_data(0x04);
write_SPI_commond(0x11);
delay_nms(150);
write_SPI_commond(0x2A);
write_SPI_data(0x00);
write_SPI_data(0x00);
write_SPI_data(0x01);
write_SPI_data(0x3F);//320
write_SPI_commond(0x2B);
write_SPI_data(0x00);
write_SPI_data(0x00);
write_SPI_data(0x01);
write_SPI_data(0xDF);//480
//write_SPI_commond(0xB4);
//write_SPI_data(0x00);
delay_nms(100);
write_SPI_commond(0x29);
delay_nms(30);
write_SPI_commond(0x2C);
}
void loop(void)
{
delay(1000);
}
и я получаю много ошибок, таких как
error: ‘write_SPI_commond’ was not declared in this scope
Даже исправление опечатки в write_SPI_command
не работает. У меня нет проблем с использованием стандартного SPI.transfer
библиотеки Arduino. Но мне интересно, как перевести write_SPI_commond
и write_SPI_data
в правильный SPI.transfer
?
@ar2015, 👍2
Обсуждение2 ответа
“Команды”, предоставляемые поставщиком, не являются кодом, предназначенным для копирования как есть. Это псевдокод. Если вам нужно знать реальную разницу между “командой записи” и “данными записи”, вы должны посмотреть на таблицу данных чипа интерфейса.
См., например, ILI9481. На стр. 28-29 вы можете увидеть режим передачи данных, совместимый с SPI (интерфейс типа C, вариант 3). Здесь вы должны подключить один цифровой выход Arduino к контакту D/CX на интерфейсном чипе. Этот вывод используется для определения того, пишете ли вы команду (низкий контакт) или данные (ВЫСОКИЙ контакт).
Это очень загадочно. Не могли бы вы объяснить данные и команду понятным языком?, @ar2015
@ar2015: Нет, я знаю только то, что видел, глядя на таблицу данных. Для полного понимания протокола потребуется его тщательное прочтение. Я могу это сделать. Ты тоже можешь., @Edgar Bonet
Чтобы ответить на вопрос в заголовке "Команда SPI против данных?":
TLDR
Некоторые драйверы SPI разделяют данные, передаваемые по линиям COPI/PICO, на подразделы, чтобы облегчить работу программиста.
Команда SPI против данных?
В настоящее время я сам работаю с ESP32 и столкнулся с более общим вопросом: "В чем разница между командой и данными при использовании SPI?". После некоторого чтения я пришел к выводу, что некоторые драйверы SPI позволят пользователям разделять общие данные, отправляемые в SPI protocal, на подразделы, такие как ADDRESS, COMMAND и ADDITIONAL_DATA. Это делается просто для того, чтобы программисту было легче понять, что они посылают.
Не все приложения будут требовать АДРЕС, КОМАНДУ и ADDITIONAL_DATA. Например, некоторые чипы будут иметь заранее запрограммированные команды, такие как этот инклинометр (SCA61T), который затем может потребовать или не потребовать АДРЕСА и ДОПОЛНИТЕЛЬНЫХ ДАННЫХ. Но другие, такие как MAX7219 (который я использую), требуют только АДРЕСА и ADDITIONAL_DATA, без КОМАНДЫ.
Пример
Используя драйвер ESP32 SPI, я поиграл с установкой длины битов команды и битов адреса от 0 до некоторого ненулевого числа, как показано в приведенном ниже фрагменте кода.
spi_device_interface_config_t devcfg={
.command_bits=4, ///< Количество битов по умолчанию в командной фазе (0-16), используется, когда `SPI_TRANS_VARIABLE_CMD` не используется, в противном случае игнорируется.
.address_bits=4 ///< Количество битов по умолчанию в фазе адреса (0-64), используемое, когда `SPI_TRANS_VARIABLE_ADDR` не используется, в противном случае игнорируется.
}
Затем я указал данные, которые будут отправлены в командных и адресных битах (вместе с данными, которые будут отправлены в буфер tx), как показано в приведенном ниже коде.
char data[1]= {0x97};
spi_transaction_t spi_trans={
.cmd={0x05}, ///< Командные данные, длина которых задается в `command_bits` spi_device_interface_config_t.
.addr={0x00}, ///< Адресные данные, длина которых задается в `address_bits` spi_device_interface_config_t.
.length=8, ///< Общая длина данных, в битах
.rxlength=0, ///< Общая длина полученных данных должна быть не больше `length` в полнодуплексном режиме (по умолчанию 0 равно значению `length`).
.rx_buffer=data, ///< Pointer to receive buffer, or NULL for no MISO phase. Written by 4 bytes-unit if DMA is used.
.tx_buffer=data, ///< Указатель на буфер передачи, или NULL для отсутствия фазы MOSI
};
где spi_trans.cmd = {0x05}
с длиной 4 бита соответствует двоичному 0101
, spi_trans.addr = {0x00}
с длиной 4 бита соответствует двоичному 0000
, а spi_trans.tx_buffer = {0x97}
с длиной 8 бит соответствует двоичному 10010111
.
При использовании o-scope для измерения выбранных выводов COPI и clock мы видим следующую форму сигнала.
Мы понимаем, что порядок данных, передаваемых по пину COPI, - это команда, затем адрес и, наконец, данные tx. Этот порядок может отличаться в зависимости от используемого драйвера (я использую главный драйвер ESP32 SPI).
- Отобразить изображение с SD-карты на ЖК-дисплей ILI9486
- Как использовать SPI на Arduino?
- Печать string and integer LCD
- Отправка значения с одного Arduino на другой
- OVF в последовательном мониторе вместо данных
- ЖК-дисплей I2C отображает странные символы
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
Что вы подразумеваете под словами “мне даны следующие команды”? Кем дано? Это документация, доступная в Интернете? Если да, пожалуйста, предоставьте ссылку., @Edgar Bonet
@EdgarBonet, Кстати [vendor](https://www.ebay.com.au/itm/3-5-inch-TFT-LCD-Touch-Screen-Module-480x320-For-arduino-mega2560-board-AU-/163036335745). В разделе "Код инициализации"., @ar2015