Реализация I2C на MKS Robin nano v1.2 + Бонус прошивка по UART
Всем привет! История началась с того что я захотел использовать не просто концевик филамента, а мерить его толщину. Ииии есть множество разных способов как это делать. В основном используют датчики холла и магниты и далее все зависит от реализации. Но об это в другой статье... Итог: датчик сделан - а как его подключать то? Рассматривал два варианта подключения по SPI или по I2C? Что по первому что по второму нужно согласование логических уровней по хорошему. Подробности каждого из протоколов не буду рассматривать в данной статье, иначе она превратится в разбор и сравнение 2-х протоколов. НО в целом что для первого что для второго варианта нужно 5 проводов в случае SPI, это SDA, SDO, SCL, GND, 3.3v в моем случае же еще и питание 5v т.к микроконтроллер с датчиком холла работает от +5v. Для I2C нужно SCL, SDA, GND, 3.3v, (5v опционально). НО в случае если у вас планируются еще дополнительные подключения на шине SPI, то нужен еще один провод, который будет являться "ключем" для устройства.
Описание того как использовать SPI на MKS Robin nano v1.2
На плате MKS есть 1 вывод SPI из чипа STM32, доступен он на пинах идущих к дисплею. Но так как при установке Klipper'a дисплей становится рудиментом, то можно задействовать их прям из коробки. А так же есть другой вывод SPI интерфейса, это TC-MAX31855, НО он доступен только для ЧТЕНИЯ. А для записи ФИГ. Как это делают ребята из Redita ссылка. Там по сути используется разъем только для чтения и его же ключ. а чтобы сделать разъем для MOSi припаивается провод на ногу чипа U5 (W25Q64BVSSI). Что может привести к проблемам на уровне шины данных, тк данная память задействуется для работы прошивки Клиппера. Лучше выпаять разъем для дисплея и напаять разъем накладной. И получится от туда 3 провода: MOSi, MOSo, SCL, - что будет соответсвовать протоколу SPI. Под CS (SS, NSS), можно выделить любой пин, так как это всего лишь номер обращения к контроллеру. Клиппер его проставит программно. В использовании готового разъема там уже стоит хардверный номер PE5...
Описание того какие пины использует Klipper ссылка
Прикреплю скрины из треда редита, мало ли Редит когда-то тоже станет "враждебным" и его з̶а̶б̶л̶о̶к̶и̶р̶у̶ю̶т̶ замедлят :-)
Описания соединения SPI на MKS Robin Nano V1.*
Использование провода на чип памяти для реализации MOSi
Использование I2C в MKS Robin nano v1.2
Что же касается шины I2C, то и ее выводы тоже здесь отсутствуют, но не беда, чип памяти EEPROM, который единственный сидит на данной шине при установке клиппера не участвует в прошивке.
Забегая вперед чип участвует, НО для ЗАГРУЗЧИКА ОТ MKS, если вы его выпаиваете будьте готовы к тому что вам нужно в дальнейшем использовать загрузчик от STM32 (тот что находится в области защищеной от записи) - и ЭТО потребует ФИЗИЧЕСКОГО ПЕРЕВОДА АЦП в режим загрузчика, путем передачи на BOOT0 логической 1. Об этом далее...
Да и в свежих от Marlin я тоже видел что от него отказываются. Это легаси... Что же мы должны сделать? Ну собственно если он нам не нужен, то давайте удалим этот аппендицит с шины и припаяем туда провода? Маркировка чипа: AT24C16N-10SI-2.7 находится он на контактной площадке U4.
Сразу озвучу, ВЫ можете и НЕ удалять данный чип, а припаять сверху провода, но ДОБАВЛЯЕМОЕ устройство должно иметь ДРУГОЙ адрес на данной шине, чип имеет адрес по умолчанию 0x50.
Если все же вы решились на "препарирование", то позаботьтесь о другом пользовательском загрузчике, нежели MKS (в моей версии платы я этого не сделал, поэтому расскажу далее как решал данную проблему). Ссылок на другие загрузчики тоже здесь накидаю, вот, вот и вот, я их не использовал, т.к уже "препарировал" медведя и понял что обновление прошивки после выпайки чипа, не работает по SD карте. Но что за них могу сказать так это - ни один из упомянутых STM32-загрузчиков не использует EEPROM напрямую. Они работают с основными встроенными памятью STM32 (Flash) для хранения загрузчика и прошивки.
- Проект akospasztor/stm32-bootloader предоставляет загрузчик с возможностями обновления прошивки из различных источников, включая SD-карты с FAT32, но EEPROM в нём не задействован
- Проект kyungjae-lee/stm32-mcu-custom-bootloader также не включает EEPROM. Его загрузчик реализует взаимодействие через интерфейсы, такие как USART, для работы с основной памятью контроллера
Рассмотрим схемотехнику I2C на данной плате
На данной плате уже сделаны подтягивающие резисторы для работы с шиной I2C, т.е если ваше устройство работает от +3.3v то можно смело подключать провода от данной шины и задействовать их в вашем скрипте на Python или использовать из готового набора устройств что предоставляет Клиппер. Так же выделил физические выводы на STM32 контроллере, PB6 и PB7
Чип лежит ровно так же как на схеме, все выводы слева должны быть замкнуты на землю (проверьте мультиметром)
Для работы по I2C (как и по любому другому протоколу) нужна общая земля, не забудьте сделать данный "подвод"
Фото - куда же без них)
Куда же без соплей, да?)
Фото делал для себя, статью даже не планировал писать - честно. Т.к первое, мало кто решится на такое, второе - А ЗАЧЕМ скажут многие, если I2C как и SPI доступны на RPI, раз уж стоит Клиппер...
Я же захотел:
- Сделать всю коммуникацию на MKS
- Разобраться детально в схемотехнике данной платы
- На RPI планируется еще повесить экран (займет один вывод SPI, точно)
- Добавлять устройства на шину I2C - можно сепарированно, т.к есть два контроллера и две шины) Например подкинув акселерометр в RPI, что "теоритически" уменьшит кол-во ошибок на шине
Теперь о том что побудило написать статью.
Перепрошивка MKS Robin nano v1.2
без пользовательского загрузчика от MKS по UART
Как и озвучил ранее, столкнулся с проблемой НЕВОЗМОЖНОСТИ прошить по SD карте обновление от клиппера (менял реализацию шины I2C в драйверах). Как я понял у меня либо стоял старый загрузчик либо же они в EEPROM записывают какие-то данные в виде версии или хэш суммы - не знаю. Да и не хотел сильно долго ковыряться над данной задачей. Т.к. ассемблер код их стокового загрузчика читать ТО еще УДОВОЛЬСТВИЕ. В общем поняв что я в заднице. И вариант либо приобретать на Ozon/Ali ST-LINK или J-LINK и ждать и смотреть на кишки принтера минимум неделю, я не стал и подумал, а почему бы не включить на самом чипе режим загрузчика? На эту тему в MKS писали им на GitHub, что они физические кнопки/пины/выходы для этого не добавили... НУ НЕ УЖЕЛИ ЭТО ТАК СЛОЖНО... Сделать вывод... Ладно подумал я, вооружился скальпелем и увеличительными очками, стал резать дорожку. На схеме выше, обратите внимание на вывод 94 BOOT0 - он то нам и нужен, по умолчанию он замкнут на землю. Т.е в состоянии логического 0. Нам же нужно либо единовременно подать питание - WARNING питание подавать можно только разорвав соединение с GND, т.е разрезав дорожку, иначе получите КЗ (короткое замыкание). Либо же подключить к RPI, и управлять выводом программно. GND между RPI и MKS уже разведена, т.к подключение идет по UART. Подключение безопасно т.к соединение идет по 3.3v, но я все же поставил стягивающий резистор 10kOM на землю. Т.е сделав таким образом схему RPI -> BOOT0 -> Resistor -> GND Добавил я его затем что если случайно что-то коротну (даже программно) не превратить RPI или STM32 проц в кирпич. По сути все, осталось научить управлять RPI данным GPIO включать его и выключать.
Не забываем что после переключения BOOT0 в режим +3.3v или стягивание в 0, нужно перезагружать плату MKS Robin nano
А теперь перейдем к фото и в конце прикреплю скрипт для управления GPIO
Фото перезанной дорожки не успел сделать, но она собственно почти сразу после выхода из STM32 идет в петлю, поэтому не ошибетесь.
Теперь данный провод садим на GPIO RPI и мы можем загружать прошивку не вставая с дивана :D Ах да, не забудьте данный провод зафиксировать, т.к велик риск что его можно обломить/выдрать случайно. ЗА этим я и сажал это на термосопли, а дорожку залакировал.
Обещанный скрипт:
import RPi.GPIO as GPIO
BOOT_PIN = 23 # используйте ВАШ GPIO
# Инициализация GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(BOOT_PIN, GPIO.OUT)
# Проверка текущего состояния пина
def toggle_boot0():
current_state = GPIO.input(BOOT_PIN)
new_state = GPIO.LOW if current_state == GPIO.HIGH else GPIO.HIGH
GPIO.output(BOOT_PIN, new_state)
print(f"BOOT0 toggled to {'HIGH' if new_state == GPIO.HIGH else 'LOW'}")
if __name__ == "__main__":
toggle_boot0()
Как проверить что GPIO переключился? Чекните через
gpio readall
Внимание:
Т.к загрузчика больше НЕТ, то и offset bootloader в make menuconfig больше не НУЖНО ДЕЛАТЬ. Иначе плата не запустится.
В Klipper запись прошивки на STM32 начинается с адреса 0x08000000, если используется стандартное расположение памяти для основного кода (flash memory). Этот адрес соответствует началу флеш-памяти на STM32, где загружается основная программа (прошивка).
Если используется стандартный загрузчик STM32 (bootloader), он сам управляет перепрошивкой с этого адреса. Klipper-прошивка компилируется таким образом, чтобы быть размещенной именно с 0x08000000, начиная с вектора сброса (reset vector) и таблицы прерываний.
Я загружаю прошивку через stm32flash, он уже есть в дистрибутиве RPI.
Fast command:
stm32flash -w ~/klipper/out/klipper.bin /dev/ttyAMA0
Если плохого качества провода на UART, то советую уменьшить baud rate, например до 9600.
stm32flash -b 9600 -w ~/klipper/out/klipper.bin /dev/ttyAMA0
/dev/ttyAMA0 ваша плата MKS, тут уж у каждого она может располагаться по разному, сканируйте через
ls -l /dev/tty
Еще больше интересных статей
Как определить высоту слоя прерванной печати
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Настройка Marlin для датчика Biqu microprobe для платы BigTreeTech_SKR_mini_E3_V2.0
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
G-CODE по-русски для 3D печати (Мини-справочник)
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Комментарии и вопросы
Это очень не тривиальная, если...
Печатающая голова 650 грамм!!!...
Нет столько времени, чтобы раз...
я случайно замкнул какие-то пр...
Здравствуйте. Есть проблема с...
Испортив шлиц винта при разбор...
Печатаю на 3D принтере Anycubi...