Zum Inhalt springen

DimmerLink не обнаруживается на шине I2C: режим UART по умолчанию

DimmerLink поставляется в режиме UART и не появится при сканировании шины I2C, пока режим не будет явно переключён. Подключение в режиме UART может удерживать линии I2C в низком состоянии и зависить сканер. В статье описана правильная процедура переключения и необходимая обвязка с подтяжкой.

TL;DR: DimmerLink поставляется с завода в режиме UART. Команда i2cdetect не покажет адрес 0x50, пока вы не отправите команду SWITCH_I2C (02 5B) по UART на скорости 115200 бод. Также добавьте подтягивающие резисторы 4,7 кОм на SDA и SCL — на многих платах встроенные резисторы недостаточны. Установите VCC в соответствии с логическим уровнем вашего МК (5В, 3,3В или 1,8В).




Симптом

Вы подключаете DimmerLink к шине I2C, запускаете i2cdetect -y 1 (или сканируете из Arduino), и получаете один из результатов:

  • таблица адресов полностью пуста — адрес 0x50 не отображается;
  • сканирование занимает значительно дольше обычного или зависает.



Причина 1 — Неверный режим (активен UART)

Каждый модуль DimmerLink поставляется с завода в режиме UART. В режиме UART:

  • устройство не отслеживает шину I2C;
  • контакты TX/SDA и RX/SCL работают как выходы UART;
  • устройство не может отвечать на I2C-адреса — оно никогда не появится при сканировании.

Интерфейс I2C активен только после переключения в режим I2C. Режим сохраняется в EEPROM и сохраняется после отключения питания, поэтому переключать нужно только один раз.




Причина 2 — Режим UART удерживает линии I2C в низком состоянии

Когда DimmerLink находится в режиме UART и подключён к шине I2C:

  • Выход UART TX находится в логической единице в состоянии ожидания — это не проблема.
  • Некоторые реализации UART переводят выход в логический ноль между передачами или во время запуска.

Если линия TX (подключённая к SDA) уйдёт в ноль, она потянет линию SDA вниз. Сканер I2C подаёт условие START на SDA и SCL, но SDA остаётся низкой — шина кажется постоянно занятой. i2cdetect будет ожидать несколько секунд на каждый адрес до таймаута, из-за чего сканирование кажется зависшим.

Это не аппаратная неисправность — после переключения DimmerLink в режим I2C линии SDA/SCL становятся настоящими двунаправленными линиями I2C и проблема исчезает.




Причина 3 — Отсутствуют подтягивающие резисторы

I2C требует внешних подтягивающих резисторов на SDA и SCL. Без них напряжение на этих линиях не может подняться до логической единицы и шина не работает.

Плата Встроенная подтяжка I2C Достаточность
Raspberry Pi 3/4/5 1,8 кОм (на плате) Обычно достаточно
Arduino Uno / Mega ~50 кОм (слабая) Недостаточно — добавьте внешние
ESP8266 / ESP32 ~50 кОм (слабая) Недостаточно — добавьте внешние
STM32 Нет Необходимы внешние
Raspberry Pi Pico Нет Необходимы внешние

Рекомендуемое значение: 4,7 кОм от SDA до VCC и 4,7 кОм от SCL до VCC. Используйте то же значение VCC, что и у DimmerLink (см. ниже).




Причина 4 — Несоответствие напряжения VCC

DimmerLink поддерживает три напряжения питания:

VCC Логические уровни Типичный МК
5В TTL Arduino Uno, Mega
3,3В 3,3В CMOS ESP32, ESP8266, Raspberry Pi
1,8В 1,8В CMOS МК с низким напряжением

Подключите VCC к тому же напряжению, что и логика вашего МК. Не смешивайте: DimmerLink с VCC 5В, подключённый к МК на 3,3В, создаст сигналы 5В на SDA/SCL, что может повредить МК или вызвать логические ошибки.

Преобразователь уровней не нужен — DimmerLink адаптируется к любому поданному VCC.




Решение: переключение в режим I2C шаг за шагом


Что понадобится

  • USB-UART адаптер (CP2102, CH340, FT232 или аналог)
  • Провода
  • Любая программа для работы с последовательным портом


Шаг 1 — Подключение DimmerLink к USB-UART адаптеру

Контакт DimmerLink Контакт UART адаптера
VCC Выход 3,3В
GND GND
TX/SDA RX
RX/SCL TX

Подключите TX к RX и RX к TX (перекрёстно). Питание от выхода 3,3В адаптера — не используйте 5В, если UART адаптер работает только на 5В сигналах.


Шаг 2 — Откройте последовательный терминал

Настройки: 115200 бод, 8 бит данных, без чётности, 1 стоп-бит (8N1).

Рекомендуемые программы:

  • Windows: RealTerm (режим отправки HEX)
  • Linux/macOS: Python с библиотекой pyserial (см. ниже)


Шаг 3 — Отправьте команду SWITCH_I2C

Отправьте сырые байты: 02 5B

  • В RealTerm: вкладка Send → поле Send Numbers: 02 5BSend
  • На Linux/macOS — используйте следующую команду Python (требуется pyserial):
bash
python3 -c "
import serial
s = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
s.write(bytes([0x02, 0x5B]))
resp = s.read(1)
print('Ответ:', resp.hex() if resp else 'нет ответа')
s.close()
"

Замените /dev/ttyUSB0 на ваш порт (/dev/ttyACM0, /dev/ttyS0 и т.д.). Установите pyserial при необходимости: pip install pyserial.

Ожидаемый ответ: 00 (один байт, OK).

Если ответа нет:

  • Проверьте, что TX/RX перекрещены (TX адаптера → RX DimmerLink).
  • Убедитесь, что скорость ровно 115200 бод.
  • Убедитесь, что VCC подключён.


Шаг 4 — Проверка переключения режима

После получения 00 DimmerLink находится в режиме I2C. Отключите от UART адаптера, подключите для I2C и выполните сканирование:

Raspberry Pi:

bash
i2cdetect -y 1

Arduino:

cpp
#include <Wire.h>
void setup() {
    Serial.begin(115200);
    Wire.begin();
    for (uint8_t addr = 1; addr < 127; addr++) {
        Wire.beginTransmission(addr);
        if (Wire.endTransmission() == 0) {
            Serial.print("Найден по адресу 0x");
            Serial.println(addr, HEX);
        }
    }
}

Ожидаемый результат: адрес 0x50 найден.




Подключение для работы в режиме I2C

После переключения в режим I2C подключите следующим образом:


Raspberry Pi

GPIO разъём RPi DimmerLink
Контакт 1 (3,3В) VCC
Контакт 6 (GND) GND
Контакт 3 (GPIO2 / SDA) TX/SDA
Контакт 5 (GPIO3 / SCL) RX/SCL

На RPi встроены резисторы 1,8 кОм на GPIO2/3 — обычно достаточно для кабелей до 30 см. Добавьте внешние 4,7 кОм, если связь ненадёжна.


Arduino (Uno/Mega)

Arduino DimmerLink
A4 (SDA) TX/SDA
A5 (SCL) RX/SCL
VCC
GND GND

Добавьте резисторы 4,7 кОм от A4 до 5В и от A5 до 5В.


ESP32

ESP32 DimmerLink
GPIO21 (SDA) TX/SDA
GPIO22 (SCL) RX/SCL
3,3В VCC
GND GND

Добавьте резисторы 4,7 кОм от GPIO21 до 3,3В и от GPIO22 до 3,3В.


Схема подключения подтягивающих резисторов

text
VCC (совпадает с VCC DimmerLink)
 │
 ├── 4,7кОм ── SDA
 │
 └── 4,7кОм ── SCL



Проверка связи


Raspberry Pi (командная строка)

bash
# Читаем частоту сети (должно вернуть 50 или 60)
i2cget -y 1 0x50 0x20
# Устанавливаем яркость 50%
i2cset -y 1 0x50 0x10 50
# Читаем яркость обратно
i2cget -y 1 0x50 0x10


Arduino

cpp
#include <Wire.h>
void setup() {
    Serial.begin(115200);
    Wire.begin();
    // Устанавливаем яркость 50%
    Wire.beginTransmission(0x50);
    Wire.write(0x10);  // регистр DIM0_LEVEL
    Wire.write(50);    // 50%
    if (Wire.endTransmission() == 0) {
        Serial.println("DimmerLink: яркость установлена 50%");
    } else {
        Serial.println("Ошибка: DimmerLink не отвечает");
    }
}


Python (Raspberry Pi)

python
from smbus2 import SMBus
try:
    bus = SMBus(1)
    freq = bus.read_byte_data(0x50, 0x20)
    print(f"DimmerLink OK — частота сети: {freq} Гц")
    bus.close()
except OSError as e:
    print(f"Не найден: {e}")
    print("Проверьте: режим I2C переключён, резисторы установлены, VCC верный")



Переключение обратно в режим UART

Если нужно вернуться в режим UART, запишите команду 0x03 (SWITCH_UART) в регистр COMMAND I2C (0x01):

Arduino:

cpp
Wire.beginTransmission(0x50);
Wire.write(0x01);   // регистр COMMAND
Wire.write(0x03);   // SWITCH_UART
Wire.endTransmission();
// I2C больше не работает — подключайтесь через UART

Raspberry Pi:

bash
i2cset -y 1 0x50 0x01 0x03
# Теперь управление только через UART



Блок-схема диагностики

text
i2cdetect не показывает ничего по адресу 0x50?
         │
         ├── Подключён ли VCC DimmerLink и правильное ли напряжение? → Нет → Подключите VCC
         │
         ├── Была ли отправлена команда SWITCH_I2C (02 5B по UART)? → Нет → Отправьте
         │
         ├── Установлены ли подтяжки 4,7кОм на SDA и SCL? → Нет → Установите
         │
         ├── SDA подключён к SDA, SCL к SCL? → Нет → Исправьте
         │
         └── Зависает ли i2cdetect (медленное сканирование)?
                 → Активен режим UART → Сначала отправьте SWITCH_I2C



Краткий чеклист

  • ☐ Отправлена команда SWITCH_I2C (`02 5B`) по UART на 115200 бод
  • ☐ Получен ответ `00` (подтверждение переключения)
  • ☐ VCC установлен в соответствии с логическим уровнем МК (рекомендуется 3,3В)
  • ☐ Подтяжка 4,7 кОм от SDA до VCC
  • ☐ Подтяжка 4,7 кОм от SCL до VCC
  • ☐ SDA подключён к SDA (не перекрёстно)
  • ☐ SCL подключён к SCL (не перекрёстно)
  • ☐ `i2cdetect -y 1` показывает `50` в таблице



  • Связанные статьи



    Остались вопросы?

    Задайте на forum.rbdimmer.com или откройте GitHub Issue.

    Diesen Beitrag teilen
    Anmelden , um einen Kommentar zu hinterlassen