友情提示:380元/半年,儿童学编程,就上码丁实验室。
我是潘,曾经是个工程师。这是 “Arduino 公开课” 系列的入门教程。本课将介绍如何检测 I2C 设备地址。有任何疑问请在评论区提出,我会逐一回答。
I2C 总线理论上能连接127个设备。一些设备有地址引脚,可以设置不同地址,只要根据 DataSheet 引用即可。但一些设备,比如 1602 不能设置地址,而且由于厂家太多,DataSheet资料不完备,万一厂家改变了地址,设备就无法工作了。
此时,我们设计一个 I2C 扫描程序,检查设备的地址。程序实现的方式很简单,就是检查总线上没一个地址是否会响应。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
/*
作者:Ardui.Co
效果:I2C 扫描程序
版本:1.0
更新时间:2017年5月13日
*/
#include <Wire.h>
voidsetup()
{
Wire.begin();
Serial.begin(9600);
Serial.println(“\nI2C Scanner”);
}
voidloop()
{
byteerror,address;
intnDevices;
Serial.println(“Scanning…”);
nDevices=0;
for(address=1;address<127;address++)
{
Wire.beginTransmission(address);
error=Wire.endTransmission();//传回寻址结果
if(error==0)//该地址上存在设备
{
Serial.print(“I2C device found at address 0x”);
if(address<16)//显示地址为16进制,小于16的数值添加“0”在前,更直观
Serial.print(“0″);
Serial.print(address,HEX);
Serial.println(“—–”);//分割线
nDevices++;
}
elseif(error==4)
{
Serial.print(“Unknow error at address 0x”);
if(address<16)
Serial.print(“0″);
Serial.println(address,HEX);
}
}
if(nDevices==0)
Serial.println(“No I2C devices found\n”);
else
Serial.println(“done\n”);
delay(2000);// wait 2 seconds for next scan
}
|
关键函数是:
1
|
Wire.endTransmission()
|
参考 Arduino官方文档,当 Wire.beginTransmission(address) 启动寻址后,Wire.endTransmission() 返回参数如下:
0:成功
1:数据太长,无法写入缓存
2:寻址过程中收到 NACK
3:传输数据过程中收到 NACK
4:其他错误(如,地址不存在)
程序能发现所有在线的设备: