Как узнать работает ли i2c?

Otto_Katz
Offline
Зарегистрирован: 20.04.2016

Здравствуйте. Есть плата mega2560. Пытался подключить мелкий oled на  i2c (пины 20 и 21, vcc на 23)но безрезультатно.

Подумал может это от того что неправильно задаю адрес устройства, но просканировать доступные адреса програмкой-сканером ( https://github.com/todbot/arduino-i2c-scanner/blob/master/I2CScanner/I2CScanner.ino ) не получается, программа похоже виснет на сканировании первого же адреса, даже если отключить шилд.  Что это может быть, аппаратные проблемы? Можно ли попробовать перенести i2c на другие пины и каким образом?

toc
Offline
Зарегистрирован: 09.02.2013

1. как подключаете?
2. sda и scl не перепутали?
http://arduino.ru/Hardware/ArduinoBoardMega2560
3. gnd подключили?
4. что за экран?
5. может ему 3.3 вольта надо?
6. питание на 23 пине? не уверен

Otto_Katz
Offline
Зарегистрирован: 20.04.2016
#include "Wire.h"
extern "C" { 
#include "utility/twi.h"  // from Wire library, so we can do bus scanning
}

// Scan the I2C bus between addresses from_addr and to_addr.
// On each address, call the callback function with the address and result.
// If result==0, address was found, otherwise, address wasn't found
// (can use result to potentially get other status on the I2C bus, see twi.c)
// Assumes Wire.begin() has already been called
void scanI2CBus(byte from_addr, byte to_addr, 
                void(*callback)(byte address, byte result) ) 
{
  byte rc;
  byte data = 0; // not used, just an address to feed to twi_writeTo()
  for( byte addr = from_addr; addr <= to_addr; addr++ ) {
    rc = twi_writeTo(addr, &data, 0, 1, 0);
    callback( addr, rc );
  }
}

// Called when address is found in scanI2CBus()
// Feel free to change this as needed
// (like adding I2C comm code to figure out what kind of I2C device is there)
void scanFunc( byte addr, byte result ) {
  Serial.print("addr: ");
  Serial.print(addr,DEC);
  Serial.print( (result==0) ? " found!":"       ");
  Serial.print( (addr%4) ? "\t":"\n");
}


byte start_address = 8;       // lower addresses are reserved to prevent conflicts with other protocols
byte end_address = 119;       // higher addresses unlock other modes, like 10-bit addressing

// standard Arduino setup()
void setup()
{
    Wire.begin();

    Serial.begin(9600);                   // Changed from 19200 to 9600 which seems to be default for Arduino serial monitor
    Serial.println("\nI2CScanner ready!");

    Serial.print("starting scanning of I2C bus from ");
    Serial.print(start_address,DEC);
    Serial.print(" to ");
    Serial.print(end_address,DEC);
    Serial.println("...");

    // start the scan, will call "scanFunc()" on result from each address
    scanI2CBus( start_address, end_address, scanFunc );

    Serial.println("\ndone");
    
    // Set pin mode so the loop code works ( Not required for the functionality)
    pinMode(13, OUTPUT);
}

// standard Arduino loop()
void loop() 
{
    // Nothing to do here, so we'll just blink the built-in LED
    digitalWrite(13,HIGH);
    delay(300);
    digitalWrite(13,LOW);
    delay(300);
}

 

предлагаю экран пока оставить в покое, как проверить работоспособность i2c  на аппаратных пинах? Вышеприведённая программа сканер зависает на обращении по первому адресу (к плате ничего не подключено), хотя теоретически должна отписать что адрес не занят если я правильно понимаю.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну раз вы добрались до utility/twi.h то посмотреть код twi_WrieTo() вам труда не составит. Я это к тому, что сильно не уверен что попытка передать 0 байт выдаст на шину только адрес, а не попыткается передать 65к байт данных. Ну и обработчик прерывания заодно глянуть ..

Если программа зависает намертво, значит twi_WriteTo() скорее всего не выходит из цикла ожидания готовности по завершению передачи.

И ещё, попробуйте эту утилиту от 1.6.4 .. она там позволяет делать не блокирующие операции. Тут её успели "пооптимизировать".

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012