1. 程式人生 > >學習筆記——IIC匯流排

學習筆記——IIC匯流排

學習筆記——IIC匯流排

IIC(Inter-Integrated Circuit)匯流排是一種由 PHILIPS 公司開發的兩線式序列匯流排,用於連線微控制器及其外圍裝置。它是由資料線 SDA 和時鐘 SCL 構成的序列匯流排,可傳送和接收資料。在 CPU 與被控 IC 之間、 IC 與 IC 之間進行雙向傳送, 高速 IIC 匯流排一般可達 400kbps 以上。

IIC簡介

IIC 匯流排在傳送資料過程中共有三種類型訊號, 它們分別是:開始訊號、結束訊號和應答訊號。
開始訊號: SCL 為高電平時, SDA 由高電平向低電平跳變,開始傳送資料。
結束訊號: SCL 為高電平時, SDA 由低電平向高電平跳變,結束傳送資料。


應答訊號:接收資料的 IC 在接收到 8bit 資料後,向傳送資料的 IC 發出特定的低電平脈衝,表示已收到資料。 CPU 向受控單元發出一個訊號後,等待受控單元發出一個應答訊號, CPU 接收到應答訊號後,根據實際情況作出是否繼續傳遞訊號的判斷。若未收到應答訊號,由判斷為受控單元出現故障。

IIC時序圖

IIC匯流排時序圖

每個接到I2C總線上的器件都有唯一的地址。主機與其它器件間的資料傳送可以是由主機發送資料到其它器件,這時主機即為傳送器。由總線上接收資料的器件則為接收器。

資料傳送格式

(1)位元組傳送與應答

每一個位元組必須保證是8位長度。資料傳送時,先傳送最高位(MSB),每一個被傳送的位元組後面都必須跟隨一位應答位(即一幀共有9位)。
一個位元組的傳輸時序

(2)資料幀格式

IIC總線上傳送的資料訊號是廣義的,既包括地址訊號,又包括真正的資料訊號。
在起始訊號後必須傳送一個從機的地址(7位),第8位是資料的傳送方向位(R/T),用“0”表示主機發送資料(T),“1”表示主機接收資料(R)。每次資料傳送總是由主機產生的終止訊號結束。但是,若主機希望繼續佔用匯流排進行新的資料傳送,則可以不產生終止訊號,馬上再次發出起始訊號對另一從機進行定址。
在匯流排的一次資料傳送過程中,可以有以下幾種組合方式:

a、主機向從機發送資料,資料傳送方向在整個傳送過程中不變:


注:有陰影部分表示資料由主機向從機傳送,無陰影部分則表示資料由從機向主機傳送。
A表示應答, A非表示非應答(高電平)。S表示起始訊號,P表示終止訊號。

b、主機在第一個位元組後,立即從從機讀資料

c、在傳送過程中,當需要改變傳送方向時,起始訊號和從機地址都被重複產生一次,但兩次讀/寫方向位正好反相。

程式碼介紹

開始訊號

void I2cStart()
{
SDA=1;    //先置SDA為高
Delay10us();   
SCL=1;     //在SCL為高的情況下
Delay10us();//在這裡延時時間>4.7us
SDA=0;     //SDA由高變為地
Delay10us();//在這裡延時時間>4us
SCL=0;			
Delay10us();		
}

結束訊號

void I2cStop()
{
SDA=0;    //先置SDA為低

Delay10us();
SCL=1;   //在SCL為高的情況下
Delay10us();//在這裡延時時間?>4.7us
SDA=1;   //SDA由低變為高
Delay10us();		
}

傳送一個位元組

unsigned char I2cSendByte(unsigned char dat)
{
unsigned char a=0,b=0;//最大255,一個機器週期1us,最大延時255US
for(a=0;a<8;a++)//傳送8位且從最高位開始
	{
	SDA=dat>>7;	//SDA得到最高位,起始訊號時已拉低SCL
	dat=dat<<1;
	Delay10us();
	SCL=1;
	Delay10us();//SCL由低變為高且延時>4.7us,使SDA得到的資料傳送
	SCL=0;
	Delay10us();//	延時時間>4us
  }
SDA=1;
Delay10us();
SCL=1;
while(SDA)//等待從機應答即拉低SDA
{
	b++;
	if(b>200)	 //超過2000us即為傳送失敗或者無應答
	{
		SCL=0;
		Delay10us();
		return 0;   //傳送失敗
	}
}
SCL=0;
Delay10us();
return 1;		  //傳送成功
}

讀取位元組

unsigned char I2cReadByte()
{
unsigned char a=0,dat=0;
SDA=1;			//起始傳送後SDA均為低電平
Delay10us();
for(a=0;a<8;a++)
{
	SCL=1;    //SCL為高電平時讀取1位
	Delay10us();
	dat<<=1;   
	dat|=SDA;
	Delay10us();
	SCL=0;
	Delay10us();
}
return dat;		
}

EEPROM

EEPROM (Electrically Erasable Programmable read only memory),帶電可擦可程式設計只讀儲存器–一種掉電後資料不丟失的儲存晶片。 EEPROM 可以在電腦上或專用裝置上擦除已有資訊,重新程式設計。一般用在即插即用。
不同的從機有著不同的讀寫規則,這次學習的是AT24C02儲存器
EEPROM原理圖
AT24C02引腳說明

往AT24C02中某個記憶體地址寫入一個數據
void At24c02Write(unsigned char addr,unsigned char dat)
{
I2cStart();
I2cSendByte(0xa0);//傳送寫器件地址(前七位),最後一位代表讀或者寫
I2cSendByte(addr);//傳送要寫入的記憶體地址
I2cSendByte(dat); //傳送資料
I2cStop();
}
從AT24C02中某個記憶體地址讀取一個數據
unsigned char At24c02Read(unsigned char addr)
{
unsigned char num;
I2cStart();
I2cSendByte(0xa0); //傳送寫器件地址
I2cSendByte(addr); //傳送要讀取的記憶體地址
I2cStart(); //每次讀寫反向反轉時都需要再給一個起始訊號
I2cSendByte(0xa1); //傳送讀器件地址
num=I2cReadByte(); //讀取資料
I2cStop();
return num;
}