新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51單片機—IIC—EEPROM(CAT24WCXX)—03

51單片機—IIC—EEPROM(CAT24WCXX)—03

作者: 時間:2016-11-25 來源:網絡 收藏
今天沒事做,突然想起來了IIC,所以決定回顧一下下,呵呵,忘記了不少,所以打算寫出來,便于以后記憶。。。,這里的例子就拿CAT24WCXX的EEPROM來解釋吧~~(我也是邊寫文章,邊寫代碼~~~累啊)

一、IIC總線簡介

本文引用地址:http://2s4d.com/article/201611/321508.htm

1.IIC總線的主要特點

IIC總線是一種簡單、雙向二線制同步串行總線。

(1)總線只有兩根線,既串行時鐘線(SCL)和串行數據線(SDA),這在設計中大大減少了硬件接口

(2)每個連接到總線上的器件都有一個用于識別的器件地址,(注意,器件地址由芯片內部硬件電路和外部地址引腳同時決定,這樣就避免了~~你懂得)從而建立了簡單的主從關系,從而每個器件都可以作為發(fā)送器,也可以作為接收器。

(3)同步時鐘允許器件以不同的波特率進行通訊。

(4)同步時鐘可以作為停止和重新啟動串行口發(fā)送的握手電路(就是開始和結束信號)。

(5)串行的速率不定(標準100kb/s。。。其它的就不用關心了)。

(6)連接到同一總線的集成電路只受400pf的最大總線電容。

2.IIC總線的基本結構

機構圖網上一推推的~~~

每個器件都有唯一的地址,器件兩兩之間都可以進行信息傳送。當某個器件向總線上發(fā)送信息時,它就是發(fā)送器(也叫做主控制器),而當其從總線上接收信息時,它又成為接收器(從控制器)。在信息的傳送過程中,主控制器發(fā)送的信號分為器件地址碼、器件單元地址和數據3部分(這里你完全可以聯(lián)系EEPROM,它們三個的功能看名字也能才出來,我就不寫了)。

3.IIC總線的信息傳送(這里才它XX的是重點,上邊的都是廢話)

當IIC總線沒有數據傳送時,數據線(SDA)和時鐘線(SCL)都為高電平。當主控制器向某個器件傳送信息時,首先應向總線傳送開始信號,然后才能傳送信息(這里信息包括地址啊,數據啊~~)當信息傳送結束時還應該傳送個結束信號,開始信號和結束信號的規(guī)定如下:

~~~~~~~~~~開始信號:SCL為高電平時,SDA由高變?yōu)榈偷奶儯_始傳送數據。

匯編的代碼:

START:SETBSDA
NOP
SETBSCL;起始條件建立大于4.7us
NOP
NOP
NOP
NOP
CLRSDA;起始條件鎖定大于4.7us
NOP
NOP
NOP
NOP
NOP
CLRSCL;鉗住總線,準備好發(fā)送數據
NOP
RET

當然然后就是c的代碼了:

void IIC_start()
{
sda=1;
_nop_();
scl=1;//開始信號建立時間大于4.7us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sda=0; //開始信號鎖定大于4us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;//鉗住IIC總線,準備發(fā)送或者接收數據
_nop_();
_nop_();
}

~~~~~~~~~~~結束信號:SCL為高電平時,SDA由低變?yōu)楦叩奶?,結束傳送數據。

還是先是匯編:(這里就不注釋了,太煩了)

STOP:CLRSDA
NOP
SETBSCL
NOP
NOP
NOP
NOP
NOP
SETBSDA
NOP
NOP
NOP
NOP
NOP
RET

c文件:

voidIIC_stop()
{
sda=0;
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}

開始信號和結束信號之間的傳送的是信息,信息的字節(jié)沒有限制,但每個字節(jié)必須為8位,高位在前,低位在后。數據線SDA上每一位信息狀態(tài)的改變只能發(fā)生在時鐘線SCl為低電平期間(這里因為剛才開始信號和結束信號,SCl為高電平的期間SDA狀態(tài)的改變已經被用來表示開始信號和結束信號)。同時每個字節(jié)后面必須接受一個應答信號(ACK),ACK是從器件接收到8位數據后向主控制器發(fā)出的特定的低電平脈沖,用來表示已經接收到數據(注意是在SCL為高,檢測SDA是否為低電平,之前SDA要拉高),如果主器件沒有受到應答信號,轉到出錯處理~~

~~~~~~~檢測應答位的程序:

匯編程序:

;返回值ACK=1時表示應達
CACK:
SETBSDA
NOP
NOP
SETBSCL
CLRACK
NOP
NOP
MOVC,SDA
JCCEND
SETBACK;應答位置1,既返回應答位為1
CEND:
NOP
CLRSCL
NOP
c程序(這里面有ack這個bit型的變量,提前設置為全局變量,所以函數類型為void)

void IIC_ack()
{
_nop_();
_nop_();
sda=1;//8位數據發(fā)送完后,準備接收數據
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
if(sda==1)
ack=0;
else ack=1;//接收到應答位,ack為1,否則置0
scl=0;
_nop_();
_nop_();
}

主控器件每次傳送的信息的第一個字節(jié)必須是器件的地址碼,第二個字節(jié)為器件的單元地址,用于實現選擇所操作的器件的內部單元,從第三個字節(jié)開始為傳送的數據(這里器件的地址碼自己可以上網上搜,高四位為器件的類型碼,最低位為讀寫位,其他三位你懂得,自己的設置位~~~,然后就是器件的單元地址,這個就看你的器件的存儲器地址了,最后就是數據~~~呵呵)。


上一頁 1 2 3 下一頁

關鍵詞: 51單片機IICEEPRO

評論


技術專區(qū)

關閉