4.10 Arduino I2C

I2C是Inter-Integrated Circuit的缩写,是一种两线接口。I2C只是用两条双向的线,一条Serial Data Line(SDA),另一条Serial Clock(SCL)。

SCL:上升沿将数据输入到每个EEPROM器件中;下降沿驱动EEPROM器件输出数据(边沿触发)。

SDA:双向数据线,为OD门,与其他任意数量的OD与OC门成“线与”关系。

I2C的一个总线上可以挂多个设备(传感器),设备之间直接通过ID进行区分,同一个总线上只能有一个主设备,可以有多个从设备,通信只能从主设备发起,不能从从设备发起。速率方面常用的有9.6Kbps、1.92Kbps、1.152Kbps。

在某些情况下,设置两个(或更多)Arduino板彼此分享信息是有帮助的。在下面的例子中,两板程序通过I2C同步串行协议和对方通信,作为一个主读/从发配置。

I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在两个设备之间可以进行双向传送。各种被控制设备均并联在这条总线上,总线上的每个设备模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既可以是主设备又可以是从设备,这取决于它所要完成的功能。本例的接线如图4-9所示。

图4-9 Arduino开发板I2C通信接线

主控板的代码如下:

从控板的代码如下。

Arduino中的Wire库主要函数说明如下:

(1)Wire.begin()和Wire.begin(address):初始化Wire库,并且加入到I2C网络,前者作为Master,后者作为Slaver,其中参数address为7位的器件地址(可选),如果没有输入,则以Master的形式加入到I2C网络。

(2)Wire.requestFrom():主设备请求从设备一个字节,这个字节可以被主设备用read()或available()接受,有两种形式:Wire.requrstFrom(addtess,quantity)和Wire.requrstFrom(addtess,quantity,stop)。

参数:addtess表示7位的器件地址;quantity表示请求得到的数量。

(3)Wire.beginTransmission(address):开始一次数据传输,发送一个I2C开始字符,参数address表示器件的7位地址。

(4)Wire.endTransmission()和Wire.endTransmission(stop):结束一个由beginTransmission()开始的并且由write()排列的从机的传输。在Arduino中,endTransmission()接受一个布尔型变量,如果为1,则endTransmission()发送一个停止信息;如果为0,则发送开始信息。

(5)Wire.write():向从机发送数据,有3种形式。

Wire.write(value):value为要发送的数值。

Wire.write(string):string为字符组的指针。

Wire.write(data,length):data为一个字节数组,length为传输的数量。

(6)Wire.send():发送数据。

(7)Wire.receive():接收数据。

(8)Wire.onReceive():从机接收主机发来的数据。

(9)Wire.onRequest():从机请求主机发送数据。

要打开Arduino IDE自带的I2C的例程,在Arduino IDE的菜单栏中选择“文件”>“示例”>“Wire”命令,如图4-10所示。

图4-10 Arduino IDE自带的I2C例程