Странная проблема с мастером 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. Просто какая-то странная ошибка. Как может быть такое, чтобы если адрес устройства меняю в цикле, то работает. А если он строго заданный, то не работает. Или это ошибка эмуляции.