两个ATtiny85之间可以通信吗?我可以使用我的Arduino与ATtiny85进行通信,使用Arduino Uno作为主人,ATtiny85作为奴隶。但我想用一个ATtiny85作为主人,一个作为奴隶。这可能吗 ?
我无法理解TinyWireM库中给出的示例。我想要一个简单的主和从代码进行通信。例如,master应该要求1个整数值,slave应该回复。
我的奴隶代码:
#define I2C_SLAVE_ADDRESS 0x14 // Address of the slave
#include <TinyWireS.h>
int i=0;
void setup()
{
TinyWireS.begin(I2C_SLAVE_ADDRESS); // join i2c network
TinyWireS.onRequest(requestEvent);
}
void loop()
{
TinyWireS_stop_check();
}
void requestEvent()
{
if(i==1000)
{
TinyWireS.send(1);
i=0;
}
else
i++;
}
我的主密码
#include <TinyWireM.h>
#define DS1621_ADDR 0x14
void setup()
{
TinyWireM.begin();
pinMode(4, OUTPUT);
}
void loop()
{
TinyWireM.requestFrom(DS1621_ADDR,4); // Request 1 byte from slave
int tempC = TinyWireM.receive();
if(tempC)
{
digitalWrite(4, HIGH);
delay(1000); // wait for a second
digitalWrite(4, LOW);
delay(1000); // wait for a second
}
if(tempC>1)
{
digitalWrite(4, HIGH);
delay(1000); // wait for a second
digitalWrite(4, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
}
我尝试了上面的代码,但仍然看不到LED闪烁。但是,如果我保持奴隶代码原样并在Arduino上使用以下主代码,那么一切正常。
Arduino Uno代码为主。
#include <Wire.h>
float i1=-1, i2=-1;
void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
void loop()
{
Wire.requestFrom(4, 1); // request 1 byte from slave address 4
while(Wire.available()) // slave may send less than requested
{
i1 = Wire.read(); // receive a byte as character
Serial.println(i1); // print the character
}
}
连接是连接是SDA到SCL引脚
主attiny85的引脚5 - 从属attiny85的引脚7 从属attiny85的引脚7 - 主attiny85的引脚5
我也试过没有交叉连接它们。示例和连接是SDA到SDA引脚
主attiny85的引脚5 - 从属attiny85的引脚5 从属attiny85的引脚7 - 主attiny85的引脚7
但仍然没有成功。
答案 0 :(得分:0)
是的,可以使用1个ATtiny85作为主设备,另一个作为从设备使用。 TinyWireM和TinyWireS库都写得很好并且易于使用。
处理请求并发送回字节就像将onRequest
从属读取事件处理程序设置为您选择的函数一样简单,该函数会返回正确的数据。 TinyWireS库中有这样的例子。
答案 1 :(得分:0)
SDA和SCL都使用了上拉电阻吗?它们对I2C协议很重要。
仅供参考:逻辑&#39; 0&#39;在任一总线上由设备驱动实际设置&#39; 0&#39;在针上。另一方面,逻辑&#39; 1&#39;通过将器件引脚置于高阻态设置在总线上,如果在ATtiny上,则意味着将引脚设置为INPUT方向。当主器件和从器件都将引脚设置为hiZ时,上拉电阻将总线上的电压拉至表示逻辑“1”的值。该解决方案允许避免双向总线上的争用(一个设备驱动&#39;以及第二个驱动&#39; 0&#39;)而不是导致短路和损坏设备。因此,如果您不使用上拉电阻,只要逻辑“1”,总线就会悬空。被驱动,它将导致协议错误。