Arduino之間的I2C通訊
i2c地址設定
i2caddress 就像是你家中的地址, 每個slave都有自己的地址,由於線路上只有一個master,加上slave只可以向master通訊,所以master是不需地址的。
設定 i2c 地址,基本上是沒有限制的,只要同一線路上,沒有重復就可以了。
要設定slave板子的地址, 只需要執行Wire.begin(《地址》); 而 master因為不需要地址, 只要Wire.begin()就可以了,。
以下是一個 slave 設定的例子,把 slave板子的地址設定為 0x12,上載到slave板子上去執行就可以了。
[pre lang=“arduino” line=“1”file=“slave_01.ino”]#include 《Wire.h》
#define SLAVE_ADDRESS 0x12
void setup() {
Wire.begin(SLAVE_ADDRESS); // join I2C bus as a slave with address 0x12
}
void loop() {
}[/code]
i2c地址掃瞄
slave 建立後,就要看看 master 如果找到它了。
i2c scanner可以說是 master 板子的最基本例子,可以用作測試線路上連接了的設備的存在(只測試存在性,并非測試其功能)。
i2c_scanner 其實也很簡單, 由 master 向所有地址發出 beginTransmission 再 endTransmission, 嘗試建立連線。 在 beignTransmission 中輸入 slave 的地址, 就可以測試該地址的裝置了。
如果error = 0(沒 error),即代表這個地址有設備登記
如果 rror = 4(這是 Wire 庫的設定,不要問我為什麼是 4),即代表這個地址可能有設備, 但有錯誤。
否則,就代表該地址沒有設備使用了。
以下是一個簡單的 i2c scanner 程式:
[pre lang=“arduino” line=“1” file=“i2c_scanner.ino”]#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);
}
[/code]
在這個例子中, 應該可以得到以下的結果:
I2C Scanner started
Scanning.。。
I2C device found at 0x12
1 device(s) found
ARDUINO的I2C通信詳解
I2C是非常普通的通信方式,Arduino單片機集成了I2C庫,可以直接調用幾個函數實現I2C通信。Arduino MEGA2560開發板I2C接口,在班上對應的20--SDA 21--SCL。
Arduino的I2C庫是Wire.h。常用庫函數如下:
Wire.beginTransmission(Addr);
Wire.write(data);
Wire.endTransmission(void);
Wire.available();
Wire.read()。
每個數據發出后,都必須有應答,只有在等到應答后,才能發出下一個數據或者指令。
下面是一段代碼:
Wire.beginTransmission(0x01);
Wire.write(0xAA);
如果0x01發出后I2C器件沒有應答,那么0xAA就不能發送,這時候用示波器或者邏輯分析儀看,就只能看到發出了Start信號和數據0x01。
Wire.beginTransmission(Addr)只發送起始信號和I2C地址,Addr是I2C總線地址。
Wire.write(data)只發送數據,data就是希望發送的數據,而且是發一次,地址就自動加一。
Wire.endTransmission(void)發送停止信號。
Wire.requestFrom(Addr, num)向已知地址器件獲取連續num個數據,這時候需要注意,數據只是存起來了,并沒有真正返回。
Wire.read()就是用來讀回前面那些存起來的數據,而且是讀一次地址自動加一。
Wire.available()則返回已經存了多少個數據。
arduino讀取I2C總線上連接設備的地址:
這兩天研究了一下I2C總線,發現有好多I2C設備的地址并不知道,當然有的可以在網上查的到,但是如果遇到用過的I2C器件,設備地址被修改過,那么通過下面的代碼可以檢測出設備的地址。
操作步驟 :
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()
{
byte error, address;
int nDevices;
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)
Serial.print(“0”);
Serial.print(address,HEX);
Serial.println(“ !”);
nDevices++;
}
else if (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 foundn”);
else
Serial.println(“donen”);
delay(5000); // wait 5 seconds for next scan
I2C設備地址無法驅動設備的解決辦法:
評論
查看更多