Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Регистрируясь, я даю согласие на обработку данных и условия почтовых рассылок.
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Отправься в мир мышек с забегами в реальном времени! Призывай духов, собирай команду для сражений, проходи кампанию, выполняй задания, наряжай персонажа и общайся с друзьями в веселом онлайн-приключении.

Мыши: Эволюция

Аркады, Приключения, Казуальные

Играть

Топ прошлой недели

  • solenakrivetka solenakrivetka 7 постов
  • Animalrescueed Animalrescueed 53 поста
  • ia.panorama ia.panorama 12 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая «Подписаться», я даю согласие на обработку данных и условия почтовых рассылок.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
0 просмотренных постов скрыто
7
kkuznetzov

Китайский микроконтроллер⁠⁠

10 дней назад

Столкнулся с проблемой в одном китайском микроконтроллере. Они не умеют делать Flash память на том же кристалле, с самим микроконтроллером. Память делают отдельным кристаллом. Пример GigaDevice. См. фотографию из сети.

Китайский микроконтроллер

При запуске микроконтроллера, содержимое Flash считывается в SRAM буфер. И код программы выполняется из буфера.

Проблема в том, что мне нужно хранить данные во Flash. Код успешно пишет данные, но при чтении возвращается предыдущее значение, значение из буфера. Если выполнить сброс, то вычитывается свежее значение из Flash.

Мне же нужно писать данные и читать без сброса. Незнаю как заставить микроконтроллер обновить буфер.

Показать полностью
[моё] Микроконтроллеры Электроника
9
707
Lion295
Lion295
TECHNO BROTHER

Ответ на пост «Одноразовые вейпы: как из-за общества потребления тысячи полезных компонентов отправляются в мусорку?»⁠⁠1

14 дней назад

Помню, как лет 15 назад в журнале (В бумажном) VOGUE появилась первая ВИДЕО реклама! Цветной ЖК дисплей на одной из страниц. Тогда половину тиража скупили айтишники и еще наверное год на хабре статьи публиковали про самоделки. Тогда это казалось магией. Как это? ЦЕЛЫЙ ЦВЕТНОЙ ЭКРАН В ЖУРНАЛЕ КАРЛ!!! БЕСПЛАТНО! А сейчас такое просто выкидывают в мусорку. И вроде радоваться надо, прогресс все-таки. Но как-то грустно от этого становится.

Как это было 15 лет назад: https://habr.com/ru/articles/108921/

Опрос Гаджеты Микроконтроллеры Потребление Одноразовые вещи Нужно ваше мнение Длиннопост Ответ на пост Текст
55
2677
monobogdan
monobogdan
Посты о ремонте и моддинге ретрогаджетов.
TECHNO BROTHER

Одноразовые вейпы: как из-за общества потребления тысячи полезных компонентов отправляются в мусорку?⁠⁠1

14 дней назад

Для ЛЛ: потреб***тво достигло своего пика!

Концепция моего блога построена на том, чтобы давать новую жизнь устройствам прошлых лет. Чего мы с вами только не делали: и клиенты современных сервисов для смартфонов из 2010-х писали, и изучали их прошивки с последующей модификацией, и даже ремонтировали гаджеты со свалки, попутно разбираясь в их инженерных особенностях.

Сегодняшнему устройству едва исполнилось 3 месяца, а оно уже отправилось на свалку. И отправляются сотни таких каждый день. Сегодня мы с вами затронем очень важную тему - как из-за общества потребления тысячи устройств с очень мощными микроконтроллерами, цветными IPS-дисплеями и литиевыми аккумуляторами лишаются второго шанса на жизнь...

Предисловие

Вот уже последние лет 100 люди говорят о так называемом обществе потребления. Многие трактуют этот термин по разному, однако у всех определений есть одна общая черта: люди покупают вещи руководствуясь не только потенциальной нуждой, но и некой модой и желанием быть "не таким как все", зачастую пресыщаясь обилием выбора и теряя представление о реальной ценности вещей.

Производитель этого гаджета напирает сразу на несколько человеческих слабостей

Производитель этого гаджета напирает сразу на несколько человеческих слабостей

Это же в равной степени относится и к электронным сигаретам. Школьники и студенты только и делают, что парят и "стреляют" друг у друга вейпы, но если лет 10 назад они в основном покупали многоразовые системы с возможностью заправки и самостоятельного обслуживания, то сейчас ребята предпочитают самый простой и доступный вариант - одноразовые вейпы.

Фото от подписчика. Теперь представьте сколько подобных гаджетов выкидывает среднестатистический студент за время сессии :(

Фото от подписчика. Теперь представьте сколько подобных гаджетов выкидывает среднестатистический студент за время сессии :(

Компании-производители знают свою целевую аудиторию и поэтому стараются выпустить как можно более необычное, красочное и функционально-продвинутое устройство. Сначала в "одноразки" добавили возможность повторной зарядки аккумулятора, затем приделали индикаторы уровня заряда и выбора мощности, а недавно добавили... Bluetooth и даже игры. Это уже звучит весьма странно...

Сам я человек не курящий и к обычным вейпам отношусь равнодушно. Но одноразовые вейпы всегда вызывали у меня гиковский интерес и некое негодование, а сегодняшнее устройство так вообще повергло в шок - не только своим функционалом, но и тем, что после израсходования жидкости оно отправится на помойку... А ведь оно могло бы получить и вторую жизнь - как действительно полезный гаджет!

Недавно мне написал читатель Андрей с Пикабу и предложил заслать одноразовый вейп без испарителя (рабочего элемента) на разборку и дальнейшее изучение. И как оказалось - это далеко не самая простая "парилка", а сложнейшее устройство с мощным микроконтроллером, радиотрактом, звуковым усилителем, дисплеем и тачскрином.

Изучаем

После получения я сразу же включил гаджет и начал его изучать. Оказалось что дисплей - не просто пришлепка к обычной "одноразке", но и её неотъемлемая часть: через тачскрин предлагается регулировать силу нагревателя, контролировать уровень заряда аккумулятора и объём оставшейся жидкости. Прикинув, я сразу же понял: в устройстве есть как минимум 2 канала АЦП для считывания параметров и ШИМ для управления "силовой" частью.

Смахиванием я попал в главное меню устройства, где было несколько интересных пунктов: плеер, игры, телефон, погода и настройки. Учитывая что собственной памяти у вейпа нет, я сразу понял что устройство умеет работать портативной колонкой и подключается к смартфону через Bluetooth.

Также здесь присутствует типичный для смарт-часов функционал: пуши с мессенджеров, возможность звонить с помощью HandsFree-профиля, а также базовый функционал органайзера по типу секундомера и будильника. На первый взгляд вполне неплохо, такого уж точно не ожидаешь от одноразовой "парилки".

Игры здесь весьма простые, частота обновления не впечатляет... Однако мне всё равно стало интересно: возможно ли на таком устройстве запустить, например, эмулятор NES или написать какую-нибудь свою игру? Можно ли удалить с подобных устройств испаритель и использовать в качестве "бесплатного" микроконтроллера с дисплеем?

Далее я узнал что гаджет можно синхронизировать с смартфоном и уже надеялся на какой-то магазин приложений... магазин действительно есть, вот только в нём продаются сгенерированные ИИ обои для устройства. Ни намека на возможность запуска сторонних программ нет - и это очень грустно.

Что внутри?

После изучения я решил разобрать устройство. Для одноразовых вейпов этот процесс зачастую необратим, поскольку производители делают всё для предотвращения возможности перезаправки картриджей. В случае сегодняшнего гаджета это делается снятием нижней части корпуса, которая не только приклеена, но и сидит на специальных защелках. Требуется осторожность и фен, иначе можно случайно порвать шлейф.

Далее мы видим крошечную плату, к которой подходит шлейф с дисплеем и тачскрином (судя по некой унификации, дисплейная сборка используется далеко не в одной модели вейпов), разъём Type-C и провода, которые соединяют плату с микрофоном (используется для определения силы затяжки) и динамиком (служит для выполнения функции BT-колонки).

Отдельно бросается большое количество подписанных тест-поинтов, с помощью которых мы можем вызвонить сигнальные линии на шлейфе дисплея и попытаться их использовать в своих целях. С левой стороны можно найти пины SDA/SCL/RST/INT - это, очевидно, тачскрин, а правее - SDA/SCL для дисплея. Контроллер дисплея и подсветка питаются от общей шины питания 3.3В без внешних драйверов LED.

Питается наш "бутерброд" от одного литиевого аккумулятора типа 18350. Я слышал противоречивые отзывы о банках используемых в вейпах, но думаю при использовании нормального BMS и микросхемы чарджера можно без опаски использовать их в своих проектах. Помните, на ближайшей свалке могут лежать тысячи бесхозных и бесплатных аккумуляторов для ваших самоделок (но всё же будьте осторожнее!)

С обратной стороны платы нас ждёт чудо инженерной мысли... от которого становится грустно. Сердцем устройства является микроконтроллер с маркировкой 701N-F8, который также известен как JieLi AC701N. Это относительно популярный чип, использующийся в TWS-наушниках и представляющий из себя полноценную систему на кристалле:

  • В основе лежит двухъядерный (!) DSP-процессор собственной (!!) архитектуры Pi32v2 с FPU, способный работать на частоте до 160МГц (!!!) и имеющий 32КБ кэша инструкций и 16КБ кэша данных. Также у чипа есть MMU для продвинутой адресации памяти или реализации защищенного режима. Это уровень RP2350 или старших версий ESP 32

  • В качестве памяти здесь доступно целых 640КБ SRAM-ОЗУ, а также 1МБ Flash. Вот это уже действительно серьёзно.

  • Присутствует Bluetooth-радиотракт, обеспечивающий совместимость с стандартом версии 5.3. С софтовой точки зрения здесь тоже всё хорошо: поддерживаются все основные кодеки, плюс есть поддержка не-звуковых профилей по типу L2CAP и RFCOMM для коммуникации с другими устройствами.

  • Есть также контроллеры I2C, UART, SPI, USB, MMC, GPIO и даже ШИМ.

  • За звук отвечает двухканальный ЦАП для с встроенным предусилителем и возможностью воспроизведения PCM-потока с частотой дискретизации до 96кГц. Также есть четырехканальный АЦП для сэмплирования звука с микрофона и других подобных целей.

  • А за питание отвечает встроенный PMU, который состоит из контроллера заряда Li-Ion аккумуляторов, LDO и DC-DC Buck преобразователя,

Это невероятно круто по меркам копеечного микроконтроллера. В каких-то моментах, AC701N даже круче чем привычные RP2350 и ESP32, и скорее всего даже дешевле. Производитель - публичная компания и охотно делится исходным кодом и файлами для сборки прошивок, однако адаптация референсной прошивки для этой платы может занять время. Внутри всё стандартно: FreeRTOS в качестве операционной системы, самодельный UI-стек, а также Bluetooth-стек от Bluekitchen. Джентльменский набор!

К сожалению маркировку остальных компонентов платы не разглядеть, но предположу что там может быть разведен усилитель и RF-тракт. В целом, гаджет имеет очень большой потенциал для использования и по не-прямому назначению: это мог быть прекрасный внешний дисплей для датчиков с передачей показаний через Bluetooth, элемент самодельной сигнализации (как уникальный брелок, который не вызывает подозрений), мощный микроконтроллер для самоделок по типу игровых консолей и самодельных телефонов и... да применений такому гаджету можно найти сотни. Было бы желание производителей...

❯ Заключение

Вот такой разбор одноразового вейпа у нас с вами получился... По правде сказать, дописывая эти строки мне стало максимально грустно: хоть я и не сорвал какие-то покровы и описал вполне очевидные вещи, всё равно мне хотелось выразить свои переживания касательно "одноразовых" устройств. Вдруг со временем что-то изменится и для таких гаджетов начнут релизить схемы и SDK - но я в этом сильно сомневаюсь!

А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет — подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я выкладываю бэкстейджи статей, ссылки на новые статьи и видео, а также иногда выкладываю полезные посты и щитпостю. А ролики (не всегда дублирующие статьи) можно найти на моём YouTube канале.

Если вам понравилась статья и вы хотите меня поддержать, у меня есть Boosty, а также виджет на Пикабу ниже. Всем огромное спасибо!

Что думаете касательно таких устройств?
Всего голосов:
Показать полностью 11 1
[моё] Опрос Гаджеты Микроконтроллеры Потребление Одноразовые вещи Нужно ваше мнение Длиннопост
583
120
kkuznetzov
Лига Радиолюбителей

Продолжение поста «Отладочная плата для К1986ВЕ92FI»⁠⁠1

14 дней назад

Запустил минимальный тестовый код. Плату пропаял и сделал проект на основе статьи с Хабра "Миландр + GCC + VSCode. Пробуем мигать светодиодом на отечественном ARM32 микроконтроллере". Но Я предпочитаю: Eclipse + xpack-arm-none-eabi-gcc + xpack-windows-build-tools + xpack-openocd. Встроенный отладчик тоже заработал. Дело в пайке.

1/2

Файлы для линкера MDR32F9Q2I.ld и startup_MDR32F9Q2I.S сделал свои. Иначе не собиралось. Всё остальное с сайта Миландра. Так называемый "Software pack для Keil MDK 5 + Standard Peripherals Library" содержит в себе файл с расширением .pack, который оказался zip архивом. Никакой Keil MDK 5 устанавливать не нужно.

UPD: Запустил GPIO. Мигание светодиодом.

Перейти к видео
Показать полностью 2 1
[моё] Радиоэлектроника Радиолюбители Микроконтроллеры Ответ на пост Видео Короткие видео
87
62
kkuznetzov
Лига Радиолюбителей

Отладочная плата для К1986ВЕ92FI⁠⁠1

17 дней назад

Приобрёл плату MILUNIO MDR32 и хочу поделиться первым впечатлением. Первое впечатление, что это говно.

Флюс полностью не отмыт, пайка кривая. У части резисторов и конденсаторов 0603 не припаян один вывод. Паяльником повредили кнопку. Видно как пытались допаять вручную. Флешбеки от прошлой работы. Отечественное производство.

Ну самое главное то, что встроенный отладчик не видит микроконтроллер.

Думаю надо ли вернуть или привести порядок самому.

1/4
Показать полностью 4
[моё] Радиоэлектроника Радиолюбители Микроконтроллеры
48
101
PetroBr
Arduino & Pi

Своими разработками, соревнуюсь с брендами в АСУ ТП. Аналог Allen Bradley? STM32G030 против Micro810⁠⁠

22 дня назад
Своими разработками, соревнуюсь с брендами в АСУ ТП. Аналог Allen Bradley? STM32G030 против Micro810

Пока еще некоторые отладочные платы для полного теста еще едут (жду более разнообразных маленьких RISC V), хотел бы сравнить свою разработку с Allen Bradley и их базовым ПЛК Micro810.

Что у меня за проект такой, начало тут: Своими разработками c нуля, решил тягаться с Rockwell Automation и Siemens в АСУ ТП

Железо:

Отладочная плата : 3$

stm32 G030  (Cortex M0)

8 KB RAM

32 KB Flash.

Тестовая программа:

400 LD  инструкций в целом (на 4 задачи, но тестируем только одну с примитивами 184 LD. Так же в фоне работает своя виртуальная RTOS - можно и без нее, но берем самый тяжелый случай). Но так как в программе есть ветки - не все эти 400 LD  отрабатывают. При отличном от ожидаемого значении - идет перемещение указателя на инструкцию:

считаем только отработанные инструкции, замеряем их скорость выполнения.

считаем только отработанные инструкции, замеряем их скорость выполнения.

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

В  конце цикла - устанавливаем/сбрасываем ножу микроконтроллера.

Замеряем время осциллографом.

Рассчитываем среднее время выполнения 1 инструкции в составе всех отработанных LD.

Результаты сравнения:

значения брендового ПЛК берем из документации. В моем случае разброс 9.5-14.5 мксек, следующее: если читать переменную из памяти в каждой LD инструкции - 14.5 микросекунд. Если вы загружаете состояние входов только один раз в начале цикла : 9.5 мксек.

значения брендового ПЛК берем из документации. В моем случае разброс 9.5-14.5 мксек, следующее: если читать переменную из памяти в каждой LD инструкции - 14.5 микросекунд. Если вы загружаете состояние входов только один раз в начале цикла : 9.5 мксек.

Одна LD базовая инструкция выполняется от 9.5 до 14.5 микросекунд против 2.5 мксек у Micro810.

STM32G030  (мой ПЛК на нем) в 4 - 6 раз медленнее чем Micro810.

Также стоит отметить, что частота STM32G030 в моем тесте была намеренно снижена с 64 до 42 Мегагерц. Но даже если частоту поднять и скорость возрастет на треть, все равно ,бренд Allen Bradley Micro810 будет в разы быстрее STM32G030.

Еще стоит отметить, я не знаю какой процессор стоит в ПЛК  Micro810, но судя по производительности скорее всего не сильно производительнее  нашего STM32G030. Моя задача была проверить возможности  ПЛК на STM32G030 в режиме энергосбережения, и сравнить с брендом.

За счет того что программа нашего ПЛК с STM32G030 выполняется  виртуальной машиной собственной разработки, обычно, есть проигрыш по скорости примерно 2-4 раза от нативной реализации (от того я и предположил что Allen Bradley Micro810 имеет CPU не сильно производительнее STM32G030 ).

Что можно выжать из STM32G030  в качестве ПЛК:

При настройках цикла в 5 миллисекунд, за этот период мы можем отработать 400 LD и отправить/принять по Modbus  на RS485 : 32 целочисленные переменные, на низких скоростях. Много это или мало? в тесте, например тут 184 LD.

Перейти к видео

таймеры/счетчики еще отнимут 64 - 100 байт за каждый. Шахтный конвейер, одна из веток конвейера обошелся около 300 LD, тут - 184 но влезет в STM32G030  400 LD.

Cамое главное, преимущество перед Micro810

Наш ПЛК STM32G030  может работать в режиме вытесняющей многозадачности. И мы можем менять программу  не перезагружая ПЛК физически - отправить кусок кода по Ethernet  или  RS485, и полностью переписать программу задачи не останавливая другие задачи. Эти функции есть только в Топовых ПЛК.

Еще есть момент, у STM32G030 всего 8кб ОЗУ: 4кб примерно забирают переменные виртуальной машины, еще на 4кб остаются под программу, поэтому больше 400 LD и несколько десятков целочисленных и булевых переменных не получится на нем реализовать. Флеш 32кб занят полностью прошивкой. Расширить программу ПЛК можно только через внешнюю память (например через интерфейс I2C / SPI), у Micro810 по документации влезет 2000 LD .

Минимальную цену Allen Bradley Micro810  которую видел на международных площадках - 140$  за один такой ПЛК. Сложно сказать какая  себестоимость его на производстве но думаю ПЛК на STM32G030 обошелся бы не дороже 50$ (цена платы с STM32G030 3$ + хорошие гальванические развязки с корпусом и прочее).

Следующий тест я проведу на знаменитой синей плате  STM32F103C8T6.

В интернете (на известном и других ресурсах) видел тестирование ее в качестве ПЛК со средой разработки от Mitsubishi. Тут уже будет поинтереснее, так как все сравниваться будет на одном и том же железе ( в отличии от Allen Bradley Micro810,которые не разглашают что у них там в качестве CPU) , и прямой  соревнование с брендом - будет интересно. Сравниваться буду всем - своим компилятором, средой разработки и выполнения на микроконтроллере. Если вам тоже интересно  - присоединяйтесь.

Показать полностью 3 1
[моё] АСУ ТП Микроконтроллеры Автоматизация Производство Видео Без звука Короткие видео Длиннопост
36
291
monobogdan
monobogdan
Посты о ремонте и моддинге ретрогаджетов.
TECHNO BROTHER

Мультитул для инженера: волшебная коробочка с I2C/SPI/UART/JTAG за 1.000 рублей⁠⁠

23 дня назад

Будучи творческим человеком и техногиком, я обожаю при первой возможности апгрейдить своё оборудование. Время от времени я мониторю маркетплейсы в поисках чего-то новенького и в этот раз я наткнулся на настоящий мультитул для Embedded-разработчика — контроллер I2C/SPI/UART/JTAG в одной коробочке и всё это всего за 1.000 рублей... Конечно я не смог пройти мимо этой штучки и в рамках сегодняшней статьи хочу рассказать что оно из себя представляет и как с ним работать. Жду вас под катом!

❯ Что за устройство?

На самом деле такой формат статей для меня «в новинку», до этого я ни разу не делал обзоров на оборудование. Да и мой инструментарий слишком зауряден, чтобы делать ещё одну статью уровня «почему Quciko T12 лучше любой 900M станции» или «почему Вам не стоит покупать компрессорный люкей в 2025 году». Однако обзоров на сегодняшний гаджет я не нашёл, несмотря на его огромную пользу как для Embedded-разработчиков и инженеров, так и мастеров по ремонту смартфонов, планшетов и ноутбуков.

Во время подготовки статьи о том, как я написал BIOS для игровой консоли от Waveshare, в рекомендациях мне попадались другие товары от этого производителя — в том числе и сегодняшний гаджет. Меня сразу привлекла возможность переключения 3v3->5v логики и обширный набор поддерживаемых шин. В официальной вики были описаны следующие характеристики:

  • Шины: 1x SPI с двумя чип-селектами (можно подключить до двух устройств на одну шину), 1x I2C, 1x JTAG (полноценный, с ресетом!) и 2x UART с дополнительными линиями CTS/RTS для совместимости с классическими COM-портами.

  • Используемый контроллер: WCH CH347. Некоторым читателям чип может показаться знакомым по аналогии с классическим CH341A.

  • Питание: 5В, 3.3В, потребление ~65мА на VBus. Есть самовосстанавливающийся предохранитель на «входе».

Waveshare — достаточно известный бренд, под которым реализуются одноплатные компьютеры, «бутербродная» периферия для них и инструменты.

Waveshare — достаточно известный бренд, под которым реализуются одноплатные компьютеры, «бутербродная» периферия для них и инструменты.

Я сразу смекнул, что смогу использовать гаджет как для восстановления программно-убитых устройств по типу КПК, так и для отладки своих собственных самоделок, благо набор шин к этому располагает. Устройство приехало ко мне примерно через месяц, в небольшом пакетике и брендовой коробочке, в которую входило само устройство, кабель USB Type-B (ну почему не Type-C?), Dupont-провода в IDC-коннекторе для всех шин, а также небольшой мануал. Нареканий к доставке кроме скорости не возникло.

Сам гаджет представляет из себя компактную металлическую коробочку с «ушками» для удобного крепления на столе или стене. Сверху расположена шпаргалка по распиновке и режимам работы CH347, а также светодиодные индикаторы для UART.

Разбирается гаджет очень просто: достаточно лишь открутить несколько винтов с обеих боковых пластин устройства и перед нами открывается вид на плату. Схемотехника здесь простейшая: самовосстанавливающийся предохранитель, линейный регулятор AMS1117, который питает контроллер и нагрузку на VCC (до ~600мА), сам CH347, а также набор ключей для согласования режимов работы. CH347 — это не просто ASIC, а вполне себе полноценный микроконтроллер, прошивку которого можно обновить, правда SDK для использования CH347 как МК производитель не предоставляет.

После подключения гаджет радостно зажег индикатор PWR, подтвердив свою работоспособность, а значит пришло время протестировать возможные варианты использования!

❯ UART

С UART всё просто и понятно: нам достаточно лишь выбрать желаемый режим работы (M0 — двухканальный UART, остальные режимы — UART + I2C/SPI или UART + JTAG) с помощью тумблера и подключить/припаять Dupont'ы к соответствующим пинам на плате. UART здесь достаточно быстрый: при двухканальном режиме работы, на UART0 можно добиться до 9Мб/с (мегабод), а на UART1 — до 7.5Мб/с.

Провода в разъёмы установлены не бездумно — у них есть цветовая маркировка и логика помимо «красный — VCC, чёрный — GND».

Провода в разъёмы установлены не бездумно — у них есть цветовая маркировка и логика помимо «красный — VCC, чёрный — GND».

В качестве теста я решил снять лог загрузки со своего проекта самодельной игровой консоли. Для работы с UART я привык использовать Putty: сначала я припаял RX/TX и массу, затем запустил Putty и выбрал COM-порт, соответствующий первому каналу, установил бодрейт в 115200 и включил консоль:

Всё работает! В целом, гаджет можно использовать и для прошивки более сложных устройств: например многие смартфоны и кнопочные телефоны всё ещё имеют альтернативный режим прошивки через UART, а ретро-телефоны Samsung и LG так вообще не имеют альтернатив — если нет специального JIG, то остаётся лишь вызванивать RX/TX с разъёма и подпаиваться напрямую к UART процессора!

❯ SPI/I2C

С SPI и I2C уже всё чуточку интереснее. Дело в том, что как вы уже могли понять — чип использует свой собственный проприетарный протокол для организации моста между программой на ПК и шиной данных. Для работы с этим протоколом производитель предоставляет уже готовую библиотеку для Windows начиная с 2000, так что возможно у чипа есть перспективы для оживления легаси пром. оборудования. Для Linux же есть альтернативные драйвера, которые пробрасывают CH347 как обычные spidev и i2c-dev устройства.

Драйвер можно скачать здесь

Драйвер можно скачать здесь

Для проверки коммуникации можно использовать специальную тестовую программу из SDK, которая позволяет отправлять произвольные данные и даже прошивать флэшки 25 'ой и EEPROM'ки 24'ой серии.

Давайте же попробуем написать что-нибудь полезное! Например, подключим к гаджету 1.8-дюймовый дисплей и что-нибудь на него выведем.

С разводкой дисплея проблем не возникает: SDO к MOSI, SCK к CLK, VCC к VCC и BL (питание подсветки), однако для управления DBI-дисплеями необходимы ещё две дополнительные линии: D/C (линия, определяющая как интерпретировать байт на входе), а также RESET для аппаратного сброса контроллера. И с этим проблем тоже не возникает: у контроллера есть как минимум четыре свободных GPIO, два из которых мы с вами и будем использовать для управления линиями дисплея — GPIO6 (CTS на UART1) и GPIO7 (RTS на UART).

Далее я начал изучать PDF-ку с документацией сомнительного качества и писать код инициализации. Начинается всё с получения контекста устройства с помощью функции CH347OpenDevice, которая принимает в себя индекс нужного контроллера в системе и возвращает непонятный идентификатор (вероятно WinUSB?). Интересно то, что в остальном API используется не идентификатор, а как раз тот самый индекс, который в большинстве случаев будет 0. Далее мы получаем информацию об устройстве и сверяем режим работы, если он отличается от нужного — выбрасываем исключение:

/* Initialize CH347 */
deviceHandle = CH347OpenDevice(deviceIndex);
if (!deviceHandle)
throw new std::runtime_error("Failed to open CH347 device");

mDeviceInforS info;
CH347GetDeviceInfor(deviceIndex, &info);
if (info.ChipMode != 1)
throw new std::runtime_error("Incorrect chip mode");

Далее настраиваем SPI-контроллер. На выбор есть все три существующих режима, настройки полярности и возможность вручную дергать один из двух доступных ChipSelect'ов, а также тайминги. Частота работы определяется предустановленным набором делителей — 60МГц, 30МГц, 15МГц и т.п. Не забываем настроить таймаут каждой USB-транзакции:

CH347SetTimeout(deviceIndex, CommunicationTimeout, CommunicationTimeout);

/* Initialize SPI bus & GPIO */
mSpiCfgS cfg;
memset(&cfg, 0, sizeof(cfg));
cfg.CS1Polarity = 0; /* CS0 = active low */
cfg.CS2Polarity = 0;
cfg.iActiveDelay = DefaultChipSelectDelay;
cfg.iByteOrder = 1;
cfg.iClock = 0;
cfg.iDelayDeactive = DefaultChipSelectDelay;
cfg.iIsAutoDeativeCS = 0;
cfg.iMode = 0;
cfg.iChipSelect = 0;
cfg.iSpiWriteReadInterval = DefaultChipSelectDelay;

if (!CH347SPI_Init(deviceIndex, &cfg))
throw new std::runtime_error("Failed to initialize SPI");

И инициализируем дисплей. Здесь есть важный момент: функция CH347GPIO_Set устанавливает состояние всего GPIO-контроллера в чипе и поэтому принимает в себя три битовые маски с конфигурацией каждого пина. Функции GPIO стандартные — вход/выход, плюс обработка прерываний с помощью специального callback'а:

CH347GPIO_Set(deviceIndex, 1 << config.IOReset, 1 << config.IOReset, 0);
this_thread::sleep_for(16ms); /* HW reset */
CH347GPIO_Set(deviceIndex, 1 << config.IOReset, 1 << config.IOReset, 1 << config.IOReset);

/* Software initialization */
SendCommand(EMIPICommandList::cmdSWRESET, 0, 0, 16);
SendCommand(EMIPICommandList::cmdSLPOUT, 0, 0, 0);

/* Framerate and refresh */
uint8_t frameRateControlRegister[] = { 0x01, 0x2C, 0x2D };
SendCommand(EMIPICommandList::cmdFRMCTL1, frameRateControlRegister, sizeof(frameRateControlRegister), 0);
SendCommand(EMIPICommandList::cmdFRMCTL2, frameRateControlRegister, sizeof(frameRateControlRegister), 0);
SendCommand(EMIPICommandList::cmdFRMCTL3, frameRateControlRegister, sizeof(frameRateControlRegister), 0);
SendCommand(EMIPICommandList::cmdFRMCTL4, frameRateControlRegister, sizeof(frameRateControlRegister), 0);

/* Power control */
uint8_t powerControlRegister1[] = { 0xA2, 0x02, 0x84 };
SendCommand(EMIPICommandList::cmdPWCTL1, powerControlRegister1, sizeof(powerControlRegister1), 0);

uint8_t powerControlRegister2 = 0xC5;
SendCommand(EMIPICommandList::cmdPWCTL2, &powerControlRegister2, sizeof(powerControlRegister2), 0);

uint8_t powerControlRegister3[] = { 0x0A, 0x00 };
SendCommand(EMIPICommandList::cmdPWCTL3, powerControlRegister3, sizeof(powerControlRegister3), 0);

uint8_t powerControlRegister4[] = { 0x8A, 0x2A };
SendCommand(EMIPICommandList::cmdPWCTL4, powerControlRegister4, sizeof(powerControlRegister4), 0);

uint8_t powerControlRegister5[] = { 0x8A, 0xEE };
SendCommand(EMIPICommandList::cmdPWCTL5, powerControlRegister5, sizeof(powerControlRegister5), 0);

uint8_t powerControlVCOMRegister = 0x0E;
SendCommand(EMIPICommandList::cmdPWCTL6, &powerControlVCOMRegister, sizeof(powerControlVCOMRegister), 0);

/* Addressing */
uint8_t madCtlMode = 0xC8;
SendCommand(EMIPICommandList::cmdMADCTL, &madCtlMode, sizeof(madCtlMode), 0);

uint8_t rasetRegister[] = { 0x0, 0x0, 0x0, 0x7f };
uint8_t casetRegister[] = { 0x0, 0x0, 0x0, 0x9f };
SendCommand(EMIPICommandList::cmdRASET, casetRegister, sizeof(rasetRegister), 0);
SendCommand(EMIPICommandList::cmdCASET, rasetRegister, sizeof(casetRegister), 0);

uint8_t colorMode = 0x05; /* RGB565 */
SendCommand(EMIPICommandList::cmdCOLMOD, &colorMode, sizeof(colorMode), 0);
SendCommand(EMIPICommandList::cmdDISPON, nullptr, 0, 0);

...

void CDisplay::SendCommand(EMIPICommandList command, uint8_t* data, size_t length, uint32_t delay)
{
uint8_t cmd = (uint8_t)command;

/* Send command */
GPIOSet(deviceIndex, config.IODataCommand, 0);
CH347SPI_Write(deviceIndex, 0, sizeof(cmd), sizeof(cmd), &cmd);

/* Send arguments (if any) */
if (data && length)
{
GPIOSet(deviceIndex, config.IODataCommand, 1);
CH347SPI_Write(deviceIndex, 0, length, length, data);
}

this_thread::sleep_for(chrono::milliseconds(delay));
}

Теперь можно запустить программу и посмотреть на результат. Если вы увидели шум (или мусор) на экране — значит вы всё делаете правильно и контроллер успешно проинициализирован.

На фото можно заметить перемычку между CS и массой, однако не все контроллеры дисплеев толерантны к постоянному низкому уровню на CS. На моей практике контроллеры ILI отказывались проходить инициализацию, если не разграничивать каждую транзакцию с помощью CS.

Теперь можно что-нибудь вывести. Подготавливаем изображение, преобразовав в 16-битный массив пикселей, переводим контроллер в режим записи в VRAM, отправляем изображение:

void CDisplay::CopyFrameBuffer(uint8_t* pixels)
{
uint8_t cmd = (uint8_t)EMIPICommandList::cmdRAMWR;

/* Send command */
GPIOSet(deviceIndex, config.IODataCommand, 0);
CH347SPI_Write(deviceIndex, 0, sizeof(cmd), sizeof(cmd), &cmd);

GPIOSet(deviceIndex, config.IODataCommand, 1);

uint32_t frameBufferSize = config.Width * config.Height * 2;
uint32_t offset = 0;

CH347SPI_Write(deviceIndex, 0, frameBufferSize, 2, pixels);
}

И пишем небольшую демо-программу:

int main(int argc, char** argv)
{
CDisplayConfiguration config = {
ChipSelectIndex, ResetGPIOIndex, DataCommandGPIOIndex, 128, 160
};
CDisplay display(config);
display.CopyFrameBuffer(beach);


return 0;
}

Результат — на дисплее появляется картинка!

Потенциальных применений у такого гаджета много: можно сделать красивые анимированные часы, мониторинг датчиков, показ уведомлений или дублировать окно с основного ПК. А ведь когда-то ради такого покупали LPT-провода, дисплеи от Сименсов и вручную превращали параллельную шину в последовательную...

❯ Заключение

Вот такой интересный гаджет выпустила компания Waveshare — и, что радует, по очень приятной цене! Ссылку по понятным причинам прилагать не буду, но при желании вы сможете его найти на всех трёх крупных маркетплейсах. Кроме того, можно купить Breakout-плату с тем же самым чипом за ~500 рублей, но там не будет таких удобных переключателей и Dupont'ов.

К сожалению, теста JTAG в статье не будет. У меня пока нет готовых к работе необычных гаджетов, где можно было бы протестировать OpenOCD... однако мой HTC Dream всё ещё ждёт свою прошивку модема!

А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет — подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я выкладываю бэкстейджи статей, ссылки на новые статьи и видео, а также иногда выкладываю полезные посты и щитпостю. А ролики (не всегда дублирующие статьи) можно найти на моём YouTube канале.


Если вам понравилась статья...

И у вас появилось желание что-то мне задонатить (например прикольный гаджет) - пишите мне в телегу или в комментариях :) Без вашей помощи статьи бы не выходили! А ещё у меня есть Boosty.

Что думаете о таком преобразователе?
Всего голосов:
Что думаете об обзорах на оборудование? Есть смысл рассказывать о всяких ништяках, что я иногда покупаю для работы?
Всего голосов:

Подготовлено при поддержке @Timeweb.Cloud

Показать полностью 12 2
[моё] Опрос Покупка Гаджеты Обзор Embedded Своими руками Микроконтроллеры Spi Инженер Программирование C++ Длиннопост
57
12
Snejaaa
Лига Радиолюбителей

Помогите найти замену элементу платы LED драйвера⁠⁠

1 месяц назад

Добрейшего дня Вам уважаемые знатоки радиоэлектроники! Прошу помощи в поиске сгоревшего элемента. В радиомагазинах своего города (Воронеж) уже всех людей обошел, в Чип и Дип со всеми консультантами пообщался - все только руками разводят.
Суть да дело в том, что из-за скачка напряжения (трансформатор после ливня троить начал) в моей мастерской сдох один линейный светильник. Сдох да сдох, многие скажут - купи новый. Проблема в том что светильник хоть и фирмы JazzWay, но стоит конских денег, а сгорела всего лишь микруха на драйвере, жалко его выкидывать из за такой мелочи. Тем более что остальные лампы живые, разобрав как раз живую лампу и выдернув из нее точно такой же LED драйвер я смог, пусть и не без труда, прочитать надпись на микрухе. Надеялся зайти в радиомагазин, купить такое же и перепаять. Фиг там плавал. Найти такую в продаже оказалось очень сложно... В магазинах, как я и говорил выше, во всех, меня неоднократно отфутболили разведя руками. Гугл многодневный в попытках найти это великолепие тоже результатов не дал. Может и дал бы, если бы я хотя бы понимал что ищу.... В общем не выдержал - решил в любимом пикабу помощи попросить. Не пинайте сильно пожалуйста. Ниже два изображения. На первом сама микруха с живой платы, на втором единственное во всем интернете упоминание о ней(вроде о ней) в виде схемы с сайта производителя, насколько я понял.
Видимо точно такую же купить не удастся, можно ли найти ей замену которую можно просто впаять вместо этой?

Заранее спасибо за уделенное время, искренне надеюсь на Вашу помощь)

Показать полностью 2
Проблема Нужен совет Нужна помощь в ремонте Радиолюбители Радиоэлектроника Микроконтроллеры Длиннопост
16
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии