WinnerMicro Wi-Fi SoC W801/W806 (SPI, I2C – дисплей и температура)

Пробуем завести SPI и I2C на китайском чипе WinnerMicro Wi-Fi SoC W801/W806. Подключение дисплея на ST7789 и датчика температуры и влажности AHT10.

Подготовка

Качаем отсюда CDK (IDE)

https://occ.t-head.cn/community/download? id=4119141468164132864

Регистрация бесплатная, быстрая — только по почте. Скачивается быстро.

Гиты с SDK. Отличия в модуле RF и в некоторых пинах (см. в Литература и прочее).

Для 806

Для 801

Подготовка программатора cklink-lite (если нет)

В качестве отладчика можно использовать BluePill STM32(STM32F103C8T6). Качаем этот проект:

GitHub

И, нужно зашить CKLinkLite2.30.hex в плату. Можно это сделать стандартными STM32 Utility или Cube Programmer.

Стоит заменить драйвер через Zadig, иначе IDE будет ругать вас и грозить пальчиком. Меняем на libusb

0f524663d6d89f542c4ff8fc5936aaec.png

Подключение STM32 к W806/801 следующее:

f58d6d6a8b18b043d96ae9a7824205ba.png

Подключаем самоделкин программатор

363da74488c9795377b75581baa7a143.png

Не уверен, что nRESET подключен правильно, т.к сброса не происходит по кнопке, но отлаживать можно.

Чтобы IDE правильно готовила прошивки, нужно воспользоваться файлом W806_Flash_Tool.elf

Заходим во вкладку Flash Management в IDE

cf047b1981e315ee62e37a2c345a816f.png

Нажимаем Add

47bb7ca2c40430765b4cb46f2e869541.png

Выбираем скачанный ранее файл

501535e18eff2d469ae8d8a557c88065.png

И перед закрытием окна, нужно по нему кликнуть. В нижнем окне должен отобразиться выбранный файл.

43810404b6b057becb6382f4a1a4a410.png

Далее, во вкладку Configure Flash Tool

cc3379030a272dfdc5307754cdf5a907.png

Нажимаем Add

f4ef14f4cc7aac976e784b87eda5a802.png

Выбираем добавленный ранее драйвер, кликаем Add

560c50c111746a44c56d19bd929f63ef.png

Он должен отобразиться вот таким образом в окне устройств

2001184c5f5d2af8b1be053eaf8fb28c.png

Далее — в этом же окне переходим во вкладку Debug и жмем Settings…

c8664582954f1846570ee2c25350b5ca.png

И выставляем галочку Download to Flash

d9856e57148c56eeeb77918c76d4593e.png

Зашиваем — все прошло гладко. Код адекватно загружается и останавливается на брейкпоинтах.

9eb53aa399447886ce244bba30cd3320.png

Ограничения

Вот такое окно может вылезать при ребуте программатора. Видимо, какой-то сервис не отпускает драйвер.

3c43f5fd529a31ecc9b347c36e76359f.png

Такое лечится переустановкой драйвера в ручную.

Диспетчер устройств→двойной клик по программатору→Драйвер→Обновить драйвер→Найти на этом компьютере→Выбрать драйвер из списка доступных.

Там будет парочка. Я тыкаю любой, проблема исчезает до следующего перезапуска. Как говорили классики кинематографа: «А большего мне и не надо!».

При использовании 806 на 801 прошивка не сохраняется после перезагрузки. Не разбирался, не интересно

После заливки прошивка может не стартануть — нужно зайти в отладку, потом будет нормально.

Это все, что нужно для начала работы

Заводим SPI на W806/W801

Для открытия проекта со всеми зависимостями, нужно открыть что-то вроде подобного в папке SDK

WM_SDK_W806\tools\W806\projects\SDK_Project\project\CDK_WS

Пробуем поднять SPI. Узнаем, что их несколько — обычный (LSPI), скоростной (HSPI) и QSPI.

Нам нужен LSPI. Открываем Chip Specifications W801

5696b73cfc39ab21462993212095f196.png

Видим, что LSPI можно ремапить на следующие ножки порта B:

  • 23 — CS (NSS)

  • 24 — CK (CLK)

  • 25 — MISO

  • 26 — MOSI

Пишем инициализацию.

static HAL_StatusTypeDef SPI_Init(SPI_HandleTypeDef *hspi){
    SPI_InitTypeDef spi;
    HAL_StatusTypeDef ret = HAL_OK;
    //__HAL_AFIO_REMAP_SPI_CS(GPIOB, GPIO_PIN_4); hardware NSS disabeled
    __HAL_AFIO_REMAP_SPI_CLK(GPIOB, SPI_SCL);
    //__HAL_AFIO_REMAP_SPI_MISO(GPIOB, SPI_MISO);
    __HAL_AFIO_REMAP_SPI_MOSI(GPIOB, SPI_MOSI);

    
    hspi->Init.Mode = SPI_MODE_MASTER;
    hspi->Init.CLKPolarity = SPI_POLARITY_HIGH;
    hspi->Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi->Init.NSS = SPI_NSS_SOFT;
    hspi->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
    hspi->Init.FirstByte = SPI_LITTLEENDIAN;
    
    hspi->Instance = SPI;
    
    ret = HAL_SPI_Init(hspi);
    return ret;

}

В main вызываем эту функцию и пробуем отправить (HAL_SPI_Transmit (&hspi1, data, 5, 10000); ) и… тишина.

Проверил код HAL_SPI_Init — все в порядке. Посмотрел какие нужны регистры для работы LSPI — нет ли регистра ENABLE. Нет, все нормально. Может нужно инициализировать ножки? Попробовал — нет. Посмотрел регистр питания — там ничего нет про периферию.

Тактирование смотрел в последнюю очередь (не делайте так), т.к. глаз зацепился за эту фразу при беглом осмотре документации:

5ee803b71c7da0fd4d307ed2eb5cf866.png

В итоге решил вычитать Software Clock Gating Enable Register (HR_CLK_BASE_ADDR) по адресу 0×40000E00 и увидел, что клоки отключены! Включены только для gpio и uart. Первая же функция (SystemClock_Config (CPU_CLK_160M)) выключила всю периферию!

f23855c48bc1b037d2167e71d8810b63.png

Включаем!

В Register Manual видим, что нужно установить 1 сюда:

i2c

i2c

spi

spi

То есть по маске 0×80 и 0×01 в HR_CLK_BASE_ADDR.

*((uint32_t *)(HR_CLK_BASE_ADDR)) |= CLK_GATE_SPI_MASK|CLK_GATE_I2C_MASK;

И, о чудо, тестовая строка побежала! Пробуем функции от библиотеки дисплея — работает.

SPI — пишем в драйвер дисплея:

201c6900937bf70759cbfcd0d25cc579.jpeg

Хочу заметить, что если сконфигурировать SPI в BIGENDIAN, то HAL-функция будет работать отвратительно — она для этого не предназначена.

Заводим I2C на W806/W801

Добавляем инициализацию I2C

static HAL_StatusTypeDef I2C_Init(I2C_HandleTypeDef *hi2c){
    HAL_StatusTypeDef ret = HAL_OK;
    __HAL_AFIO_REMAP_I2C_SCL(GPIOB, I2C_SCL);
    __HAL_AFIO_REMAP_I2C_SDA(GPIOB, I2C_SDA);
    hi2c->Frequency = 100000;
    hi2c->Instance = I2C;
    ret = HAL_I2C_Init(hi2c);
    return ret;
}

Сама функция HAL выглядит похоже на STMовскую, но передаваемые параметры немного другие. Немного это меня задержало — не посмотрел сразу.

Вот пример отличия:

HAL_StatusTypeDef HAL_I2C_Write(I2C_HandleTypeDef *hi2c, uint8_t DevAddress, uint8_t MemAddress, uint8_t *pData, uint16_t Size); //W800
HAL_StatusTypeDef HAL_I2C_Master_Transmit (I2C_HandleTypeDef* hi2c, uint16_t DevAddress, uint8_t* pData, uint16_t Size, uint32_t Timeout); //STM32

I2C — запрос на чтение с датчика AHT10

a967b61349ee89568af29047dc33effa.jpeg

Ответ от датчика AHT10

40478f1c8b548627909ede82f96ce8f5.jpeg

Итоги

Добавил простое рисование факториала в проект и смотрю как рисуется

Рисуем множество Мандельброта:

583ab116e4d20238e4d0553dd2a38f5f.jpeg

Пара тестовых видео:

Проект на GitHub

https://github.com/tunerok/W801_W806_SPI_I2C_Example

Литература и полезное прочее

Здесь показано как изображения конвертировать:

https://www.hackster.io/usini/display-images-on-a-st7789-screen-fbb0d7

Скрипт на питоне для перевода вывода программы LCD image converter в вид двумерного массива, который удобно использовать в header«ах.

file1 = open('inp_file.txt', 'r')
file2 = open('test_out.txt', 'w+')
count = 0
file2.write("const uint16_t test_img[][240] = {")
while True:
    line = file1.readline()
    if not line:
        file2.write("};")
        break
    if count != 0:
        file2.write(",")
    count += 1
    file2.write("{" + line + "}")
file2.close()
file1.close()

Практически вся нужная информация по чипам собрана в этом репозитории

GitHub

Ссылка на китайские даташиты на W801

https://h.hlktech.com/Mobile/download/fdetail/170.html

Тут есть про отличия и подключение

https://www.cnblogs.com/milton/p/15621540.html

Гит с драйвером дисплея на st7789 для STM32

GitHub

Про отладчик

https://hackaday.io/page/12671-how-to-debug-w806-and-w801-mcus

Видос (на китайском) как чел подключает свой программатор на STM32F103 и настраивает запуск отладки (自制CKlink阿里平头哥w801/w806仿真器DIY全教程)

https://www.bilibili.com/video/BV1L44y1J7Jz/

Программаторы самодельные с инструкциями на китайском с готовыми схематиками и разводками

https://oshwhub.com/jiaminghui98/mini-CKLink

https://oshwhub.com/l88889686/cklinkw80x-fang-zhen-qi

Полу-переведенный даташит на английский на W806

W806_-1Скачать

Про 806 на easyelectronics

http://we.easyelectronics.ru/tag/W806%20MCU/

На другом сайте про W806/W801 с полезными ссылками

https://mysku.club/blog/aliexpress/91119.html

© Habrahabr.ru