Как узнать работает ли i2c?
- Войдите на сайт для отправки комментариев
Ср, 20/04/2016 - 04:20
Здравствуйте. Есть плата mega2560. Пытался подключить мелкий oled на i2c (пины 20 и 21, vcc на 23)но безрезультатно.
Подумал может это от того что неправильно задаю адрес устройства, но просканировать доступные адреса програмкой-сканером ( https://github.com/todbot/arduino-i2c-scanner/blob/master/I2CScanner/I2CScanner.ino ) не получается, программа похоже виснет на сканировании первого же адреса, даже если отключить шилд. Что это может быть, аппаратные проблемы? Можно ли попробовать перенести i2c на другие пины и каким образом?
1. как подключаете?
2. sda и scl не перепутали?
http://arduino.ru/Hardware/ArduinoBoardMega2560
3. gnd подключили?
4. что за экран?
5. может ему 3.3 вольта надо?
6. питание на 23 пине? не уверен
#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 на аппаратных пинах? Вышеприведённая программа сканер зависает на обращении по первому адресу (к плате ничего не подключено), хотя теоретически должна отписать что адрес не занят если я правильно понимаю.
Ну раз вы добрались до utility/twi.h то посмотреть код twi_WrieTo() вам труда не составит. Я это к тому, что сильно не уверен что попытка передать 0 байт выдаст на шину только адрес, а не попыткается передать 65к байт данных. Ну и обработчик прерывания заодно глянуть ..
Если программа зависает намертво, значит twi_WriteTo() скорее всего не выходит из цикла ожидания готовности по завершению передачи.
И ещё, попробуйте эту утилиту от 1.6.4 .. она там позволяет делать не блокирующие операции. Тут её успели "пооптимизировать".
Подтяжка есть?
http://easyelectronics.ru/interface-bus-iic-i2c.html