• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Esp8266->spi->tft (ili9341) без внешнего mcu

Sermus

New member
1) Если ждать конца передачи, пауза становиться еще на 20% длиннее.
2) А что именно должно стать понятнее? Вы имеете ввиду, что причиной могут быть всякие накладные расходы (здесь это только инкремент переменной цикла, сравнение, да условный переход)? Это, вроде, не должно быть так, потому что все это должно с большим запасом успеваться пока идет передача этих двух несчастных байт по SPI.
3) Есть, вроде плагин для IDA под lx106. Можно, я думаю, просто gcc заставить генерить asm-листинги. Но я не понимаю, как мне это поможет, ведь код в этом случае примитивный - просто выставление регистров, он скорее всего довольно очевидно отражается в asm.

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

Perfer

New member
1) и 2) проверьте на коде вроде этого:
Код:
*spi_fifo = 0xFFFF;
uint32_t bitcount = 2 * 8 - 1;
WRITE_PERI_REG(SPI_FLASH_USER1(HSPI), (bitcount & SPI_USR_OUT_BITLEN) << SPI_USR_OUT_BITLEN_S);
SET_PERI_REG_MASK(SPI_FLASH_CMD(HSPI), SPI_FLASH_USR);
while (READ_PERI_REG(SPI_FLASH_CMD(HSPI)) & SPI_FLASH_USR) {};
SET_PERI_REG_MASK(SPI_FLASH_CMD(HSPI), SPI_FLASH_USR);
while (READ_PERI_REG(SPI_FLASH_CMD(HSPI)) & SPI_FLASH_USR) {};
Пробовали на 4ех байтных сообщениях?
При отключении аппаратного управления CS ситуация повторяется?
А как сконфигурирован SPI?
 

Sermus

New member
SPI сконфигурирован вот так:
Код:
    WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105); //clear bit9

    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2); // HSPIQ MISO GPIO12
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2); // HSPID MOSI GPIO13
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2); // CLK GPIO14
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2); // CLK GPIO15


    // SPI clock = CPU clock / 10 / 4
    // time length HIGHT level = (CPU clock / 10 / 2) ^ -1,
    // time length LOW level = (CPU clock / 10 / 2) ^ -1
    WRITE_PERI_REG(SPI_FLASH_CLOCK(HSPI),
       ((1 & SPI_CLKDIV_PRE) << SPI_CLKDIV_PRE_S) |
       ((3 & SPI_CLKCNT_N) << SPI_CLKCNT_N_S) |
       ((1 & SPI_CLKCNT_H) << SPI_CLKCNT_H_S) |
       ((3 & SPI_CLKCNT_L) << SPI_CLKCNT_L_S));

    uint32_t regvalue = SPI_FLASH_DOUT;
    regvalue &= ~(BIT2 | SPI_FLASH_USR_ADDR | SPI_FLASH_USR_DUMMY | SPI_FLASH_USR_DIN | SPI_USR_COMMAND | SPI_DOUTDIN); //clear bit 2 see example IoT_Demo
    WRITE_PERI_REG(SPI_FLASH_USER(HSPI), regvalue);
При отключении аппаратного CS ситуация еще хуже - пауза больше, прямо видно, как отключение CS запаздывает относительно окончания CLK.
На 4=х байтных сообщениях такая же ситуация - 0xFFFFFFFF потом такая же пауза.

Для Вашего кода осцилограмма такая (т.е. пауза на 20% больше, чем без ожидания конца передачи):
 

pvvx

Активный участник сообщества
3) Есть, вроде плагин для IDA под lx106. Можно, я думаю, просто gcc заставить генерить asm-листинги. Но я не понимаю, как мне это поможет, ведь код в этом случае примитивный - просто выставление регистров, он скорее всего довольно очевидно отражается в asm.
После сборки общего elf даете objdump -S на него и получите дизасм всего проекта.
C:\Espressif\xtensa-lx106-elf\bin\xtensa-lx106-elf-objdump -S eagle.app.v6.out > eagle.app.v6.asm
Но не думается, что тут причина в скорости CPU... Это что-то связанное с Hard или отработкой кеширования flash другими каналами SPI... Сходу, не потрогав самому руками не сказать.

А не связано ли это с прерыванием по окончанию передачи? Время, чуть менее 1us, очень на это намекает.

http://esp8266.ru/forum/threads/spi.59/#post-2456
 
Последнее редактирование:

Perfer

New member
Удалось сократить паузу до 0,5us
Попробуйте WRITE_PERI_REG(SPI_FLASH_CTRL1(HSPI), 0);
 

pvvx

Активный участник сообщества
Да, действительно, даже до 0.375us. Есть какое-нибудь разумное объяснение?
2 CLK-SPI + SPI_T_CSH.
Разумного объяснения нет. У Espressif наверно тоже нет. В SDK 0.9.3 есть эти дефайны, а в других SDK их нет (зато в других другие дефайны есть и надо их соединять :) ). Опять подтверждается вывод, что у Espressif никакого описания "их" ESP8266 нет.
А вот как раз pvvx в соседней ветке объяснил:
http://esp8266.ru/forum/threads/spi.59/#post-2465
Да, но я сам нашел. А было всё проще - sdk 0.9.3 в Iot-demo :(
Прошел битами по всем неописанным регистрам. Типа счетчик, который и выводится в SPI reg |= 1<<((tik++) & 0x1F), да с маской рабочих бит... И смотрел чё вылезет :)
Инверсии линии данных не нашел. Остальные - есть (CLK, СS-ы).
 
Последнее редактирование:

pvvx

Активный участник сообщества
Выложил код в репозиторий https://github.com/Sermus/ESP8266_Adafruit_ILI9341
Пример для спортированной библиотеки содержит вращающийся кубик (математику позаимствовал у Perfer)
И сколько там свободной RAM остается в ESP8266? TCP сокет уже по ходу не открыть :) ?
Это пример использования ESP8266 в качестве микроконтроллера общего назначения без возможности задействовать коммуникации по WiFi :)
 

Sermus

New member
Да, именно так, скорее всего почти нисколько, и да, это пример использования как пустого очень дешевого, но мощного MCU. Оригинальный проект с этим демоUI был на atmega, там этот UI раз в 15 медленнее живет. Так что как general purpose MCU эта железяка имеет право на жисть, особенно учитывая сколько с ним рядом flash стоит и сколько туда можно пихнуть графического контента.
Кстати, pvvx, где-то, вроде, видел на форуме, но вспомнить не могу, Вы, вроде, упоминали куда и чем можно писать во флэш изнутри самого ESP. Не ткнете мордой?
 

pvvx

Активный участник сообщества
Вопрос не понят. Про Flash в моей свалке: \Web_base\app\web\flash.c
Если без SDK, то берете процедуры по Flash SPIxxxx... , описанные в SDK\ld\eagle.rom.addr.v6.ld и "обрамляете" так:

Cache_Read_Disable(0);
SpiFlashOpResult ret = SPIEraseBlock(blk);
Cache_Read_Enable(0,0,1);


Если требуется доступ к flash более 512 килобайт, то перед обращением меняете размер в структуре от BIOS, а затем возвращаете на старый. Иначе SDK "накекает" выше 512 килобайт своими сохранениями.

#define SIZE_MIN_FLASH 0x00080000
#define SIZE_MAX_FLASH 0x01000000
extern SpiFlashChip * flashchip; // описан в SDK\ld\eagle.rom.addr.v6.ld

flashchip->chip_size = SIZE_MAX_FLASH;
работаем с процедурами flash...
flashchip->chip_size = SIZE_MIN_FLASH;

 
Последнее редактирование:

Sermus

New member
Спасибо, понятно. А в, например, spi_flash_read src_addr откуда может начинаться и в каких единицах измеряется? В секторах по 4K?
 

pvvx

Активный участник сообщества
Спасибо, понятно. А в, например, spi_flash_read src_addr откуда может начинаться и в каких единицах измеряется? В секторах по 4K?
Адрес для чтения в байтах (желательно кратных 4-м), секторов - в номерах секторов, блоков (страниц стирания) - в их счетчиках :)
Все начинаются с нуля. Чтение из Flash, что "кешем", что через процедуры аналогично по скорости. Но через "кеш" существует масса ограничений и "подводных камней".
Flash в "к'еше" отображается с адреса 0x40200000, но всего 1 Мег макс и читать надо правильно, с множественными условиями... Иначе - "протектед".
Т.к. это полуаппаратная связка, кое чаго QSPI делает сама, то WINBOND Flash на 16 Мегабайт работает быстрее - как итог ещё выигрыш в ~20% производительности чипа при частых обращениях к кешу Flash, по сравнению со стандартной дешевой flash на модуле... Данный пример + более 20% наблюдается на web сервере - трансфер повышается с 800 килобайт в секунду на 1200 килобайт (похоже влетает в ограничение WiFi и на большее не оптимизировал) (опции для обоих flash - QSPI 80MHz, CPU 160 MHz).
Ваш "экран" можно перерисовывать прямо по TCP :) - будет быстрее чем на демке :)
Беды на первых модулях со старыми SDK до сертификации модулей Espressif (типа ESP-01, возможно ревизия чипа)
Скорость записи flash
 
Последнее редактирование:

ILSHAT

New member
Доброго времени суток. По видео не понял, работает ли тач скрин? останеться ли ресурсов для обмена по вай фай с другой ESP? Хочу сделать контроллер аквариума с вай фай выключателем. для этого в сетевой фильтр хочу встроить ESP. C другого ESP с дисплеем управлять сетевым фильтром.
 

Sermus

New member
Конкретно в этом коде нет реализации чтения touchscreen, но в принципе, там тоже SPI, так что проблем с чтением из touch-контроллера быть не должно.
 

ILSHAT

New member
Было бы интересно увидеть какую нибудь демку от Вас с использованием тач скрина. И второй вопрос, можно ли использовать функции вай фай или все таки ресурсов не хватает
 
Сверху Снизу