YFROBOT创客社区

标题: Arduino - 官方IIC/I2C/TWI总线库(Wire)的使用 [打印本页]

作者: AllBlue    时间: 2014-11-27 10:21
标题: Arduino - 官方IIC/I2C/TWI总线库(Wire)的使用
本帖最后由 AllBlue 于 2014-11-27 10:21 编辑

Arduino - 官方IIC/I2C/TWI总线库(Wire)的使用
      IIC即Inter-Integrated Circuit(集成电路总线),是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。
      I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既可以是主控器(或被控器),又可以是发送器(或接收器),这取决于它所要完成的功能。
更多介绍:[attach]911[/attach]
下面我们看下arduino Wire库的使用:
arduino 官方wire库介绍地址:http://www.arduino.cc/en/Reference/Wire

官方网址中我们要注意一句话:As of Arduino 1.0, the library inherits from the Stream functions, making it consistent with other read/write libraries. Because of this, send() and receive() have been replaced with read() and write().
自1.0版本起,wire库做继承了Stream,所以,将send()和receive()替换成read()和write();用户根据版本使用相应函数。

arduino板的SDA、SCL接口:
BoardI2C / 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

1.begin():库文件初始化,设置作为主机或从机加入IIC总线
语法         wire.begin();         wire.begin(address);
参数
         无参数设置,表示作为主机加入总线
         address:作为从机加入总线,并设置从机地址为address(7bit地址)

2.requestFrom():主机使用,向从机请求数据
语法
      wire.requestFrom(address,quantity);
      wire.requestFrom(address,quantity,stop);
参数
      address:从机地址,向这个地址发送请求
      quantity:请求数据大小(字节数)
      stop:boolean(布尔型),为真(true)时将在请求后发送停止指令并释放总线。 为假(false)时将在请求后发送重新启动的指令,保持连接状态。

3.beginTransmission():根据地址,开始向I2C的从机进行传输。
语法
      wire.beginTransmission(address);
参数
      address:从机地址(7bit)

4.endTransmission():停止向从机传输
语法
      wire.endTransmission();
      wire.endTransmission(stop);
参数
      stop:boolean(布尔型),为真(true)时将在请求后发送停止指令并释放总线。 为假(false)时将在请求后发送重新启动的指令,保持连接状态。(默认值为true
返回值
      byte,表示传输状态:
         0:成功
         1:数据太长
         2:传送地址时接收到NACK(非应答信号)
         3:传送数据时接收到NACK(非应答信号)
         4:其他错误

5.write():写数据(在beginTransimission()和endTransmission()中调用)
语法
      wire.write(value)
      wire.write(string)
      wire.write(data,length)

参数
      value:以单个字节形式发送的值
      string:以一串字节的形式发送的字符串
      data:以字节形式发送的数组
      length:传输的字节数
返回值
      byte:write()将返回写入的字节数,但是否读取这个返回值是可选的

6.available():当和函数receive()一起使用时,返回可被调用的字节数 。调用函数 requestFrom()后,可在主机中调用此函数。或者在 onReceive()函数内部的从机中调用。
语法
      wire.available();
参数
      无
返回值
      可读的字节数

7.read():读数据
语法
      wire.read();
参数
      无
返回值
      接收到的数据

8.onReceive():注册一个函数,当接收到主机的数据时调用此函数
语法
      wire.onReceive(handler);
参数
      handler:当从机接收到数据时被调用的函数。应该采取单精度整数型参数(主机读取的字节数),并无任何返回值,如: void MyHandler(int numBytes)

9.onRequest():注册一个函数,当主机向从机请求数据时调用此函数

语法
      wire.onRequest(handler);
参数
      handler:要调用的函数,不带任何参数,并且没有任何返回值,例如: void MyHandler()

wire库函数就是以上几个,这个给大家一个网址,这个例子很好的介绍了库的使用:Arduino主从机之间的I2C通讯实验



作者: yautou    时间: 2016-9-10 18:50
感谢分享
作者: ziwei590    时间: 2018-6-1 10:31
谢谢楼主的精彩文章
作者: 2806880    时间: 2020-2-9 21:28
感谢楼主辛苦了




欢迎光临 YFROBOT创客社区 (http://yfrobot.com.cn/) Powered by Discuz! X3.1