Arduino 之间的 I2C 通讯 (1) I2C 地址设定 及 I2C 地址扫瞄
本帖最后由 Super169 于 2015-8-1 21:12 编辑相关指令:
指令发出者作用
Wire.begin([<address>]); master / slave启动 Wire (由於 i2c 是用 Wire 的, 这就等同启动 i2c 了)
Wire.beginTransmission(<address>);master开始对 <address> 的连线
Wire.endTransmission();master 关闭之前的连线
i2c 地址设定
i2c address 就像是你家中的地址, 每个 slave 都有自己的地址, 由於线路上只有一个 master, 加上 slave 只可以向 master 通讯, 所以 master 是不需地址的.
设定 i2c 地址, 基本上是没有限制的, 只要同一线路上, 没有重复就可以了.
要设定 slave 板子的地址, 只需要执行 Wire.begin(<地址>); 而 master 因为不需要地址, 只要 Wire.begin() 就可以了,.
以下是一个 slave 设定的例子, 把 slave 板子的地址设定为 0x12, 上载到 slave 板子上去执行就可以了.
#include <Wire.h>
#define SLAVE_ADDRESS 0x12
void setup() {
Wire.begin(SLAVE_ADDRESS); // join I2C bus as a slave with address 0x12
}
void loop() {
}
i2c 地址扫瞄
slave 建立後, 就要看看 master 如果找到它了.
i2c scanner 可以说是 master 板子的最基本例子, 可以用作测试线路上连接了的设备的存在 (只测试存在性, 并非测试其功能).
i2c_scanner 其实也很简单, 由 master 向所有地址发出 beginTransmission 再 endTransmission, 尝试建立连线.在 beignTransmission 中输入 slave 的地址, 就可以测试该地址的装置了.
如果 error = 0 (没 error), 即代表这个地址有设备登记
如果 error = 4 (这是 Wire 库的设定, 不要问我为什麽是 4), 即代表这个地址可能有设备, 但有错误.
否则, 就代表该地址没有设备使用了.
以下是一个简单的 i2c scanner 程式:
#include <Wire.h>
#define SERIAL_BAUD 57600
void setup()
{
Wire.begin();
Serial.begin(SERIAL_BAUD);
Serial.println("I2C Scanner started");
Serial.println();
}
void loop()
{
uint8_t error, i2cAddress, devCount, unCount;
Serial.println("Scanning...");
devCount = 0;
unCount = 0;
for(i2cAddress = 1; i2cAddress < 127; i2cAddress++ )
{
Wire.beginTransmission(i2cAddress);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at 0x");
if (i2cAddress<16) Serial.print("0");
Serial.println(i2cAddress,HEX);
devCount++;
}
else if (error==4)
{
Serial.print("Unknow error at 0x");
if (i2cAddress<16) Serial.print("0");
Serial.println(i2cAddress,HEX);
unCount++;
}
}
if (devCount + unCount == 0)
Serial.println("No I2C devices found\n");
else {
Serial.print(devCount);
Serial.print(" device(s) found");
if (unCount > 0) {
Serial.print(", and unknown error in ");
Serial.print(unCount);
Serial.print(" address");
}
Serial.println();
}
Serial.println();
delay(5000);
}
在这个例子中, 应该可以得到以下的结果:
I2C Scanner started
Scanning...
I2C device found at 0x12
1 device(s) found
I2C Scanner 是非常有用的, 当你买了一个新装置, 如果送来的程式不成功, 先看看相关地址是否可找到装置, 可简单测试装置是否有问题.
相關程式下載:
受教了~~~~~~~~~ 谢谢~受教了~是个好方法 一直用i2c,但没用过查找地址功能,又学一招 这个教程真是太及时了,谢谢楼主。:):):)
页:
[1]