目录

  • I2C库文件wire
    • begin
    • beginTransmission
    • write
    • endTransmission
    • requestFrom
    • 总结

As a reference the table below shows where TWI pins are located on various Arduino boards.

Board I2C / TWI pins
Uno, Ethernet A4 (SDA), A5 (SCL)
Mega2560 20 (SDA), 21 (SCL)
Leonardo 2 (SDA), 3 (SCL)
Due 20 (SDA), 21 (SCL), SDA1, SCL1

不论是 IIC/TWI, 或是 SPI, 以及硬串口、软串口甚至 Serial.print 都是要靠中断来帮忙处理, 如果你把中断禁止了, 那 这些都无法动作了 !

I2C库文件wire

背景
使用 Arduino 例程的时候发现,官方的描述不太详细,走了些弯路。特此,写篇文章记录下。

Arduino 的 I2C 相关函数
Arduino 的封装库真的是非非常的棒,I2C 就只有 10 个 API 函数。I2C 所用的库,称为:Wire Library。详细的描述可以看这个官方地址:

https://www.arduino.cc/en/Reference/Wire

下面我会介绍部分的 API 函数。

begin

begin 函数用于初始化 Wrie Library 并以 Master 或 Slave 的身份加入 I2C 总线上。begin 函数没有返回值。调用 begin 函数有两种形式:

begin():无输入参数,表示以 Master 形式加入总线。
begin( address ):有输入参数,表示以从机形式加入总线,设备地址为address(7-bit)

beginTransmission

beginTransmission 函数用于启动一次 Master write to Slave 操作。值得注意的是这个函数的调用并不会产生 Start 信号 和发送 Slave Address,仅是实现通知 Arduino后面要启动 Master write to Slave 操作。

beginTransmission 函数调用后,(再调用 write 函数进行数据写入), 最后再调用 endTransmission 函数方能产生 Start 信号 和发送 Slave Address 及通讯时序。
beginTransmission 函数调用形式:

beginTransmission(address)
1

write

write 函数用于向 Slave 写入数据。共有 3 种调用形式:

write(value) :写入单字节
write(string) :写入字符串
write(data, length) :写入 length 个字节

endTransmission

endTransmission 函数用于结束一次 Master write to Slave 操作。前面在介绍 beginTransmission 的时候也介绍过了,如果不在后面使用 endTransmission 函数, 总线上不会产生 Master write to Slave 的时序。

endTransmission 函数的调用十分有意思。endTransmission 函数可输入参数。

endTransmission(0):当输入参数为 0 时,将在通讯结束后,不产生 STOP 信号。
endTransmission(!0):当输入参数为 !0 时,在通讯结束后,生成 STOP 信号。(释放总线)
endTransmission():当无输入参数时,在通讯结束后,产生 STOP 信号。(释放总线)
因为我设计的产品程序是使用 DUMMY WRITE 时序,就是这个不产生 STOP 信号卡了我半天的时间(这是我要写本文的原因……)。而官方中,并没有详细介绍这个输入参数…

同时,endTransmission 函数时具有返回值的:

0:success
1:data too long to fit in transmit buffer
2:received NACK on transmit of address
3:received NACK on transmit of data
4:other error
有个地方需要注意的:当通讯过程中,出现异常后,异常后的 write 操作将被终止,直接结束通讯,具体的是否出现异常,只需要看 endTransmission 的返回值即可。

requestFrom

requestFrom 函数用于实现 Master Read From Slave 操作。调用形式有 2 种:

requestFrom(address, quantity):从 address 设备读取 quantity 个字节,结束后,产生 STOP 信号
requestFrom(address, quantity, stop) :从 address 设备读取 quantity 个字节,结束后,依据 stop 的值确定是否产生 STOP 信号。
stop = 0:不产生 STOP 信号
stop != 0:产生 STOP 信号
requestFrom 函数具有返回值(表示从 address 设备读取到的字节数)。

available
available 函数用于统计 Master Read From Slave 操作后, read 缓存区剩余的字节数。每当缓存区的数据被读走 1 个字节,available 函数的返回值减一。通常 available 函数会搭配着 read 函数使用。

read
read 函数用于在 Master Read From Slave 操作后,读取缓存区的数据。

例程
下面的例程,是我提供给客户的案例程序。程序上传至了 GitHub:
https://github.com/TFmini/TFmini-I2C-MasterExample_Arduino

通讯时序如下图所示:


节选代码段:

#include <Wire.h> // I2C head filevoid setup() {// put your setup code here, to run once:Serial.begin(115200);// Initiate the Wire library and join the I2C bus as a master or Slave.Wire.begin(); Serial.print("Ready to Read TFmini\r\n");delay(10);
}void loop() {// put your main code here, to run repeatedly:byte i = 0;byte rx_Num = 0;  // the bytes of received by I2Cbyte rx_buf[7] = {0}; // received buffer by I2CWire.beginTransmission(7); // Begin a transmission to the I2C Slave device with the given address.Wire.write(1); // Reg's Address_HWire.write(2); // Reg's Address_LWire.write(7); // Data LengthWire.endTransmission(0);  // Send a START Sign// Wire.requestFrom(AA,BB);receive the data form slave.// AA: Slave Address ; BB: Data Bytes rx_Num = Wire.requestFrom(0x07, 7); // Wire.available: Retuens the number of bytes available for retrieval with read().while( Wire.available()){rx_buf[i] = Wire.read(); // received one bytei++;}}

总结

作者:Cherry0_0Wu
来源:CSDN
原文:https://blog.csdn.net/XiuHua_Wu/article/details/82691173
版权声明:本文为博主原创文章,转载请附上博文链接!

【arduino库文件】-wire.h相关推荐

  1. Arduino 库文件解读

    当 打开:项目------>加载库------>库管理,所下载的库文件在哪里存方的呢? 如下图,在我的文档里------>Arduino------> libraries里面的 ...

  2. Arduino库文件导入卸载常见问题及解决

    本文针对以下问题: 需要导入自建库,不知道入口: 需要修改或者删除自建库,发现怎么操作都没用的: 想要修改官方库,或者将修改后的官方库覆盖无效的: 目录 导入库相关 卸载库相关 由于Arduino的版 ...

  3. 深入了解arduino舵机控制库文件Servo.h

    舵机是我们在控制领域高频率使用的器件,尤其对于arduino玩家不可或缺.简单的使用方法我们在前面的博文中都已经做过介绍. 常规使用 一般控制 一般步骤为包涵一个servo.h的头文件,然后绑定端口, ...

  4. C语言库文件ctype.h中重要的库函数

    C Primer Plus第七章分支跳转章节中,提到了ctype.h头文件中的一些用于判断字符类型的库函数接口. isalnum() 字母数字 isalpha() 字母 isblank() 标准的空白 ...

  5. C/C++ 数学库文件 (math.h)

    目录 1.三角函数 Trigonometric functions 1.1. cos() 函数 1.2 sin() 正弦函数 1.3. tan() 正切函数 1.4. acos() 反余弦函数 1.5 ...

  6. mind+自定义arduino库,实现简易RFID智能家居系统

    文章目录 前言(完整用户库下载链接在文章末尾) 一.用户库文件结构 二.配置config.json文件 三.编写main.ts文件 四.编辑资源文件夹 _images _locales _menus ...

  7. 制作Arduino库——摩斯码

    制作Arduino库--摩斯码 前沿 1.文件结构 2.主文件代码 3.自定义Arduino库 3.1.编写.h头文件 3.2.编写.cpp源文件 3.3.编写keywords.txt文件 4.使自定 ...

  8. arduino的servo函数_如何使用Arduino舵机库servo.h – 八色木

    文章目录 [隐藏] 我们都知道Arduino控制板支持PWM的引脚有限,但如果在Arduino上需要控制超出PWM引脚数量的舵机怎么办呢?答案是使用servo.h库文件,它是Arduino控制舵机的标 ...

  9. STM32F103构建固件库模板(PS固件库文件树介绍)

    参考:STM32F103ZE新建固件库模板 作者:追兮兮 发布时间:2020-10-14 10:31:45 网址:https://blog.csdn.net/weixin_44234294/artic ...

最新文章

  1. PhotoShop算法原理解析系列 - 像素化---》碎片。
  2. MySQL介绍与语言结构
  3. G7创始人翟学魂:货运物流正在被IoT重构,卡车流量也能反映GDP走向 | MEET2021...
  4. ESP32 OTA 接口简略说明
  5. poj 2513 Colored Sticks( 字典树哈希+ 欧拉回路 + 并查集)
  6. Reporting Service 在文本框中换行的问题
  7. java随机姓名_Java生成随机姓名、性别和年龄的实现示例
  8. Java对象模型-oop和klass
  9. 目标检测之Faster-RCNN的pytorch代码详解(模型准备篇)
  10. 主干开发前要知道的,4错误认识+3优势
  11. 完成端口与高性能服务器程序开发
  12. spring boot websocket 客户端_Spring Boot 开发集成 WebSocket,实现私有即时通信系统
  13. 三维点云学习(5)5-实现Deeplearning-PointNet-2-classfication
  14. stl之bit_vector原理及应用
  15. 的有效 海思编码_【最佳案例展示】2020年CUVA“超高清视频创新产品与解决方案”全球首款8K@120解码芯片海思Hi3796CV300...
  16. text无法使用空格 unity_简单的介绍几种在unity中对数据的存储和读档的方法!
  17. 对话行癫:CTO 最重要的是判断未来!| 人物志
  18. 博士员工离职率21.8%,任正非反思:华为这么大,英雄为何无用武之地?
  19. redis击穿,穿透,雪崩以及解决方案
  20. 【Linux】WSL

热门文章

  1. CSS中margin不会撑开盒子
  2. 变压器组别---jinn 整理
  3. Java处理手机号中间4位替换成*
  4. 微信小程序:图书馆助手||笔记
  5. 英特尔阿里腾讯布局,医学影像AI合适能够商用
  6. git在clone时需要输入密码Enter passphrase for key 导致spring cloud config 配置中心无法拉取配置文件的解决方法
  7. 五星好评!Infortrend统一存储获得权威杂志大力推荐
  8. 手机可编辑c语言的文档,C语言课件(手机阅读版).pdf
  9. Mac:PC安装Mavericks经验小结
  10. .Net C# 使用 IKVM 调用 Java 代码