是否可以在两个ATtiny85之间进行通信?我可以使用我的Arduino与ATtiny85进行通信,方法是使用Arduino Uno作为主站,ATtiny85作为从站。但是我想使用一个ATtiny85作为主站,一个作为从站。这可能吗?
我无法理解TinyWireM库中给出的示例。我想要一个简单的主从代码进行通信。例如,主站应该要求 1 个整数值,从站应该回复。
我的从属代码:
#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 引脚
主站的引脚 585 - 从站的引脚 785从站的引脚 7 attiny85 - 主设备引脚 585
我也尝试过不交叉连接它们。 示例和连接是 SDA 到 SDA 引脚
主站的引脚 585 - 从站的引脚 585从站的引脚 7 attiny85 - 主站的引脚 785
但仍然没有成功。
是的,可以使用 1 个 ATtiny85 作为主站,另一个用作从站。TinyWireM和TinyWireS库都写得很好,易于使用。
处理请求和发回字节就像将onRequest
从属读取事件处理程序设置为您选择的函数一样简单,该函数将正确的数据发送回去。TinyWireS库中有这样的例子。
SDA和SCL是否都使用了上拉电阻?它们对于 I2C 协议很重要。
仅供参考:任一总线上的逻辑"0"由器件驱动引脚上的实际"0"设置。另一方面,通过将器件引脚置于高阻抗中来设置总线上的逻辑"1",如果在 ATtiny 上,则意味着将引脚设置为输入方向。当主机和从机均将引脚设置为hiZ时,上拉电阻将总线上的电压拉至表示逻辑"1"的值。此解决方案允许避免双向总线上的争用(一个设备驱动"1",第二个设备驱动"0"(,以免导致短路和损坏设备。因此,如果不使用上拉电阻,则每当驱动逻辑"1"时,总线将保持浮动状态,这将导致协议错误。