Перейти к содержанию

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

Установка ПО

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

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

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

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

Для 806

Для 801

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

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

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

GitHub

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

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

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

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

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

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

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

Нажимаем Add

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

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

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

Нажимаем Add

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

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

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

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

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

Ограничения

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

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

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

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

При использовании 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

Видим, что 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. Нет, все нормально. Может нужно инициализировать ножки? Попробовал – нет. Посмотрел регистр питания – там ничего нет про периферию.

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

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

Включаем!

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

i2c
spi

То есть по маске 0x80 и 0x01 в HR_CLK_BASE_ADDR.

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

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

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

Хочу заметить, что если сконфигурировать 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

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

Итоги

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

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

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

Сам проект на Гите:

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

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

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

Про 806 на easyelectronics

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

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

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

Comment

programel