#include
#include
#include
sbit sck=0x91;//時鐘線埠
sbit sda=0x90;//資料線埠
#define i2c_address 0xa0 //i2c晶元位址
#define nop _nop_()
#define nop nop;nop;nop;nop;nop;nop//延時應大於4.7us
//開始訊號
//在時鐘線為高電平時,資料線由高向低跳變.
void starti2c(void)
//停止訊號
//在時鐘線為高電平時,資料線由低向高跳變.
void stopi2c(void)
//傳送乙個位元組.
bit sendchar(unsigned char senddata)
//傳送乙個位元組後,讀取來自i2c晶元的響應.
//即在傳送完8個位元組後,在第九個時鐘內,sda匯流排應為低電平,表示i2c晶元已經讀取了資料.
//否則為高電平.即傳送收敗.
sda=1;
sck=1;
nop;
ack=sda;
sck=0;
nop;
return ack;
}//在讀取完來自i2c的8位資料後,發出讀取正確位.
//即傳送乙個低電平,表示已經讀取到來自i2c的資料,並允許i2晶元傳送下一位元組.
void ack(void)
//在讀取完來自i2c的8位資料後,傳送不響應位.
//即傳送乙個高電平,表示已經讀取完來自i2c的資料,並且不允許i2c傳送下一位元組.
void nak(void)
//讀入乙個位元組的資料.
unsigned char readchar(void)
return backdata;
}//以下所有為測試使用...
//應注意,在讀i2c晶元時,在傳送完i2c片內位址後,
//一定要傳送乙個重開始訊號,然後再傳送讀命令.
bit writei2c(unsigned char address,unsigned char writedata)
senddata:
if(sendchar(writedata))
if(sendchar(writedata))
stopi2c();
return 0;
}unsigned char readi2c(unsigned char address)
readstart2:
starti2c();
if(sendchar(i2c_address+1)) goto readstart2;
backdata=readchar();
ack();
backdata=readchar();
nak();
stopi2c();
return backdata;
}void delay(unsigned int ms)
void main(void)
}
I2C通訊技術
對於嵌入式開發的朋友來說,i2c協議實在是再熟悉不過了,有太多的器件,採用的都是通過i2c來進行相應的設定。今天,我們就隨便聊聊這個i2c協議。i2c協議中最重要的一點是i2c位址。這個位址有7位和10位兩種形式。7位能夠表示127個位址,而在實際使用中基本上不會掛載如此多的設定,所以很多裝置的位址...
I2C匯流排通訊
uart 屬於非同步通訊,比如電腦傳送給微控制器,電腦只負責把資料通過txd 傳送出來即可,接收資料是微控制器自己的事情。而 i2c 屬於同步通訊,scl 時鐘線負責收發雙方的時鐘節拍,sda 資料線負責傳輸資料。i2c 的傳送方和接收方都以 scl 這個時鐘節拍為基準進行資料的傳送和接收。i2c匯...
i2c通訊的詳細講解 I2C匯流排簡介
本文介紹了內部積體電路 aka i2c 序列通訊協議的基本特性和突出優點。元件之間的通訊 通訊協議 毫無疑問,電子系統的共同特徵是需要在兩個或三個或十個單獨的元件之間共享資訊。工程師已經開發出許多標準協議,可以幫助不同的晶元成功通訊 當您在微控制器或數字訊號處理器的功能列表中 通訊 下面對縮略語時,...