查看: 2359|回复: 1

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

[复制链接]
  • TA的每日心情

    2023-7-25 22:49
  • 签到天数: 385 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2017-1-10 23:16:56 | 显示全部楼层 |阅读模式
    分享到:
    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. }
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-26 11:02
  • 签到天数: 791 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2017-1-11 14:23:55 | 显示全部楼层
    谢谢分享   
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-23 13:22 , Processed in 0.127586 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.