1回答

1收藏

【赚周年币】技术帖——Fireduino学习5、Wire

#线上活动 #线上活动 2858 人阅读 | 1 人回复 | 2017-01-10

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 APIbegin()
   说明       对库进行初始化,加入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示例程序
  1. #include <Wire.h>  //调用arduino自带的I2C库

  2. #define Register_ID 0
  3. #define Register_2D 0x2D
  4. #define Register_X0 0x32
  5. #define Register_X1 0x33
  6. #define Register_Y0 0x34
  7. #define Register_Y1 0x35
  8. #define Register_Z0 0x36
  9. #define Register_Z1 0x37


  10. int ADXAddress = 0xA7>>1;  //转换为7位地址
  11. int reading = 0;
  12. int val = 0;
  13. int X0,X1,X_out;
  14. int Y0,Y1,Y_out;
  15. int Z1,Z0,Z_out;
  16. double Xg,Yg,Zg;

  17. void setup()
  18. {
  19.   Serial.begin(9600);
  20.   delay(100);
  21.   Serial.println("setup");  
  22.   Wire.begin();  //初始化I2C
  23.   delay(100);
  24.   Wire.beginTransmission(ADXAddress);
  25.   Wire.write(Register_2D);
  26.   Wire.write(8);
  27.   Wire.endTransmission();
  28. }

  29. void loop()
  30. {
  31.   Wire.beginTransmission(ADXAddress);
  32.   Wire.write(Register_X0);
  33.   Wire.write(Register_X1);
  34.   Wire.endTransmission();
  35.   Wire.requestFrom(ADXAddress,2);
  36.   if(Wire.available()<=2);
  37.   {
  38.     X0 = Wire.read();
  39.     X1 = Wire.read();
  40.     X1 = X1<<8;
  41.     X_out = X0+X1;
  42.   }

  43.   Wire.beginTransmission(ADXAddress);
  44.   Wire.write(Register_Y0);
  45.   Wire.write(Register_Y1);
  46.   Wire.endTransmission();
  47.   Wire.requestFrom(ADXAddress,2);
  48.   if(Wire.available()<=2);
  49.   {
  50.     Y0 = Wire.read();
  51.     Y1 = Wire.read();
  52.     Y1 = Y1<<8;
  53.     Y_out = Y0+Y1;
  54.   }

  55.   Wire.beginTransmission(ADXAddress);
  56.   Wire.write(Register_Z0);
  57.   Wire.write(Register_Z1);
  58.   Wire.endTransmission();
  59.   Wire.requestFrom(ADXAddress,2);
  60.   if(Wire.available()<=2);
  61.   {
  62.     Z0 = Wire.read();
  63.     Z1 = Wire.read();
  64.     Z1 = Z1<<8;
  65.     Z_out = Z0+Z1;
  66.   }

  67.   Xg = X_out/256.00;//把输出结果转换为重力加速度g,精确到小数点后2位。
  68.   Yg = Y_out/256.00;
  69.   Zg = Z_out/256.00;
  70.   Serial.println(Xg);
  71.   Serial.println(Yg);
  72.   Serial.println(Zg);
  73.   Serial.println(X_out);
  74.   Serial.println(Y_out);
  75.   Serial.println(Z_out);
  76.   delay(1000);  //延时1秒,刷新频率这里进行调整

  77. }
复制代码
喜欢在构思妙想,电子产品DIY是工作,也是一种爱好。
分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

leo121_3006061

发表于 2017-1-11 14:23:55 | 只看该作者

谢谢分享   
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条