Arduino ESP32 I2C Slave 的例子

Arduino 作为 I2C Slave 算是比较冷门的使用方式,下面是一个实际的例子:

#include <Wire.h>

byte i2c_rcv=0;               // data received from I2C bus

void setup() {
  Wire.begin(0x08);           // join I2C bus as Slave with address 0x08

  // event handler initializations
  Wire.onReceive(dataRcv);    // register an event handler for received data
  Wire.onRequest(dataRqst);   // register an event handler for data request
  Serial.begin(115200);
}

void loop() {
}

//received data handler function
void dataRcv(int numBytes) {
  Serial.print("Slave Received ");
  Serial.print(numBytes);
  Serial.println("Bytes");
  while (Wire.available()) { // read all bytes received
    i2c_rcv = Wire.read();
    Serial.print("[");
    Serial.print(i2c_rcv);
    Serial.print("]");
  }
  Serial.println("");
}

// requests data handler function
void dataRqst() {
    Wire.write(i2c_rcv); // send potentiometer position
    Serial.print("Slave send ");
    Serial.print(i2c_rcv,HEX);
}

运行之后,Arduino 作为一个地址为 0x08 的I2C设备。当它收到 Master 发送过来的数据,会进入 void dataRcv(int numBytes)  函数,然后将收到的数据输出到串口上;当它收到 Master 发送的读请求,会进入void dataRqst() 函数,将之前收到的数据返回给 Master 。

试验使用 Leonardo 板子,使用调试器发送 10 17 表示对 0x08 地址的设备发送 0x17,之后调试器发送 11 01 表示从 0x08 设备读取一字节数据:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注