wire.begin,wirebegin是scl

http://www.itjxue.com  2023-01-14 22:11  来源:未知  点击次数: 

arduino i2c的wire库使用求教

开个 google 翻译,或者 必应翻译 最多1~2钟就能看懂.

给你一个 DS1307 的例子. 前提是DS1307 内已经有设好了时间.

#include?Wire.h

#define?DS1307_I2C_ADDRESS 0x68

#define?REG_SEC?????????????0x00

#define?REG_MIN?????????????0x01

#define?REG_HOUR 0x02

#define?REG_DAY?????????????0x03

#define?REG_DATE 0x04

#define?REG_MON?????????????0x05

#define?REG_YEAR 0x06

#define?REG_CTL?????????????0x07

#define?REG_RAM_START 0x08

#define?REG_RAM_END ????????0x3F

void?setup()?{

Wire.begin(); //?开启?I2C?总线(主设备)

Serial.begin(9600);

}

void?loop()?{

Wire.beginTransmission(DS1307_I2C_ADDRESS); //?开启发送

????Wire.write(REG_SEC); //?写入?DS1307?秒地址

????Wire.endTransmission(); // 结束发送

????Wire.requestFrom(DS1307_I2C_ADDRESS,?1);?//?请求?DS1307?一个字节

????uint8_t?s;

????if(Wire.available()?==?1)?{?//?可否获取1个数据

????????s?=?bcd2dec(Wire.read()??0x7F);????//?读取?DS1307?秒

????????Serial.println(s);

????}

????delay(1000);

}

uint8_t?dec2bcd(uint8_t?dec)?{

??return?((dec/10?*?16)?+?(dec?%?10));

}

uint8_t?bcd2dec(uint8_t?bcd)?{

??return?((bcd/16?*?10)?+?(bcd?%?16));

}

Arduino IIC协议笔记

他由3根线组成分别叫SDA,SCL,GND,SDA为数据线,SCL为时钟线,GND为参考电平,就是0电平

通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平

I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址**(可以从I2C器件的数据手册得知),主从设备之间就通过这个地址来确定与哪个器件进行通信,在通常的应用中,我们把CPU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。

I2C总线上的主设备与从设备之间 以字节(8位)为单位 进行双向的数据传输

总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件

数据的传输

主设备在传输有效数据之前要先指定从设备的地址,地址指定的过程和上面数据传输的过程一样,只不过大多数从设备的地址是7位的,然后协议规定再给地址添加一个最低位用来表示接下来数据传输的方向,0表示主设备向从设备写数据,1表示主设备向从设备读数据

第一,主设备往从设备中写数据。数据传输格式如下:

第二,主设备从从设备中读数据。数据传输格式如下:

第三,主设备往从设备中写数据,然后重启起始条件,紧接着从从设备中读取数据;或者是主设备从从设备中读数据,然后重启起始条件,紧接着主设备往从设备中写数据。数据传输格式如下:

第三种操作在单个主设备系统中,重复的开启起始条件机制要比用STOP终止传输后又再次开启总线更有效率。

Arduino的IIC通信使用wire库,该库包含以下方法:

begin()

requestFrom()

beginTransmission()

endTransmission()

write()

available()

read()

onReceive()

onRequest()

Wire.begin() 建立连接

(1)要在 setup( ) 内用Wire.begin( ) 加入 IIC 通讯

(A)Master 只要这样Wire.begin( );

(B)Slave 要用一个 1 到 127 的整数当作参数, 代表 Slave 的address,

例如

Wire.begin(2); // 我是2 号地址

(2)要由 Master 下命令要求Slave 送数据过来,

例如:

Wire.requestFrom(2,6); // 要求 2号透过Wire 送 6 个char 过来

但是, 请注意, 这里的 6 其实只是一个byte 的命令, 只是"希望"从机送 6 byte (最多只可要求32 byte)

这里的 6 到底是啥意思是由Master 和 Slave 的程序设计者自己约定好即可

Wire.requestFrom(); 只是送个命令(一个 byte)给某个Slave,

然后等着,直到至少一个char 送过来或 time out 才会往下做下一行

所以, 这时 Master 在这句下方要用Wire.read( ) 读取数据

Wire.requestFrom(); 会回传一个整数, intkkk = Wire.requestFrom(2, 6);

然后检查实际收到几个 byte 的kkk 是否为 0, 是表示 timeout 都没收到任何 byte

(3) Slave 应该如何响应主人Master的命令

官网的范例不管 Master 送过来是啥, 直接用 requestEvent() 函数送回6 bytes

比较正确的方法应该是:

(A) Master 在下达命令.requestFrom(从机地址, 几byte); 之前:

(B)在Slave 这边相对应于 (A)Master 的动作如下:

(C)在 Master 这边于.requestFrom( ); 之后用 while 检查Wire.available( ) 并用 Wire.read( ) 接收数据

问个弱智问题,2个I2C设备怎么接到 arduino 328上

1、将一个I2C器件连接至arduino的SDA、SCL引脚(UNO R3 连接A4、A5)

2、将如下代码烧入arduino,打开串口界面即可得到I2C设备的地址。

#include Wire.h

void setup()

{

Wire.begin();

Serial.begin(9600);

Serial.println("nI2C Scanner");

}

void loop()

帮我看看这个代码怎么改?

最后加两个}就差不多了

pulseOxymeter result= pulseOxymeter-update();这个result的定义也有问题,我不清楚MAX30100是怎么定义的,有些什么成员。我猜这里应该是

MAX30100* result= pulseOxymeter-update();

(责任编辑:IT教学网)

更多

相关dedeCMS建站文章