Fireduino 开源创意平台 立即购买

拥有双核Cortex-M3处理器,集成高质量音频Codec和WiFi模组,拥有良好的IOT扩展性能,完美兼容Arduino IDE和Arduino标准接口,并支持FireBlock图形化编程软件,是一款首选的编程启蒙教学平台,更是一款开源的创意原型平台。

Wire

更新时间:2017-08-08 阅读:1499

Inter-Integrated Circuit

I2C是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。
SCL – 时钟线
SDA – 数据线
I2C总线是各种总线中使用信号线最少,并具有自动寻址、多主机时钟同步和仲裁等功能的总线。因此,使用I2C总线设计计算机系统十分方便灵活,体积也小,因而在各类实际应用中得到广泛应用。
I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。任何设备都可以作为主设备,也可以作为从设备,主要看发起传输的是哪一个设备。由于I2C有寻址、起始、应答、结束等等机制,所以很容易区分主从设备。

Fireduino Wire

Fireduino I2C / TWI 设备库允许Fireduino通过I2C 接口与外设备通信,Fireduino 有2个 I2C 接口,且 只支持Master 模式。

Fireduino Wire API

begin()

   说明
       对库进行初始化,加入I2C总线作为主机,通常只被调用一次。 
语法 Wire.begin()
参数 无
返回值 无

requestFrom(...)

   说明 
       向从机请求数据。这些字节可以通过以下两个函数进行检索available()和 read()  
语法 Wire.requestFrom(addr,number);
参数 address :7比特地址,向该地址发送请求 quantity:请求的字节个数
返回值 返回的字节个数

beginTransmission(address)

   说明 
       根据已给地址,开始向I2C的从机进行传输。随后,调用函数 write() 对传输的字节进行排列,调用函数 endTransmission() 进行传输 。
语法 Wire.beginTransmission(addr);
参数 address:传输指向的设备的7位比特地址
返回值 无

endTransmission()

   说明 
       停止对从机的传输,传输开始时调用 beginTransmission(),传输的字节由 write() 排列。 
函数 Wire.endTransmission()
参数 无
返回值 无

write()

   说明 
       由从机中写入数据,回应主机的请求,或排列将要从主机传输给从机的字节(在beginTransimission()和endTransmission()中调用)。 
语法 Wire.write(value) Wire.write(string) Wire.write(data,length)
参数 val: 以单个字节形式发送的值 str: 以一串字节的形式发送的字符串 data:以字节形式发送的数组 length:传输的字节数
返回值 byte:write()将返回写入的字节数,但是否读取这个返回值可判断是否写入buf

available()

   说明 
       返回可被调用的字节数 。调用函数 requestFrom()后,可在主机中调用此函数。
语法 Wire.available();
参数 无
返回值 可读取的字节数。

read()

   说明 
       读取一个由从机发送给主机的字节,在调用 requestFrom() 函数后。

   语法 
       Wire.read()

   参数 
       无

   返回值 
       返回下一个接收到的字节

Wire示例程序

#include <Wire.h>  //调用arduino自带的I2C库
 
#define Register_ID 0
#define Register_2D 0x2D
#define Register_X0 0x32
#define Register_X1 0x33
#define Register_Y0 0x34
#define Register_Y1 0x35
#define Register_Z0 0x36
#define Register_Z1 0x37
 
 
int ADXAddress = 0xA7>>1;  //转换为7位地址
int reading = 0;
int val = 0;
int X0,X1,X_out;
int Y0,Y1,Y_out;
int Z1,Z0,Z_out;
double Xg,Yg,Zg;
 
void setup()
{
  Serial.begin(9600);
  delay(100);
  Serial.println("setup");  
  Wire.begin();  //初始化I2C
  delay(100);
  Wire.beginTransmission(ADXAddress);
  Wire.write(Register_2D);
  Wire.write(8);
  Wire.endTransmission();
}
 
void loop()
{
  Wire.beginTransmission(ADXAddress);
  Wire.write(Register_X0);
  Wire.write(Register_X1);
  Wire.endTransmission();
  Wire.requestFrom(ADXAddress,2);
  if(Wire.available()<=2);
  {
    X0 = Wire.read();
    X1 = Wire.read();
    X1 = X1<<8;
    X_out = X0+X1;
  }
 
  Wire.beginTransmission(ADXAddress);
  Wire.write(Register_Y0);
  Wire.write(Register_Y1);
  Wire.endTransmission();
  Wire.requestFrom(ADXAddress,2);
  if(Wire.available()<=2);
  {
    Y0 = Wire.read();
    Y1 = Wire.read();
    Y1 = Y1<<8;
    Y_out = Y0+Y1;
  }
 
  Wire.beginTransmission(ADXAddress);
  Wire.write(Register_Z0);
  Wire.write(Register_Z1);
  Wire.endTransmission();
  Wire.requestFrom(ADXAddress,2);
  if(Wire.available()<=2);
  {
    Z0 = Wire.read();
    Z1 = Wire.read();
    Z1 = Z1<<8;
    Z_out = Z0+Z1;
  }
 
  Xg = X_out/256.00;//把输出结果转换为重力加速度g,精确到小数点后2位。
  Yg = Y_out/256.00;
  Zg = Z_out/256.00;
  Serial.println(Xg);
  Serial.println(Yg);
  Serial.println(Zg);
  Serial.println(X_out);
  Serial.println(Y_out);
  Serial.println(Z_out);
  delay(1000);  //延时1秒,刷新频率这里进行调整
 
}