【史上最全面arduino esp32教程】I2C的使用

举报
人才程序员 发表于 2024/03/31 16:47:16 2024/03/31
【摘要】 @TOC 前言在本篇文章中,我们将带您了解如何使用I2C(Inter-Integrated Circuit)通信协议在Arduino ESP32上进行数据交换。I2C是一种常见的串行通信协议,适用于连接多个设备并在它们之间传输数据。我们将介绍I2C通信的基本原理和Arduino ESP32上的I2C库函数使用方法,帮助您快速上手并开始使用I2C进行数据通信。 一、I2C的使用 1.1 I2C...

@TOC


前言

在本篇文章中,我们将带您了解如何使用I2C(Inter-Integrated Circuit)通信协议在Arduino ESP32上进行数据交换。I2C是一种常见的串行通信协议,适用于连接多个设备并在它们之间传输数据。我们将介绍I2C通信的基本原理和Arduino ESP32上的I2C库函数使用方法,帮助您快速上手并开始使用I2C进行数据通信。


一、I2C的使用

1.1 I2C对象

在arduino中,i2c的对象为TwoWire,他继承于Stream,他的定义如下:

class TwoWire: public Stream
{
//。。。。
};

在arduino中,他给我们先定义好了两个i2c对象:

extern TwoWire Wire;
extern TwoWire Wire1;

我们可以直接去使用这两个已经定义好的对象

1.2 I2C开始函数

首先如果你想要使用I2C,你需要先开始I2C通信,他有下面这两个函数:

bool begin(int sda, int scl, uint32_t frequency=0); // returns true, if successful init of i2c bus
bool begin(uint8_t slaveAddr, int sda, int scl, uint32_t frequency);

他们共同的参数:sda数据线,scl时钟线,frequency为I2C的频率
函数2重载独有参数:slaveAddr为从设备地址

1.3 读取一字节数据

他的流程图如下:
在这里插入图片描述

  1. 开始发送数据并指定I2C地址:
    我们可以使用下面这个函数指定I2C地址:
void beginTransmission(uint16_t address);

参数为I2C设备的地址

  1. 发送要读取的地址
    我们可以使用下面这个函数进行发送要读取的地址:
size_t write(uint8_t);
size_t write(const uint8_t *, size_t);

他可以发送一字节的数据,也可以发送n个字节

  1. 结束发送
    我们可以使用下面这个函数结束发送
uint8_t endTransmission(bool sendStop);

sendStop:一个布尔值参数,指示是否发送停止位。当sendStop为true时,表示在传输结束后发送停止位;当sendStop为false时,表示在传输结束后不发送停止位。
如果为false,则保持I2C总线有效连接

  1. 请求一字节数据
    我们可以使用下面这个函数来请求n个字节的数据:
uint8_t requestFrom(int address, int size);

参数1为从设备地址,参数2为请求字节大小,我们可以改变他来改变请求字节的多少

  1. 查看是否有数据可以读取
    我们可以使用下面这个函数来查看是否有数据到来:
int available(void);

如果参数不为0则有数据

  1. 读取数据
    我们可以使用下面这个函数来读取一字节数据:
int read(void);

1.4 发送一字节的数据

他的流程图如下:
在这里插入图片描述
我们只需要使用上面这些函数去开始写入即可

1.5 其他函数

获取和设置I2C总线频率

我们可以使用下面这两个函数来设置和获取I2C总线的频率:

bool setClock(uint32_t);
uint32_t getClock();

设置数据线和时钟线

我们可以使用下面这个函数设置数据线和时钟线:

bool setPins(int sda, int scl);

二、什么时候该使用停止位,什么时候不用?

一般情况下,我们会在最后一次传输数据后发送停止位,以示传输的结束。因此,在大多数情况下,我们会将sendStop参数设为true,以确保在传输结束时发送停止位。
但是,也有一些特殊的情况,可能需要手动控制发送停止位的时机。例如,在多个连续的I2C传输中,我们可能需要发送多次数据,但只在最后一次传输结束时发送停止位。这时,我们可以在最后一次传输前将sendStop参数设为false,然后在最后一次传输后再调用Wire.endTransmission(true)发送停止位。


总结

通过本教程,我们详细了解了Arduino ESP32上的I2C通信。我们了解了I2C的基本原理和层次结构,以及它在连接多个设备时的优势。通过使用Wire库,我们学习了如何在Arduino ESP32上初始化I2C总线并与其他设备进行通信。我们了解了I2C通信的时序和数据传输方式,并演示了如何发送和接收数据。

通过掌握Arduino ESP32上的I2C通信,您可以轻松地与各种I2C设备进行数据交换,如传感器、显示器和存储器等。这为您的项目提供了更多的选择和扩展性。祝贺您完成了本教程!现在,您可以开始利用所学的知识,开发自己的I2C通信应用了。祝您好运!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。