加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[转载]Arduino Wire库的使用

(2016-07-28 23:14:31)
标签:

转载

分类: Arduino
很详细的Wire库说明
原文地址:Arduino Wire库的使用作者:秋雨_EEE

I2C总线也是主从方式通讯,I2C总线允许连接多个微控制器,显然不能同时存在两个主器件,先控制总线的器件成为主器件,这就是总线竞争。在竞争过程中数据不会被破坏、丢失。数据只能在主、从器件中传送,结束后,主、从器件将释放总线,退出主、从器件角色。 

首先,arduino中的Wire库主要包含以下函数:

 Wire.begin()

 Wire.requestFrom()

 Wire.beginTransmission()

 Wire.endTransmission()

 Wire.write()

 Wire.available()

 Wire.read()

 Wire.onReceive()

 Wire.onRequest()


1、Wire.begin() 和 Wire.begin(address)

描述 

初始化wire库 ,并且加入到I2C网络,作为主机 或 从机,并且只能调用一次。

参数

address :7位的器件地址(可选),有地址则为从机地址,没有地址,则为主机


2、Wire.requestFrom()

描述

主设备 请求 从设备 的一个字节,这个字节可以被主设备用 read()或available()接收。

Wire.requrstFrom(addtess,quantity)

Wire.requrstFrom(addtess,quantity,stop)

参数

addtess : 7位的器件地址

quantity : 请求得到的数量

stop :布尔形,‘1’ 则在请求结束后发送一个停止命令,并释放总线。‘0’则继续发送请求保持连接。

返回

字节形 ,即 主设备 从 从设备 上接收到的字节数目


 Wire.beginTransmission(address)

描述 

开始一次传输数据,开始给从机发送一个地址

参数 

address : 器件的7位地址

返回值 无


4、 Wire.endTransmission()和Wire.endTransmission(stop)

描述

结束一个由beginTransmission()开始的并且由write()排列的从机的传输。在Arduino中 endTransmission()接受到

一个布尔形变量,如果为1 则endTransmission()发送一个停止信息;如果为0 则发送开始信息

返回值

0 成功 

1 数据溢出

2 发送addtess时 从机 接收到NACK 

3 发送数据时接受到 NACK 

4 其他错误

 


5、Wire.write()

描述

向从机发送数据

形式

Wire.write(value) 

Wire.write(string)  

Wire.write(data, length) 

参数

value :要发送的数值

string :字符组的指针

data :一个字节数组

 

length :传输的数量



6、 Wire.send()//发送数据

7、Wire.receive()//接收数据

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

9、  Wire.onRequest() //从机 请求 主机 发送数据

e.g

主机代码:(从编译器串口监视器发送数字从编译器串口监视器发送数字1,2,3,4来控制从机的LED亮与灭亮与灭)) 

#include

 void setup()

 

  Wire.begin();            //启动I2C总线,地址缺省表示为主机   

  Serial.begin(9600);      //启动串口,设置波特率为9600

  Serial.println("Ready"); //发送字符

 

void loop() 

  int val; 

  if(Serial.available() > 0)  //判断串口缓冲器是否有数据装入  

  

      val=Serial.read();      //读串口     

     if(val==49)   //1      

     

          Wire.beginTransmission(4);  // 与地址4的从机连接通讯  

         Wire.send(1);               // 发送数字  1 开LED  

          Wire.endTransmission();     // 停止发送 

          Serial.println("49 OK");    // 串口上显示 49 OK 表示完成,49表示为数字 1的ASCII码          

         delay(10);                  //         

       

      else if(val==50)     //2        

       

          Wire.beginTransmission(4);  // 与地址4的从机连接通讯           

          Wire.send(0);               // 发送数字  0 关LED          

          Wire.endTransmission();     // 停止发送 

          Serial.println("50 OK");    // 串口上显示 50 OK 表示完成          

          delay(10);          

        }    

      else if(val==51)       //3        

       

          Wire.beginTransmission(5);  // 与地址5的从机连接通讯           

          Wire.send(1);               // 发送数字  1 开LED           

          Wire.endTransmission();     // 停止发送 

          Serial.println("51 OK");    // 串口上显示 51 OK 表示完成           

           delay(10);           

         

      else if(val==52)//4        

       

          Wire.beginTransmission(5);  // 与地址5的从机连接通讯           

          Wire.send(0);               // 发送数字  0 关LED           

          Wire.endTransmission();     // 停止发送 

          Serial.println("52 OK");    // 串口上显示 52 OK 表示完成          

          delay(10);           

         }      

       else Serial.println(val);      

     }  

 


从机A代码代码:(接收到主机发送的接收到主机发送的1点亮LEDLED,,接收到0关掉LEDLED))

 #include  

  int LED = 2; 

  void setup() 

 

 

      Wire.begin(4);                    // 设置从机地址为 4   

      Wire.onReceive(receiveEvent);     //从机接收主机发来的数据   

      pinMode(LED,OUTPUT);              // 设置IO口为输出模式 

   

    void loop()

 

  delay(100);

   

void receiveEvent(int howMany)   // 接收从主机发过来的数据

 

    int c = Wire.receive();      // 接收单个字节    

    if(c==1)      

      {  

         digitalWrite(LED,HIGH); // 如果为 1 开LED      

     

    else if(c==0)      

     

 

         digitalWrite(LED,LOW);  // 如果为 0 关LED      

       

 }

0

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有