6回答

1收藏

【赚周年币】技术贴-----(9)Fireduino 的I2C接口学习

#线上活动 #线上活动 2585 人阅读 | 6 人回复 | 2016-12-13

本帖最后由 wambob 于 2016-12-13 20:40 编辑

        I2C是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。
       I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。任何设备都可以作为主设备,也可以作为从设备,主要看发起传输的是哪一个设备。由于I2C有寻址、起始、应答、结束等等机制,所以很容易区分主从设备。
      Fireduino 有2个I2C接口,只支持Master 模式。一个用来读取板上的RTC时钟芯片,一个引出到Arduino接口。

     NXP生产的LM75数字温度传感器,是一款内置带隙温度传感器和∑-Δ模数转换功能的温度数字转换器,它也是温度检测器,可提供过热输出功能。详情见
LM75A.pdf (137.07 KB, 下载次数: 0)

    I2C地址由三位管脚逻辑电平决定,在I2C总线上最多可以使用相同的器件8个。

典型的应用电路:

读取温度时序图:


     Fireduino I2C / TWI 设备库允许Fireduino通过I2C 接口与外设备通信。
     Fireduino wire 库的路径:D:\arduino-1.6.8\portable\packages\Firefly\hardware\arm\1.3.0\libraries\Wire
      Fireduino wire API:
  1. void begin();
  2.     void end();
  3.     void beginTransmission(uint8_t);
  4.     void beginTransmission(int);
  5.     uint8_t endTransmission(void);
  6.     uint8_t endTransmission(uint8_t);
  7.     uint8_t requestFrom(uint8_t, uint8_t);
  8.     uint8_t requestFrom(uint8_t, uint8_t, uint8_t);
  9.         uint8_t requestFrom(uint8_t, uint8_t, uint32_t, uint8_t, uint8_t);
  10.     uint8_t requestFrom(int, int);
  11.     uint8_t requestFrom(int, int, int);
复制代码
打开1.6.8的IDE例程ADXL345,编辑代码
  1. #include <Wire.h>  //璋冪敤arduino鑷甫鐨??C??
  2. int LM75_address = 0x90>>1;  //LM75的7位地址??float L75_Temp;
  3. float L75_Temp;
  4. void LM75A_Temp(void)
  5. {  
  6.   uint8_t Temp_Data[2]={0};
  7.   uint16_t Temp;
  8.   Wire.beginTransmission(LM75_address);  
  9.   Wire.write(0x00);  
  10.   Wire.endTransmission();
  11.   Wire.requestFrom(LM75_address,2);
  12.   if(Wire.available()<=2);
  13.   {
  14.     Temp_Data[0]= Wire.read();
  15.     Temp_Data[1] = Wire.read();   
  16.   }  
  17.   Temp=(uint16_t)Temp_Data[0];
  18.   Temp=(Temp<<8|Temp_Data[1])>>5;
  19.   if(!(Temp_Data[0]&0x80))
  20.   {      
  21.       L75_Temp=Temp*0.125;
  22.       Serial.println(L75_Temp);
  23.   }
  24.   else
  25.   {      
  26.       L75_Temp=(0x800-Temp)*0.125;
  27.      Serial.println(L75_Temp);
  28.   }
  29. }
  30. void setup()
  31. {
  32.   Serial.begin(9600);
  33.   delay(100);
  34.   Serial.println("setup");  
  35.   Wire.begin();  //鍒濆鍖??C
  36.   delay(100);
  37.   Wire.beginTransmission(LM75_address);
  38.   Wire.write(0x00);  
  39.   Wire.endTransmission();
  40. }

  41. void loop()
  42. {
  43.   LM75A_Temp();  
  44.   delay(1000);   
  45. }
复制代码

测试的室内温度是9点多度,用打火机火焰靠近传感器,温度上升。

评分

参与人数 1 +20 收起 理由
loveeeboard + 20

查看全部评分

分享到:
回复

使用道具 举报

回答|共 6 个

倒序浏览

沙发

wudianjun2001

发表于 2016-12-14 08:30:57 | 只看该作者

不错不错,写的很详细
板凳

jackten

发表于 2016-12-14 09:27:38 | 只看该作者

谢谢分享                     
地板

slotg

发表于 2016-12-14 11:21:50 | 只看该作者

很详细,感谢分享。
5#

baicaiaichibaicai

发表于 2016-12-14 11:39:49 | 只看该作者

这个写得很详细
6#

toofree

发表于 2016-12-14 13:05:39 | 只看该作者

Wire.h 是个好东西
7#

wambob

发表于 2016-12-14 14:06:51 | 只看该作者

toofree 发表于 2016-12-14 13:05
Wire.h 是个好东西

的确好,封装了的I2C协议,省事
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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