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