Arduino主機程序:(包括與I2C通訊相關(guān)的命令)
/*主機向從機循環(huán)發(fā)送字符串“l(fā)ight is ”和字節(jié)x,x為1或0
從機接收到主機發(fā)來的數(shù)據(jù)后,當(dāng)主機通知從機向它上傳數(shù)據(jù)時
會把x值再上傳回主機,然后賦值給變量c。
當(dāng)主機程序判斷c為1,則點亮LED,否則熄滅LED。*/
#include 《Wire.h》//聲明I2C庫文件
#define LED 13
byte x = 0;//變量x決定LED的亮滅
//初始化
void setup()
{
Wire.begin(); // 加入 i2c 總線,作為主機
pinMode(LED,OUTPUT);//設(shè)置數(shù)字端口13為輸出
}
//主程序
void loop()
{
Wire.beginTransmission(4); //發(fā)送數(shù)據(jù)到設(shè)備號為4的從機
Wire.send(“l(fā)ight is ”); // 發(fā)送字符串“l(fā)ight is ”
Wire.send(x); // 發(fā)送變量x中的一個字節(jié)
Wire.endTransmission(); // 停止發(fā)送
x++;//變量x加1
if(x==2)//如果變量x的值為2,則把x值轉(zhuǎn)為0
x=0;
delay(1000);//延時1s
Wire.requestFrom(4, 1); //通知4號從機上傳1個字節(jié)
while(Wire.available()》0) // 當(dāng)主機接收到從機數(shù)據(jù)時
{
byte c = Wire.receive(); //接收一個字節(jié)賦值給c
//判斷c為1,則點亮LED,否則熄滅LED。
if(c==1)
{digitalWrite(LED,LOW);}
else
{digitalWrite(LED,HIGH);}
}
delay(1000);//延時1s
}
Arduino從機程序:(包括與I2C通訊相關(guān)的命令)
/*循環(huán)接收主機發(fā)送來的數(shù)據(jù)包,同時顯示在串口監(jiān)視器上
把數(shù)據(jù)包的最后一個字節(jié),再上傳回主機
*/
#include 《Wire.h》//聲明I2C庫文件
int x;//變量x值決定主機的LED是否點亮
//初始化
void setup()
{
Wire.begin(4); // 加入 i2c 總線,設(shè)置從機地址為 #4
Wire.onReceive(receiveEvent); //注冊接收到主機字符的事件
Wire.onRequest(requestEvent); // 注冊主機通知從機上傳數(shù)據(jù)的事件
Serial.begin(9600); //設(shè)置串口波特率
}
//主程序
void loop()
{
delay(100);//延時
}
// 當(dāng)從機接收到主機字符,執(zhí)行該事件
void receiveEvent(int howMany)
{
while( Wire.available()》1) // 循環(huán)執(zhí)行,直到數(shù)據(jù)包只剩下最后一個字符
{
char c = Wire.receive(); // 作為字符接收字節(jié)
Serial.print(c); // 把字符打印到串口監(jiān)視器中
}
//接收主機發(fā)送的數(shù)據(jù)包中的最后一個字節(jié)
x = Wire.receive(); // 作為整數(shù)接收字節(jié)
Serial.println(x); //把整數(shù)打印到串口監(jiān)視器中,并回車
}
//當(dāng)主機通知從機上傳數(shù)據(jù),執(zhí)行該事件
void requestEvent()
{
//把接收主機發(fā)送的數(shù)據(jù)包中的最后一個字節(jié)再上傳給主機
Wire.send( x); // 響應(yīng)主機的通知,向主機發(fā)送一個字節(jié)數(shù)據(jù)
}
我通過這次I2C通訊實驗把這10個Arduino的I2C通訊命令全部應(yīng)用到了,仔細(xì)看實驗程序注釋,并實踐一次,就可以了解這Arduino控制器的I2C命令如何應(yīng)用了。
在數(shù)字通信各種協(xié)議中,相對Ethernet, USB, SATA, PCI-Express等傳輸速度達(dá)數(shù)百上千兆字節(jié)每秒的總線,I2C和SPI常稱為“小”協(xié)議。但是,我們不能忘記的是各種總線的用途是什么。“大”協(xié)議是用于系統(tǒng)外的整個系統(tǒng)之間通信的,“小”協(xié)議是用于系統(tǒng)內(nèi)各芯片間的通信,沒有跡象表明“大”協(xié)議有必要取代“小”協(xié)議。I2C和SPI的存在和流行體現(xiàn)了“夠用就好”的哲學(xué)。
評論