两个 attiny 85 IC 之间的主从通信



是否可以在两个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"时,总线将保持浮动状态,这将导致协议错误。

最新更新