Стандартная библиотека Wire работает на частоте 100 кГц (стандартный режим) или 400 кГц (Fast Mode). Но некоторые современные датчики (акселерометры, OLED-дисплеи, MEMS-микрофоны) поддерживают скорость до 1 МГц.
Хак: Настраиваем регистры TWI (Two-Wire Interface) напрямую, чтобы увеличить частоту I2C до предела.
Настройка I2C на максимальную скорость:
#include <Wire.h>
void setupFastI2C() {
// Включаем I2C на частоте 1 МГц
Wire.begin();
// Настраиваем регистры TWI
// TWBR = (F_CPU / F_SCL - 16) / (2 * prescaler)
// Для 16 МГц и 1 МГц: TWBR = (16000000/1000000 - 16)/2 = (16-16)/2 = 0
TWBR = 0; // Минимальное значение!
// Устанавливаем prescaler = 1 (биты TWPS = 00)
TWSR &= ~((1 << TWPS0) | (1 << TWPS1));
// Включаем внутреннюю подтяжку на пинах A4 (SDA) и A5 (SCL)
// (Необязательно, но улучшает сигнал)
PORTC |= (1 << PC4) | (1 << PC5);
}
void loop() {
// Работаем с датчиком на частоте 1 МГц
Wire.beginTransmission(0x3C); // Адрес OLED-дисплея
Wire.write(0x00);
Wire.write(0x10);
Wire.endTransmission();
// Это выполняется в 10 раз быстрее, чем на стандартной частоте!
delay(10);
}
Важно: При скорости 1 МГц длина проводов не должна превышать 10-15 см. Используйте экранированные провода и конденсаторы 100 пФ между SDA/SCL и землей для фильтрации помех.
Где применять: Для динамической визуализации на OLED-экране (обновление 60 кадров/сек), для сбора данных с 8-канального акселерометра, для передачи аудио-потоков.