0

两个 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 引脚

主阁楼 85 的插针 5 - 从阁楼 85 的插针 5 从阁楼 85 的插针 7 - 主阁楼 85 的插脚 7

但仍然没有成功。

4

2 回答 2

0

是的,可以将 1 个 ATtiny85 用作主站,将另一个用作从站。TinyWireM 和 TinyWireS 库都编写良好且易于使用。

处理请求和发回字节就像onRequest将从读取事件处理程序设置为您选择的发送正确数据的函数一样简单。TinyWireS 库中有这样的例子。

于 2016-02-17T18:39:23.977 回答
0

您是否对 SDA 和 SCL 都使用了上拉电阻?它们对于 I2C 协议很重要。

仅供参考:任一总线上的逻辑“0”由器件驱动引脚上的实际“0”设置。另一方面,通过将设备引脚置于高阻抗,在总线上设置逻辑“1”,在 ATtiny 上,这意味着将引脚设置为 INPUT 方向。当主机和从机都将引脚设置为 hiZ 时,上拉电阻将总线上的电压拉至表示逻辑“1”的值。该解决方案可以避免双向总线上的争用(一个设备驱动“1”,第二个驱动“0”),否则会导致短路和损坏设备。因此,如果您不使用上拉电阻,则只要驱动逻辑“1”,总线就会处于悬空状态,这将导致协议错误。

于 2016-02-19T10:56:27.467 回答