AFON // радиотехник affonya@mail.ru
← Все проекты для дронов

Сканер шины I2C

Поиск адресов устройств на шине I2C (TWI) — базовая диагностика.

DMC.26 · Датчики · ATmega328P

Задача

Опросить все адреса I2C и отметить откликнувшиеся устройства.

Алгоритм

TWI START + адрес+W; если пришёл ACK — устройство есть. Перебор адресов 1..127, индикация найденного.

Исходный код (C, avr-gcc)

⇩ Скачать 26-i2c-scan.c

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#include <avr/io.h>
#include <util/delay.h>

static void twi_init(void){ TWSR=0; TWBR=72; }        // ~100кГц при 16МГц
static uint8_t twi_start_addr(uint8_t addr){
  TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while(!(TWCR&(1<<TWINT)));
  TWDR=(addr<<1);                                       // запись
  TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR&(1<<TWINT)));
  uint8_t ok=((TWSR&0xF8)==0x18);
  TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
  return ok;
}
int main(void){
  DDRB|=(1<<PB5); twi_init();
  for(;;){
    uint8_t found=0;
    for(uint8_t a=1;a<127;a++) if(twi_start_addr(a)) found++;
    for(uint8_t i=0;i<found;i++){ PORTB|=(1<<PB5);_delay_ms(120);PORTB&=~(1<<PB5);_delay_ms(120);}
    _delay_ms(1000);
  }
}

Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf

Пояснения

Полезно для проверки подключения MPU6050 (0x68), компаса, барометра, OLED. Подтяжки SDA/SCL обязательны.