LINUX.ORG.RU

NanoPi-AR: I2C bus locked (mv64xxx), i2cdetect ничего не видит, шина залипла

 , , , ,


0

1

Плата: Одноплатный микрокомпьютер NanoPi-AR + расширительная Stem Boad 2 OС: YoctoBased Linux kernel 5.16

Проблема: I2C шина i2c-2 постоянно в состоянии «bus locked». i2cdetect -y 2 не видит ни одного устройства.

Что уже проверено:

  • Все внешние I2C-устройства полностью отключены физически
  • Перемычки, влияющие на сигнальные линии (UART/I2C), сняты
  • SDA/SCL не замкнуты внешними устройствами
  • Перезагрузка и обесточивание не помогают
  • cat /sys/kernel/debug/gpio показывает, что пины SDA/SCL захвачены pinctrl’ом, не висят как GPIO

Вывод i2cdetect 0/2 всегда пустой, даже при подключенных датчиках.

Вывод dmesg: [ i2c i2c-2: mv64xxx: I2C bus locked, block: 1, time_left: 0 ] (повторяется постоянно)

GPIO состояние: ('''gpiochip0: GPIOs 0-223, parent: platform/1c20800.pinctrl, 1c20800.pinctrl: gpio-2 ( |direction ) out hi gpio-10 ( |nanopi:blue:status ) out lo gpio-166 ( |cd ) in hi ACTIVE LOW gpio-204 ( |usb0_id_det ) in hi IRQ gpio-205 ( |shutdown ) out hi

gpiochip1: GPIOs 352-383, parent: platform/1f02c00.pinctrl, 1f02c00.pinctrl: gpio-354 ( |usb0-vbus ) out lo gpio-355 ( |k1 ) in hi IRQ ACTIVE LOW gpio-358 ( |vdd-cpux ) out lo gpio-359 ( |reset ) out hi ACTIVE LOW gpio-362 ( |nanopi:green:pwr ) out hi ''')

Подозрения:

  • I2C-контроллер залип в LOW на уровне SoC
  • либо аппаратная обвязка платы удерживает линию
  • либо проблема в pinctrl / device-tree для данной платформы

Интересуют следующие моменты:

  1. Возможен ли программный сброс I2C-контроллера mv64xxx (через sysfs / pinctrl / reset)?
  2. Может ли линия удерживаться внутренним устройством платы (питание, защита, EEPROM)?
  3. Есть ли известные проблемы с I2C на NanoPi-AR / mv64xxx?
  4. Можно ли безопасно переинициализировать SDA/SCL как GPIO для «разжатия» шины? Буду благодарен за любые подсказки или направление, куда копать дальше. https://disk.yandex.ru/i/5yTRw4s_G-_UUA пособие по одноплатнику https://disk.yandex.ru/i/033PINReUb-72w стр 56


Последнее исправление: Dugtai (всего исправлений: 1)

Я очень давно лазил в I2C, но по описанию это похоже на аппаратную проблему, проверьте мультиметром на пустой шине что у вас на SDA и SCL относительно GND. Должно быть HIGH.

В резулате:

  • Если хоть на одной из этих линий будет LOW, то проблема аппаратная - ковыряйте pull up резистор (ну или реально есть еще что-то что держит в LOW или что-то с пинами).
  • Если обе линии HIGH, то проблема скорее всего программная, в драйвере.
Obezyan
()

Такое может происходить, когда забыли добавить подтягивающие резисторы на i2c шину. Или их добавляйте физически. Или в pinmux сделайте подтяжку к нужному напряжению

AlexVR ★★★★★
()