Команда 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?

, 👍2

Обсуждение

Что вы подразумеваете под словами “мне даны следующие команды”? Кем дано? Это документация, доступная в Интернете? Если да, пожалуйста, предоставьте ссылку., @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


2 ответа


2

“Команды”, предоставляемые поставщиком, не являются кодом, предназначенным для копирования как есть. Это псевдокод. Если вам нужно знать реальную разницу между “командой записи” и “данными записи”, вы должны посмотреть на таблицу данных чипа интерфейса.

См., например, ILI9481. На стр. 28-29 вы можете увидеть режим передачи данных, совместимый с SPI (интерфейс типа C, вариант 3). Здесь вы должны подключить один цифровой выход Arduino к контакту D/CX на интерфейсном чипе. Этот вывод используется для определения того, пишете ли вы команду (низкий контакт) или данные (ВЫСОКИЙ контакт).

,

Это очень загадочно. Не могли бы вы объяснить данные и команду понятным языком?, @ar2015

@ar2015: Нет, я знаю только то, что видел, глядя на таблицу данных. Для полного понимания протокола потребуется его тщательное прочтение. Я могу это сделать. Ты тоже можешь., @Edgar Bonet


2

Чтобы ответить на вопрос в заголовке "Команда 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).

,