Странная проблема с мастером I2C TWI
- Войдите на сайт для отправки комментариев
Вс, 17/03/2013 - 11:50
Здравствуйте!
Решил попробовать шину I2C. Эксперемент проводил в Proteus 7.7 SP2
Использую схему:
Для мастера (левая ардуина) использую следующий код:
#include <Wire.h> byte m1=56; byte val = 50; void setup() { Serial.begin(9600); Wire.begin(); } void loop() { m1=val; Wire.beginTransmission(m1); Wire.write(val); byte res = Wire.endTransmission(); Serial.print(m1); Serial.print(" "); Serial.print(res); Serial.print(" "); Serial.println(val); val++; if(val == 255) { val = 0; } delay(200); }
Для слейва:
#include <Wire.h> byte pin=0; const byte max1=56; void setup() { pinMode(13, OUTPUT); Wire.begin(max1); // join i2c bus with address #4 Wire.onReceive(receiveEvent); // register event Serial.begin(9600); // start serial for output } void loop() { digitalWrite(13, pin); } // function that executes whenever data is received from master // this function is registered as an event, see setup() void receiveEvent(int howMany) { pin=!pin; while(1 < Wire.available()) // loop through all but the last { char c = Wire.read(); // receive byte as a character Serial.print(c); // print the character } int x = Wire.read(); // receive byte as an integer Serial.println(x); // print the integer }
При таком коде мастера передача работает корректно:
Но если убрать строку из кода для мастера:
m1=val;
(передаем 56 слейву), то уже не работает:
Подскажите, как такое может быть, где ошибка.
Что, никто не работал с I2C. Просто какая-то странная ошибка. Как может быть такое, чтобы если адрес устройства меняю в цикле, то работает. А если он строго заданный, то не работает. Или это ошибка эмуляции.