Установка ПО
Качаем отсюда CDK (IDE)
https://occ.t-head.cn/community/download?id=4119141468164132864
Регистрация бесплатная, быстрая – только по почте. Скачивается быстро.
Гиты с SDK. Отличия в модуле RF и в некоторых пинах(см. в Литература и полезное по чипам).
Это все, что нужно для начала работы
Подготовка программатора (если нет)
В качестве отладчика можно использовать BluePill STM32(STM32F103C8T6). Качаем этот проект:
И, нужно зашить 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 сюда:
То есть по маске 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()
Практически вся нужная информация по чипам собрана в этом репозитории
Ссылка на китайские даташиты на W801
https://h.hlktech.com/Mobile/download/fdetail/170.html
Тут есть про отличия и подключение
https://www.cnblogs.com/milton/p/15621540.html
Гит с драйвером дисплея на st7789 для STM32
Про прошивальщик
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 с полезными ссылками
Comment