ESP32 I2C通信
I2C简述
两线式串行总线(SDA和SCL),半双工通信方式(支持来回通信,但每次只能一方通过)
通用函数:Wire.begin() 作为主机加入
Wire.begin(27) 只有一个参数的是作为从机加入
主机向从机发送数据
befinTransmission()开始传输
endTransmission()结束传输
主机向从机接收数据
requestFrom()请求从机发送数据
不过这里其实有个问题就是你发送数据的时候如果发的数据少于原来你规定的字节,那么剩余的空间会由0xFF填充!解释:因为从机没有数据发送了就会保持沉默,点平会拉高
解决方案:
1.使用固定长度的字节传送
2.在数据头部插入字段表示数据字段的长度
3.在数据中以特定字符表示传送结束
从机注册的事件
需要注册接收事件和发送事件
onReceive()接收事件
onRequest()发送事件
//主机向从机进行通信
#include <Arduino.h>
#include <Wire.h>
int num = 1;
int addr = 33; //从机地址
void setup()
{
Serial.begin(115200);
if(Wire.begin()) Serial.println("Wire begin success");
else Serial.println("Wire begin failed");
}
void loop()
{
char tmp[35];
itoa(num++,tmp,10);
Wire.beginTransmission(addr);
Wire.write(tmp);
int ret = Wire.endTransmission();
if(ret == 0)
{
Serial.println("send failed");
return;
}
delay(2000);
int len = Wire.requestFrom(addr, 35);//最多不超过35个字节
if(len > 0)
{
Serial.println("Receive success");
Serial.println(len);
Wire.readBytes(tmp, 35);
Serial.println(tmp);
for(int i = 0;i < 35;i++)
{
Serial.printf("%2X, ",tmp[i]);
if(i % 8 == 7) Serial.println();
}
Serial.println();
}
delay(2000);
}
I2C控制LCD1602
需要导入LiquidCrystal_I2C.h库
#include <Arduino.h>
#include <Wire.h>
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup()
{
lcd.init();
lcd.backlight();
lcd.print("Hello, World!");
}
void loop()
{}
本文来自博客园,作者:Alaso_shuang,转载请注明原文链接:https://www.cnblogs.com/Alaso687/p/19188011

浙公网安备 33010602011771号