mini2440硬件篇之IIC
1.硬件原理
I2C總線是PHLIPS公司推出的一種串行總線,是具備多主機(jī)系統(tǒng)所需的包括總線裁決和高低速器件同步功能的高性能串行總線。I2C總線只有兩根雙向信號(hào)線。一根是數(shù)據(jù)線SDA,另一根是時(shí)鐘線SCL。
I2C總線通過(guò)上拉電阻接正電源。當(dāng)總線空閑時(shí),兩根線均為高電平。連到總線上的任一器件輸出的低電平,都將使總線的信號(hào)變低,即各器件的SDA及SCL都是線“與”關(guān)系。
每個(gè)接到I2C總線上的器件都有唯一的地址。主機(jī)與其它器件間的數(shù)據(jù)傳送可以是由主機(jī)發(fā)送數(shù)據(jù)到其它器件,這時(shí)主機(jī)即為發(fā)送器。由總線上接收數(shù)據(jù)的器件則為接收器。
1.1.數(shù)據(jù)位的有效性規(guī)定
I2C總線進(jìn)行數(shù)據(jù)傳送時(shí),時(shí)鐘信號(hào)為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有在時(shí)鐘線上的信號(hào)為低電平期間,數(shù)據(jù)線上的高電平或低電平狀態(tài)才允許變化。
1.2.起始和終止信號(hào)
SCL線為高電平期間,SDA線由高電平向低電平的變化表示起始信號(hào);SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止信號(hào)。
起始和終止信號(hào)都是由主機(jī)發(fā)出的,在起始信號(hào)產(chǎn)生后,總線就處于被占用的狀態(tài);在終止信號(hào)產(chǎn)生后,總線就處于空閑狀態(tài)。接收器件收到一個(gè)完整的數(shù)據(jù)字節(jié)后,有可能需要完成一些其它工作,如處理內(nèi)部中斷服務(wù)等,可能無(wú)法立刻接收下一個(gè)字節(jié),這時(shí)接收器件可以將SCL線拉成低電平,從而使主機(jī)處于等待狀態(tài)。直到接收器件準(zhǔn)備好接收下一個(gè)字節(jié)時(shí),再釋放SCL線使之為高電平,從而使數(shù)據(jù)傳送可以繼續(xù)進(jìn)行。
1.3.數(shù)據(jù)傳送
a、主機(jī)向從機(jī)發(fā)送數(shù)據(jù),數(shù)據(jù)傳送方向在整個(gè)傳送過(guò)程中不變:
b、主機(jī)在第一個(gè)字節(jié)后,立即從從機(jī)讀數(shù)據(jù)
c、在傳送過(guò)程中,當(dāng)需要改變傳送方向時(shí),起始信號(hào)和從機(jī)地址都被重復(fù)產(chǎn)生一次,但兩次讀/寫方向位正好反相。
2.芯片手冊(cè)
2.1.ATMEL公司的AT24C系列
AT24C01:128字節(jié)(128×8位);
AT24C02:256字節(jié)(256×8位);
AT24C04:512字節(jié)(512×8位)AT24C08:1K字節(jié)(1K×8位);
AT24C16:2K字節(jié)(2K×8位);
AT24C系列E2PROM芯片地址的固定部分為1010,A2、A1、A0引腳接高、低電平后得到確定的3位編碼。形成的7位編碼即為該器件的地址碼。
2.2.寫入
單片機(jī)進(jìn)行寫操作時(shí),首先發(fā)送該器件的7位地址碼和寫方向位“0”(共8位,即一個(gè)字節(jié)),發(fā)送完后釋放SDA線并在SCL線上產(chǎn)生第9個(gè)時(shí)鐘信號(hào)。被選中的存儲(chǔ)器器件在確認(rèn)是自己的地址后,在SDA線上產(chǎn)生一個(gè)應(yīng)答信號(hào)作為相應(yīng),單片機(jī)收到應(yīng)答后就可以傳送數(shù)據(jù)了。
傳送數(shù)據(jù)時(shí),單片機(jī)首先發(fā)送一個(gè)字節(jié)的被寫入器件的存儲(chǔ)區(qū)的首地址,收到存儲(chǔ)器器件的應(yīng)答后,單片機(jī)就逐個(gè)發(fā)送各數(shù)據(jù)字節(jié),但每發(fā)送一個(gè)字節(jié)后都要等待應(yīng)答。
AT24C系列器件片內(nèi)地址在接收到每一個(gè)數(shù)據(jù)字節(jié)地址后自動(dòng)加1,在芯片的“一次裝載字節(jié)數(shù)”(不同芯片字節(jié)數(shù)不同)限度內(nèi),只需輸入首地址。裝載字節(jié)數(shù)超過(guò)芯片的“一次裝載字節(jié)數(shù)”時(shí),數(shù)據(jù)地址將“上卷”,前面的數(shù)據(jù)將被覆蓋
當(dāng)要寫入的數(shù)據(jù)傳送完后,單片機(jī)應(yīng)發(fā)出終止信號(hào)以結(jié)束寫入操作。寫入n個(gè)字節(jié)的數(shù)據(jù)格式:
2.3.讀出
單片機(jī)先發(fā)送該器件的7位地址碼和寫方向位“0”(“偽寫”),發(fā)送完后釋放SDA線并在SCL線上產(chǎn)生第9個(gè)時(shí)鐘信號(hào)。被選中的存儲(chǔ)器器件在確認(rèn)是自己的地址后,在SDA線上產(chǎn)生一個(gè)應(yīng)答信號(hào)作為回應(yīng)。
然后,再發(fā)一個(gè)字節(jié)的要讀出器件的存儲(chǔ)區(qū)的首地址,收到應(yīng)答后,單片機(jī)要重復(fù)一次起始信號(hào)并發(fā)出器件地址和讀方向位(“1”),收到器件應(yīng)答后就可以讀出數(shù)據(jù)字節(jié),每讀出一個(gè)字節(jié),單片機(jī)都要回復(fù)應(yīng)答信號(hào)。當(dāng)最后一個(gè)字節(jié)數(shù)據(jù)讀完后,單片機(jī)應(yīng)返回以“非應(yīng)答”(高電平),并發(fā)出終止信號(hào)以結(jié)束讀出操作。
3.mini2440電路圖
由原理圖可以看出,2440只有兩根引腳和EEPROM連接。
4.S3C2440寄存器
IICCON控制寄存器,控制是否發(fā)生ACK信號(hào),設(shè)置發(fā)送器時(shí)鐘,開(kāi)啟IIC中斷。
IICSTAT控制/狀態(tài)寄存器,選擇工作模式(從機(jī)接收、從機(jī)發(fā)生、主機(jī)接收、主機(jī)發(fā)送),發(fā)出S信號(hào)、P信號(hào),使能接收/發(fā)送功能,并標(biāo)識(shí)各種狀態(tài)。
IICADDR從機(jī)地址
IICDS發(fā)送/接收寄存器,數(shù)據(jù)移位。
IICLC行控制寄存器
iic.h
/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:iic.h
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:IIC讀寫EEPROM.
*FunctionList:
*History:
******************************************************************/
#ifndef__IIC_H__
#define__IIC_H__
#defineDBG_IIC_LEVEL1
#defineDEV_ADDR0xa0
/*函數(shù)聲明*/
voidIICInit(void);
voidIICTest(void);
#endif//__IIC_H__
iic.c
/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:iic.c
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:IIC驅(qū)動(dòng)(中斷方式).
*FunctionList:
*History:
******************************************************************/
#include"common.h"
#include"core.h"
#include"iic.h"
unsignedcharpucIICBuffer[32][8];//IIC數(shù)據(jù)通訊緩存數(shù)組
unsignedcharg_bIICFlag=0;//應(yīng)答標(biāo)志
/********************************************************************
函數(shù)功能:IIC中斷函數(shù)。
入口參數(shù):無(wú)。
返回:無(wú)。
備注:無(wú)。
********************************************************************/
staticvoid__irqIICIntHandler(void)
{
rSRCPND=BIT_IIC;//Clearpendingbit
rINTPND=BIT_IIC;
g_bIICFlag=1;
}
/********************************************************************
函數(shù)功能:IIC初始化。
入口參數(shù):無(wú)。
返回:無(wú)。
備注:無(wú)。
********************************************************************/
voidIICInit(void)
{
rGPECON&=0x0fffffff;
rGPECON|=0xa0000000;//GPE15:IICSDA,GPE14:IICSCL
rGPEUP|=3<<14;//Pull-updisable
//EnableACK,PrescalerIICCLK=PCLK/16,Enableinterrupt,
//TransmitclockvalueTxclock=IICCLK/16,
//IfPCLK50.7MHz,IICCLK=3.17MHz,TxClock=0.198MHz
rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf);
rIICSTAT=0x10;//IICbusdataoutputenable(Rx/Tx)
#if0
rIICADD=0x10;//2440slaveaddress=[7:1]
rIICLC=(1<<2)|(1);//Filterenable,15clocksSDAoutputdelayaddedbyjunon
#endif
pISR_IIC=(unsignedint)IICIntHandler;
rINTMSK&=~(BIT_IIC);
}
/********************************************************************
函數(shù)功能:AT24c02a寫函數(shù)。
入口參數(shù):