Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "Другие проекты", создана пользователем Perfer, 1 фев 2015.

  1. Sermus

    Sermus Читатель

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

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

    Perfer Новичок

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

    Sermus Читатель

    Сообщения:
    110
    Симпатии:
    15
    SPI сконфигурирован вот так:
    Код (Text):
    1.     WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105); //clear bit9
    2.  
    3.     PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2); // HSPIQ MISO GPIO12
    4.     PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2); // HSPID MOSI GPIO13
    5.     PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2); // CLK GPIO14
    6.     PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2); // CLK GPIO15
    7.  
    8.  
    9.     // SPI clock = CPU clock / 10 / 4
    10.     // time length HIGHT level = (CPU clock / 10 / 2) ^ -1,
    11.     // time length LOW level = (CPU clock / 10 / 2) ^ -1
    12.     WRITE_PERI_REG(SPI_FLASH_CLOCK(HSPI),
    13.        ((1 & SPI_CLKDIV_PRE) << SPI_CLKDIV_PRE_S) |
    14.        ((3 & SPI_CLKCNT_N) << SPI_CLKCNT_N_S) |
    15.        ((1 & SPI_CLKCNT_H) << SPI_CLKCNT_H_S) |
    16.        ((3 & SPI_CLKCNT_L) << SPI_CLKCNT_L_S));
    17.  
    18.     uint32_t regvalue = SPI_FLASH_DOUT;
    19.     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
    20.     WRITE_PERI_REG(SPI_FLASH_USER(HSPI), regvalue);
    21.  
    При отключении аппаратного CS ситуация еще хуже - пауза больше, прямо видно, как отключение CS запаздывает относительно окончания CLK.
    На 4=х байтных сообщениях такая же ситуация - 0xFFFFFFFF потом такая же пауза.

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

    pvvx Активный участник сообщества

    Сообщения:
    8.397
    Симпатии:
    1.271
    После сборки общего 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
     
    Последнее редактирование: 8 мар 2015
  5. Perfer

    Perfer Новичок

    Сообщения:
    27
    Симпатии:
    3
    Удалось сократить паузу до 0,5us
    Попробуйте WRITE_PERI_REG(SPI_FLASH_CTRL1(HSPI), 0);
     
  6. Sermus

    Sermus Читатель

    Сообщения:
    110
    Симпатии:
    15
    Да, действительно, даже до 0.375us. Есть какое-нибудь разумное объяснение?
    Что такое SPI_T_CSH, SPI_T_RES и SPI_BUS_TIMER_LIMIT?
     
  7. Sermus

    Sermus Читатель

    Сообщения:
    110
    Симпатии:
    15
  8. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.397
    Симпатии:
    1.271
    2 CLK-SPI + SPI_T_CSH.
    Разумного объяснения нет. У Espressif наверно тоже нет. В SDK 0.9.3 есть эти дефайны, а в других SDK их нет (зато в других другие дефайны есть и надо их соединять :) ). Опять подтверждается вывод, что у Espressif никакого описания "их" ESP8266 нет.
    Да, но я сам нашел. А было всё проще - sdk 0.9.3 в Iot-demo :(
    Прошел битами по всем неописанным регистрам. Типа счетчик, который и выводится в SPI reg |= 1<<((tik++) & 0x1F), да с маской рабочих бит... И смотрел чё вылезет :)
    Инверсии линии данных не нашел. Остальные - есть (CLK, СS-ы).
     
    Последнее редактирование: 9 мар 2015
  9. Sermus

    Sermus Читатель

    Сообщения:
    110
    Симпатии:
    15
    Выложил код в репозиторий https://github.com/Sermus/ESP8266_Adafruit_ILI9341
    Пример для спортированной библиотеки содержит вращающийся кубик (математику позаимствовал у Perfer)

    и демо UI одного из моих прошлых проектов:
     
    parallelno111 и Victor нравится это.
  10. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.397
    Симпатии:
    1.271
    И сколько там свободной RAM остается в ESP8266? TCP сокет уже по ходу не открыть :) ?
    Это пример использования ESP8266 в качестве микроконтроллера общего назначения без возможности задействовать коммуникации по WiFi :)
     
  11. Sermus

    Sermus Читатель

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

    pvvx Активный участник сообщества

    Сообщения:
    8.397
    Симпатии:
    1.271
    Вопрос не понят. Про 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;

     
    Последнее редактирование: 13 мар 2015
  13. Sermus

    Sermus Читатель

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

    pvvx Активный участник сообщества

    Сообщения:
    8.397
    Симпатии:
    1.271
    Адрес для чтения в байтах (желательно кратных 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
     
    Последнее редактирование: 13 мар 2015
  15. Sermus

    Sermus Читатель

    Сообщения:
    110
    Симпатии:
    15
    А откуда начинаться может? Прямо с нуля?
     
  16. ILSHAT

    ILSHAT Новичок

    Сообщения:
    3
    Симпатии:
    0
    Доброго времени суток. По видео не понял, работает ли тач скрин? останеться ли ресурсов для обмена по вай фай с другой ESP? Хочу сделать контроллер аквариума с вай фай выключателем. для этого в сетевой фильтр хочу встроить ESP. C другого ESP с дисплеем управлять сетевым фильтром.
     
  17. Sermus

    Sermus Читатель

    Сообщения:
    110
    Симпатии:
    15
    Конкретно в этом коде нет реализации чтения touchscreen, но в принципе, там тоже SPI, так что проблем с чтением из touch-контроллера быть не должно.
     
  18. ILSHAT

    ILSHAT Новичок

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

Поделиться этой страницей