首页 > 其他分享 >【esp32 项目】使用I2C

【esp32 项目】使用I2C

时间:2024-06-11 10:57:05浏览次数:13  
标签:begin Wire 项目 esp32 address Serial I2C 设备

原理图:

图 I2C接口的RTC芯片

图 单片机I2C部分引脚图

 

软件

启动I2C

启动Wire库并作为主机或者从机加入总线,这个函数调用一次即可,参数为7位从机地址,不带参数就以主机的形式加入总线。

Wire.begin();
Wire.begin(address);

主设备从从设备请求字节

由主设备向从设备请求字节,之后用available()和read()函数读取字节,第三个参数位为stop,在请求后会发送停止消息,释放I2C总线,否则总线就不会被释放。

Wire.requestFrom(address, quantity);
Wire.requestFrom(address, quantity, stop);

给指定地址的从设备传输数据

指定地址的从设备传输数据,之后调用write()函数排队传输字节,要通过endTransmission()结束传输。

Wire.beginTransmission(address)

endTransmission()有以下几个返回结果:

  • 0:成功

  • 1:数据太长,无法放入发送缓冲区

  • 2:在发送地址时收到 NACK

  • 3:在发送数据时收到 NACK

  • 4:其他错误

写数据

向从设备写入数据,在调用 beginTransmission() endTransmission() 之间。

Wire.write(value)
Wire.write(string)
Wire.write(data, length)

举个例子

#include <Wire.h>
byte val = 0;

void setup()
{
  Wire.begin(); // join i2c bus
}

void loop()
{
  Wire.beginTransmission(44); // transmit to device #44 (0x2c)
                 // device address is specified in datasheet
  Wire.write(val);       // sends value byte  
  Wire.endTransmission();    // stop transmitting

  val++;        // increment value
  if(val == 64)      // if reached 64th position (max)
  {
    val = 0;    // start over from lowest value
  }
  delay(500);
}

读数据

调用requestFrom()后从从设备读取数据。

Wire.read()

举个例子

#include <Wire.h>

void setup(){
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output
}

void loop(){
  Wire.requestFrom(2, 6);    // request 6 bytes from slave device #2

  while(Wire.available())    // slave may send less than requested
  {    
      char c = Wire.read();    // receive a byte as character
      Serial.print(c);         // print the character
  }

  delay(500);
}

还有其它一些函数,例如修改时钟频率等等,大家用到的时候自行了解一下。

完整程序

这里我们用一个例子来演示一下,I2C启动之后,我们开始扫描总线上存在的设备,并通过串口打印结果出来,我在I2C下面接了一个OLED的设备。

#include "Wire.h"

void setup()
{
  Serial.begin(115200); 
  Serial.println();
  Serial.println("Scanning for I2C Devices ...");
  Serial.print("\r\n");
    
    int I2CDevices = 0;  
    byte address;

  Wire.begin();  
  for (address = 1; address < 127; address++)
  {
    Wire.beginTransmission(address);    
        if (Wire.endTransmission() == 0) //发送成功
    {
      Serial.print("Found I2C Device: ");
      Serial.print(" (0x");      
            
            if (address < 16)
      {
        Serial.print("0");
      }
      Serial.print(address, HEX);
      Serial.println(")");
      I2CDevices++;
    }
  }  
    
    if (I2CDevices == 0)
  {
    Serial.println("没有发现I2C设备!\n");
  }  
    else
  {   
    Serial.print("发现了");
    Serial.print(I2CDevices);
    Serial.println("个I2C设备!\n");  
  }  
}

void loop()
{
}

Wire.endTransmission()返回0,代表这个地址通信成功,我们就认为总线上存在这个地址的设备。

 

标签:begin,Wire,项目,esp32,address,Serial,I2C,设备
From: https://www.cnblogs.com/FBsharl/p/18241678

相关文章

  • 手机上玩 PC 游戏的开源项目「GitHub 热点速览」
    上周国产3A大作《黑神话:悟空》开启预售,同时公布游戏将于北京时间2024.8.20正式上线。这是一款由「游戏科学」开发的西游题材单机·动作·角色扮演游戏,它采用「虚幻引擎5」制作。该引擎并不是完全开源的,但它提供了部分源代码的访问权限。具体来说,就是GitHub账号必须先关联E......
  • 银行数据迁移项目,init(初始化)脚本怎么开发(实战)
    银行数据迁移项目,比起一般遇到的项目,其实难度还是挺大的。从0到1的项目好做,普通迭代开发的也不难,但是,对于(系统升级)数据迁移的项目,有点要老命。0,数迁项目背景一般由于业务部门新的业务需求的增加或者合并,为满足新需求,将某个系统(比如说最常见的信用卡系统)进行改造升级,其数据要......
  • 分享几个嵌入式相关的高星开源项目
    目录1前言2开源嵌入式项目举例2.1Avem2.2Awesome-Embedded2.3soft-and-hard《软硬结合——从零打造物联网》2.4机械臂2.5焊台2.6智能锁2.7智能电表2.8智能家居3嵌入式相关学习交流网站1前言(1)快速提高嵌入式技术的方法就是完成实际项目中一个或几个......
  • 解决Vue项目Network: unavailable的问题
        在vscode使用npmrunserve运行Vue项目时发现一个问题,项目只能通过Local访问而不能通过Network访问,终端显示如下:    碰到这种情况的解决方法:在环境变量的path中添加“C:\Windows\System32\Wbem”1.找到“环境变量”:设置-->系统-->高级系统设置-->环......
  • 青藏铁路腾讯入围项目总流程
    第一阶段开发在4.19日时,我们开始了十天冲刺,第一天我们主要时讨论:1、产品的运行以及功能​具体要做的可以让玩家体验一些事情或讲述一些事情,然后从他所做或者所选答案方向来评判这个人的得分,直接答题效果不太好。基本完成网络安全测评以及人文科技体验,有时间尽量完成一下心理健康......
  • 【esp32 项目】使用I2C第一篇——I2C的科普
    https://www.eepw.com.cn/zhuanlan/315431.html 天我们来玩儿I2C。I2C概述I2C全称是Inter-IntegratedCircuit,是飞利浦半导体公司(06年迁移到NXP了)在1982年发明的,是使用非常广泛的一种通信协议,很多传感器、存储芯片、OLED等,都是在使用I2C。标准输出模式下能达到100kbps的传输......
  • 【esp32 项目】使用esp32的wifi
    原文:《老宇哥带你玩转ESP32:13终于到WiFi功能的使用了》链接:https://www.eepw.com.cn/zhuanlan/315164.html 今天我们来说说ESP32的WiFi。ESP32的WiFi我们之所以使用ESP32做一些小项目,最重要的就是看中了ESP32的WiFi功能,ESP32相当于一个强大的单片机+无线WiFi+蓝牙多合一......
  • 腾讯公益项目开发(个人总结)
    胡翔工作:在第一阶段冲刺,我主要负责儿童心理健康的游戏开发,因为之前的想法,想要予以实现,所以我从零开始学Unity3D,起步晚但是步伐一点不慢,在第一阶段我花了大量时间网上翻看视频,学习了大量开发过程和Unity3D界面的工具和功能。完成了基本场景搭建,角色移动,灯光设计,迷雾设计,并设计好了......
  • 微信小程序毕业设计-公交信息在线查询系统项目开发实战(附源码+演示视频+LW)
    大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • springboot+vue前后端分离项目-vue项目搭建
    1.vue.js官网学习vue的语法等知识,有html、css、JavaScript基础。vue官网:https://cn.vuejs.org2.下载node.js,使用其中的npm包管理工具构建vue项目,npm管理依赖,类似maven,node-v查看版本,建议14以上nodejs官网:https://nodejs.org/zh-cn/3.cmd到项目路径下,npm-v检查npm版本,npmins......