首页 > 解决方案 > Attiny85 与 ArduinoUno 用于 I2c 通信

问题描述

我正在研究用于 I2C 通信的 attiny85。我已经浏览了不同的库,例如Wire.h, TinyWire.h, tinyWireM.h, tinyWireS.h.

一开始,我想通过 I2C 通信发送一些数据字节,并尝试用示波器对引脚进行范围,但它没有给我适当的结果。在互联网上寻找使 attiny85 与 I2c 一起工作的不同方法真的很无情,我无法完成任务。最后,我试着让 attiny85 做主人,把 arduino Uno 做奴隶,因为它在我的盒子里是备用的。

我试图将 attiny85 设为 master 并将数据发送到 arduino 并在串行监视器上查看输出,但它显示为零。

作为参考,附上主代码和从代码,我的任务很简单,检查串行。

Attiny85 作为 Master

#include <TinyWireM.h>

void setup()
{
  TinyWireM.begin();
}
void loop()
{
  TinyWireM.begin();
  TinyWireM.beginTransmission(0x08);
  TinyWireM.send(0x99);  
  int Byte1 = TinyWireM.endTransmission();
  delay(1000);
}

Arduino作为奴隶

#include <Wire.h>
const byte add = 0x08;
int byte1;
void setup()
{
  Wire.begin(add);               
  Wire.onReceive(receiveEvent); 
  Serial.begin(9600);         
}

void loop()
{
  Serial.println ("Data receiving");
  Serial.println(byte1);
  delay(1000);
}

void receiveEvent(int bytes)
{
  byte1 = Wire.read(); 
}

但我无法在 arduino 的串行监视器上获得输出。我在这里做错了什么?

标签: arduino-unoi2cattiny

解决方案


一段时间前,我使用 TinyWireS 库(https://github.com/nadavmatalon/TinyWireS)将 Atiny85 用作从站,它运行良好。以下是引脚配置

带有 Arduino Uno A4 的 ATtiny85 引脚 5 和带有 Arduino Uno A5 的 ATtiny85 引脚 7

以下是我的代码

一丁点。

#include "TinyWireS.h"                      

 const byte SLAVE_ADDR = 100;
 const byte NUM_BYTES = 4;

 volatile byte data = { 0, 1, 2, 3 };

 void setup() {
    TinyWireS.begin(SLAVE_ADDR);
    TinyWireS.onRequest(requestISR);
}

 void loop() {}

 void requestISR() {
    for (byte i=0; i<NUM_BYTES; i++) {
        TinyWireS.write(data[i]);
        data[i] += 1;
    }
}

一诺。

#include <Wire.h>

 const byte SLAVE_ADDR = 100;

 const byte NUM_BYTES = 4;

 byte data[NUM_BYTES] = { 0 };

 byte bytesReceived = 0;

 unsigned long timeNow = millis();

 void setup() {
    Serial.begin(9600);
    Wire.begin();
    Serial.print(F("\n\nSerial is Open\n\n"));
}

 void loop() {
    if (millis() - timeNow >= 750) {                                        // trigger every 750mS
        Wire.requestFrom(SLAVE_ADDR, NUM_BYTES);                            // request bytes from slave
        bytesReceived = Wire.available();                                   // count how many bytes received
        if (bytesReceived == NUM_BYTES) {                                   // if received correct number of bytes...
            for (byte i=0; i<NUM_BYTES; i++) data[i] = Wire.read();         // read and store each byte
            printData();                                                    // print the received data
        } else {                                                            // if received wrong number of bytes...
            Serial.print(F("\nRequested "));                                // print message with how many bytes received
            Serial.print(NUM_BYTES);
            Serial.print(F(" bytes, but got "));
            Serial.print(bytesReceived);
            Serial.print(F(" bytes\n"));
        }
        timeNow = millis();                                                 // mark preset time for next trigger
    }
}

 void printData() {
    Serial.print(F("\n"));
    for (byte i=0; i<NUM_BYTES; i++) {
          Serial.print(F("Byte["));
          Serial.print(i);
          Serial.print(F("]: "));
          Serial.print(data[i]);
          Serial.print(F("\t"));
    }
    Serial.print(F("\n"));    
}

推荐阅读