十 ARM9(2440)的IIC-理論知識及程序?qū)嵗?/h1>
概述S3C2440A RISC 微處理器可以支持一個多主控IIC 總線串行接口。一條專用串行數(shù)據(jù)線(SDA)和一條專用
串行時鐘線(SCL)傳遞連接到IIC 總線的總線主控和外設(shè)之間的信息。SDA 和SCL 線都為雙向的。
多主控IIC 總線模式中,多個S3C2440A RISC 微處理器可以發(fā)送或接收串行數(shù)據(jù)來自或到從設(shè)備。主機(jī)
S3C2440A 可以通過IIC 總線啟動和結(jié)束數(shù)據(jù)傳輸。S3C2440A 中的IIC 總線是使用標(biāo)準(zhǔn)總線仲裁步驟。
為了控制多主控IIC 總線操作,必須寫入值到以下寄存器中:
– 多主控IIC 總線控制寄存器,IICCON
– 多主控IIC 總線控制/狀態(tài)寄存器,IICSTAT
– 多主控IIC 總線Tx/Rx 數(shù)據(jù)移位寄存器,IICDS
– 多主控IIC 總線地址寄存器,IICADD
當(dāng)釋放了IIC 總線時,SDA 和SCL 線應(yīng)該都保持為高電平。一個高到低SDA 的變化可以啟動一個起始條件。
SCL 穩(wěn)定保持在高電平時的一個低到高SDA 的變化可以啟動一個停止條件。
起始和停止條件通常由主設(shè)備產(chǎn)生。第一個數(shù)據(jù)字節(jié)為7 位地址值,其在啟動起始條件后放到總線上,可以確
定出主設(shè)備要選擇的從設(shè)備。第8 位是決定傳輸方向(讀或?qū)懀?br />每個放到SDA 線上的字節(jié)都應(yīng)該總共為8 位。字節(jié)可以在總線傳輸操作期間無限制的發(fā)送或接收。數(shù)據(jù)通常
從最高有效位(MSB)開始始發(fā)送,并且每個字節(jié)應(yīng)該立即通過應(yīng)答(ACK)位跟上。
本文引用地址:http://m.butianyuan.cn/article/201611/322175.htm
I2C總線可構(gòu)成多主和多從系統(tǒng)。在多主系統(tǒng)結(jié)構(gòu)中,系統(tǒng)通過硬件或軟件仲裁獲得總線控制使用權(quán)。應(yīng)用系統(tǒng)中I2C總線多采用主從結(jié)構(gòu),即總線上只有一個主控節(jié)點(diǎn),總線上的其他設(shè)備都作為從設(shè)備。I2C總線上的設(shè)備尋址由器件地址接線決定,并且通過訪問地址最低位來控制讀/寫方向。
目前,通用存儲器芯片多為EEPROM,其常用的協(xié)議主要有兩線串行連接協(xié)議(I2C)和
三線串行連接協(xié)議。帶I2C總線接口的EEPROM有許多型號,其中AT24CXX系列使用十分普遍。產(chǎn)品包括AT24C01、AT24C02、AT24C04、AT24C08、AT24C16等。
AT24系列存儲器芯片采用CMOS工藝制造,內(nèi)置有升壓電路,可在單電壓供電條件下工作。其標(biāo)準(zhǔn)封裝為8腳DIP封裝形式。
各引腳的功能說明如下:
SCL:串行時鐘。遵循ISO/IEC7816同步協(xié)議,漏極開路,需接上拉電阻。在該引腳的上升沿,系統(tǒng)將數(shù)據(jù)輸人到每個EEPROM器件,在下降沿輸出。
SDA:串行數(shù)據(jù)線。漏極開路,需接上拉電阻。雙向串行數(shù)據(jù)線,漏極開路,可與其他開路器件“線或”。
A0、A1、A2:器件/頁面尋址地址輸人端。在AT24C01和AT24C02中,引腳被硬連接,其他AT24Cxx均可接尋址地址線。
WP:讀/寫保護(hù)。接低電平時可對整片空間進(jìn)行讀/寫,高電平時不能讀/寫,受保護(hù)。
Vcc/GND:5V工作電壓。
設(shè)備地址(DADDR) AT24C04的器件地址是1010。
AT24CXX的數(shù)據(jù)操作格式
在I2C總線中,對AT24C04內(nèi)部存儲單元讀/寫,除了要給出器件的設(shè)備地址(DADDR)
外,還須指定讀/寫的頁而地址(PADDR)。兩者組成操作地址(OPADDR)如下:
1010 A2 A1 A0-R/W ,一般A2 A1 A0被硬連接,比如是接地,所以設(shè)備地址就是0xa0
下面是我摘自別人的文章中關(guān)于IIC的描述,寫的很好
s3c2440內(nèi)部有一個IIC總線接口,因此為我們連接帶有IIC通信模塊的外圍設(shè)備提供了便利。它具有四種操作模式:主設(shè)備發(fā)送模式、主設(shè)備接收模式、從設(shè)備發(fā)送模式和從設(shè)備接收模式。在這里我們只把s3c2440當(dāng)做IIC總線的主設(shè)備來使用,因此只介紹前兩種操作模式。在主設(shè)備發(fā)送模式下,它的工作流程為:首先配置IIC模式,然后把從設(shè)備地址寫入接收發(fā)送數(shù)據(jù)移位寄存器IICDS中,再把0xF0寫入控制狀態(tài)寄存器IICSTAT中,這時等待從設(shè)備發(fā)送應(yīng)答信號,如果想要繼續(xù)發(fā)送數(shù)據(jù),那么在接收到應(yīng)答信號后,再把待發(fā)送的數(shù)據(jù)寫入寄存器IICDS中,清除中斷標(biāo)志后,再次等待應(yīng)答信號;如果不想再發(fā)送數(shù)據(jù)了,那么把0x90寫入寄存器IICSTAT中,清除中斷標(biāo)志并等待停止條件后,即完成了一次主設(shè)備的發(fā)送。在主設(shè)備接收模式下,它的工作流程為:首先配置IIC模式,然后把從設(shè)備地址寫入接收發(fā)送數(shù)據(jù)移位寄存器IICDS中,再把0xB0寫入控制狀態(tài)寄存器IICSTAT中,這時等待從設(shè)備發(fā)送應(yīng)答信號,如果想要接收數(shù)據(jù),那么在應(yīng)答信號后,讀取寄存器IICDS,清除中斷標(biāo)志;如果不想接收數(shù)據(jù)了,那么就向寄存器IICSTAT寫入0x90,清除中斷標(biāo)志并等待停止條件后,即完成了一次主設(shè)備的接收。在完成上述兩個模式時,主要用到了控制寄存器IICCON、控制狀態(tài)寄存器IICSTAT和發(fā)送接收數(shù)據(jù)移位寄存器IICDS。由于我們只把s3c2440當(dāng)做主設(shè)備來用,并且系統(tǒng)的IIC總線上只有這么一個主設(shè)備,因此用來設(shè)置從設(shè)備地址的地址寄存器IICADD,和用于仲裁總線的多主設(shè)備線路控制寄存器IICLC都無需配置。寄存器IICCON的第6位和低4位用于設(shè)置IIC的時鐘頻率,因?yàn)镮IC的時鐘線SCL都是由主設(shè)備提供的。s3c2440的IIC時鐘源為PCLK,當(dāng)系統(tǒng)的PCLK為50MHz,而從設(shè)備最高需要100kHz時,可以將IICCON的第6位置1,IICCON的低4位全為0即可。寄存器IICCON的第7位用于設(shè)置是否發(fā)出應(yīng)答信號,第5位用于是否使能發(fā)送和接收中斷,第4位用于中斷的標(biāo)志,當(dāng)接收或發(fā)送數(shù)據(jù)后一定要對該位進(jìn)行清零,以清除中斷標(biāo)志。寄存器IICSTAT的高2位用于設(shè)置是哪種操作模式,當(dāng)向第5位寫0或?qū)?時,則表示結(jié)束IIC或開始IIC通訊,第4位用于是否使能接收/發(fā)送數(shù)據(jù)。
由于通訊是雙方的事情,在了解了主設(shè)備的操作模式后,還要清楚從設(shè)備的運(yùn)行機(jī)制,兩者要達(dá)到完美地結(jié)合,才能實(shí)現(xiàn)彼此的通訊。在這里,從設(shè)備是EEPROM——AT24C02A,要想讓s3c2440能夠正確地對AT24C02A讀寫,就必須讓s3c2440的時序完全按照AT24C02A的時序。AT24C02A的寫操作有兩種模式:字節(jié)寫和頁寫。字節(jié)寫是先接收帶有寫命令的設(shè)備地址信息,如果符合就應(yīng)答,再接收設(shè)備內(nèi)存地址信息,發(fā)出應(yīng)答后,再接收要寫入的數(shù)據(jù),這樣就完成了字節(jié)寫過程。頁寫與字節(jié)寫的區(qū)別就是,頁寫可以一次寫多個數(shù)據(jù),而字節(jié)寫只能一次寫一個數(shù)據(jù)。但由于AT24C02A的一頁才8個字節(jié),所以頁寫也最多寫8個數(shù)據(jù),而且只能在該頁內(nèi)寫,不會發(fā)生一次頁寫同時寫兩頁的情況。AT24C02A的讀操作有三種模式:當(dāng)前地址讀、隨機(jī)讀和序列讀。當(dāng)前地址讀是只能讀取當(dāng)前地址內(nèi)的數(shù)據(jù),它的時序是先接收帶有讀命令的設(shè)備地址信息,如果符合就應(yīng)答,然后發(fā)送當(dāng)前地址內(nèi)的數(shù)據(jù),在沒有接收從主設(shè)備發(fā)來的應(yīng)答信號的情況下終止該次操作。隨機(jī)讀的時序是,連續(xù)接收帶有寫命令的設(shè)備地址信息和設(shè)備內(nèi)存地址信息,然后主設(shè)備重新開啟IIC通信,AT24C02A再次接收到帶有讀命令的設(shè)備地址信息,在發(fā)出應(yīng)答信號以后,發(fā)送該內(nèi)存地址的數(shù)據(jù),在沒有接收到任何應(yīng)答信號的情況下結(jié)束該次通信。當(dāng)前地址讀和隨機(jī)讀一次都只能讀取一個數(shù)據(jù),而序列讀一次可以讀取若干個數(shù)據(jù),它的時序就是在當(dāng)前地址讀或隨機(jī)讀發(fā)出數(shù)據(jù)后,接收到了應(yīng)答信號,那么AT24C02A會把下一個內(nèi)存地址中的數(shù)據(jù)送出,除非AT24C02A接收不到任何應(yīng)答信號,否則它會一直把下一個內(nèi)存地址中的數(shù)據(jù)送出。序列讀沒有一頁8個字節(jié)的限制。
在介紹完了s3c2440和AT24C02A的IIC通訊方式后,我們就可以寫程序了。在這里,我們用UART來實(shí)現(xiàn)PC機(jī)對AT24C02A的讀寫。UART的通訊協(xié)議是,PC機(jī)先發(fā)送命令字節(jié):0xC0表示要向AT24C02A寫數(shù)據(jù),0xC1表示要讀取AT24C02A的數(shù)據(jù),在命令字節(jié)后,緊跟著的是設(shè)備內(nèi)存地址和寫入或讀取的字節(jié)數(shù)。如果是要寫EEPROM數(shù)據(jù),則在這三個字節(jié)后是要寫入的數(shù)據(jù)內(nèi)容。在UART通訊完畢后,s3c2440會根據(jù)命令的不同,寫入或讀取AT24C02A,如果是讀取EEPROM,則s3c2440還會利用UART把讀取到的數(shù)據(jù)上傳到PC機(jī)。在這個程序中,我們只開啟了UART的接收中斷,而沒有開啟發(fā)送中斷,即讓s3c2440主動去完成發(fā)送任務(wù)。并且在與AT24C02A操作中,我們使用的是頁寫和序列讀的模式,這樣可以最大程度的完成一次讀或?qū)懖僮鳎椅覀兯帉懙捻搶懞托蛄凶x子程度也同樣可以實(shí)現(xiàn)字節(jié)寫和隨機(jī)讀的模式。在這里我們限制一次讀或?qū)懙臄?shù)據(jù)量最多為8個字節(jié)。
下面是用FL2440開發(fā)板的程序分析:
#include
#include "2440addr.h"
#include "def.h"
#include "IIC.h"
static U8 _iicData[IICBUFSIZE];
static volatile int _iicDataCount;//發(fā)送計數(shù)標(biāo)志
static volatile int _iicStatus;//IIC狀態(tài)標(biāo)志
static volatile int _iicMode;//IIC模式標(biāo)志
static int _iicPt;
extern void Uart_Printf(char *fmt,...);
extern void Uart_Init(int baud);
void Delay(int x);
//===================================================================
// SMDK2440 IIC configuration
// GPE15=IICSDA, GPE14=IICSCL
// "Interrupt mode" for IIC block
//===================================================================
//******************[ Test_Iic ]**************************************
void Test_Iic(void)
{
unsigned int i,j,save_E,save_PE;
static U8 data[512];//256
//Uart_Init(115200);
Uart_Printf("nIIC Test(Interrupt) using AT24C02n");
save_E = rGPECON;
save_PE = rGPEUP;
rGPEUP |= 0xc000; //Pull-up disable
rGPECON &=0xfffffff;
rGPECON |= 0xa0000000; //GPE15:IICSDA , GPE14:IICSCL
pISR_IIC = (unsigned)IicInt;
rINTMSK &= ~(BIT_IIC);
//Enable ACK, Prescaler IICCLK=PCLK/16, Enable interrupt, Transmit clock value Tx clock=IICCLK/16
// If PCLK 50.7MHz, IICCLK = 3.17MHz, Tx Clock = 0.198MHz
rIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);
rIICADD = 0x10; //2440 slave address = [7:1] 實(shí)驗(yàn)中沒有此語句時也沒有影響,因?yàn)槭褂玫氖侵鳈C(jī)模式
rIICSTAT = 0x10; //IIC bus data output enable(Rx/Tx)
rIICLC = (1<<2)|(1); // Filter enable, 15 clocks SDA output delay added by junon
rIICDS = 0xDD;
Uart_Printf("Write test data into AT24C02n");
for(i=0;i<256;i++)//256
Wr24C080(0xa0,(U8)i,i);//向地址0--255寫入數(shù)據(jù)0--255
for(i=0;i<256;i++)//256
data[i] = 0;//數(shù)組清零
Uart_Printf("Read test data from AT24C02n");
for(i=0;i<256;i++)
Rd24C080(0xa0,(U8)i,&(data[i]));//將讀取的數(shù)據(jù)存入data數(shù)組
//Line changed 0 ~ f
for(i=0;i<16;i++)//打印讀取的數(shù)據(jù) 16
{
for(j=0;j<16;j++)
Uart_Printf("%2x ",data[i*16+j]);
Uart_Printf("n");
}
rINTMSK |= BIT_IIC;//屏蔽中斷
rGPEUP = save_PE;//恢復(fù)GPE口
rGPECON = save_E;
while(1);
}
S3C2440A RISC 微處理器可以支持一個多主控IIC 總線串行接口。一條專用串行數(shù)據(jù)線(SDA)和一條專用
串行時鐘線(SCL)傳遞連接到IIC 總線的總線主控和外設(shè)之間的信息。SDA 和SCL 線都為雙向的。
多主控IIC 總線模式中,多個S3C2440A RISC 微處理器可以發(fā)送或接收串行數(shù)據(jù)來自或到從設(shè)備。主機(jī)
S3C2440A 可以通過IIC 總線啟動和結(jié)束數(shù)據(jù)傳輸。S3C2440A 中的IIC 總線是使用標(biāo)準(zhǔn)總線仲裁步驟。
為了控制多主控IIC 總線操作,必須寫入值到以下寄存器中:
– 多主控IIC 總線控制寄存器,IICCON
– 多主控IIC 總線控制/狀態(tài)寄存器,IICSTAT
– 多主控IIC 總線Tx/Rx 數(shù)據(jù)移位寄存器,IICDS
– 多主控IIC 總線地址寄存器,IICADD
當(dāng)釋放了IIC 總線時,SDA 和SCL 線應(yīng)該都保持為高電平。一個高到低SDA 的變化可以啟動一個起始條件。
SCL 穩(wěn)定保持在高電平時的一個低到高SDA 的變化可以啟動一個停止條件。
起始和停止條件通常由主設(shè)備產(chǎn)生。第一個數(shù)據(jù)字節(jié)為7 位地址值,其在啟動起始條件后放到總線上,可以確
定出主設(shè)備要選擇的從設(shè)備。第8 位是決定傳輸方向(讀或?qū)懀?br />每個放到SDA 線上的字節(jié)都應(yīng)該總共為8 位。字節(jié)可以在總線傳輸操作期間無限制的發(fā)送或接收。數(shù)據(jù)通常
從最高有效位(MSB)開始始發(fā)送,并且每個字節(jié)應(yīng)該立即通過應(yīng)答(ACK)位跟上。
I2C總線可構(gòu)成多主和多從系統(tǒng)。在多主系統(tǒng)結(jié)構(gòu)中,系統(tǒng)通過硬件或軟件仲裁獲得總線控制使用權(quán)。應(yīng)用系統(tǒng)中I2C總線多采用主從結(jié)構(gòu),即總線上只有一個主控節(jié)點(diǎn),總線上的其他設(shè)備都作為從設(shè)備。I2C總線上的設(shè)備尋址由器件地址接線決定,并且通過訪問地址最低位來控制讀/寫方向。
目前,通用存儲器芯片多為EEPROM,其常用的協(xié)議主要有兩線串行連接協(xié)議(I2C)和
三線串行連接協(xié)議。帶I2C總線接口的EEPROM有許多型號,其中AT24CXX系列使用十分普遍。產(chǎn)品包括AT24C01、AT24C02、AT24C04、AT24C08、AT24C16等。
AT24系列存儲器芯片采用CMOS工藝制造,內(nèi)置有升壓電路,可在單電壓供電條件下工作。其標(biāo)準(zhǔn)封裝為8腳DIP封裝形式。
各引腳的功能說明如下:
SCL:串行時鐘。遵循ISO/IEC7816同步協(xié)議,漏極開路,需接上拉電阻。在該引腳的上升沿,系統(tǒng)將數(shù)據(jù)輸人到每個EEPROM器件,在下降沿輸出。
SDA:串行數(shù)據(jù)線。漏極開路,需接上拉電阻。雙向串行數(shù)據(jù)線,漏極開路,可與其他開路器件“線或”。
A0、A1、A2:器件/頁面尋址地址輸人端。在AT24C01和AT24C02中,引腳被硬連接,其他AT24Cxx均可接尋址地址線。
WP:讀/寫保護(hù)。接低電平時可對整片空間進(jìn)行讀/寫,高電平時不能讀/寫,受保護(hù)。
Vcc/GND:5V工作電壓。
設(shè)備地址(DADDR)
AT24CXX的數(shù)據(jù)操作格式
在I2C總線中,對AT24C04內(nèi)部存儲單元讀/寫,除了要給出器件的設(shè)備地址(DADDR)
外,還須指定讀/寫的頁而地址(PADDR)。兩者組成操作地址(OPADDR)如下:
下面是我摘自別人的文章中關(guān)于IIC的描述,寫的很好
s3c2440內(nèi)部有一個IIC總線接口,因此為我們連接帶有IIC通信模塊的外圍設(shè)備提供了便利。它具有四種操作模式:主設(shè)備發(fā)送模式、主設(shè)備接收模式、從設(shè)備發(fā)送模式和從設(shè)備接收模式。在這里我們只把s3c2440當(dāng)做IIC總線的主設(shè)備來使用,因此只介紹前兩種操作模式。在主設(shè)備發(fā)送模式下,它的工作流程為:首先配置IIC模式,然后把從設(shè)備地址寫入接收發(fā)送數(shù)據(jù)移位寄存器IICDS中,再把0xF0寫入控制狀態(tài)寄存器IICSTAT中,這時等待從設(shè)備發(fā)送應(yīng)答信號,如果想要繼續(xù)發(fā)送數(shù)據(jù),那么在接收到應(yīng)答信號后,再把待發(fā)送的數(shù)據(jù)寫入寄存器IICDS中,清除中斷標(biāo)志后,再次等待應(yīng)答信號;如果不想再發(fā)送數(shù)據(jù)了,那么把0x90寫入寄存器IICSTAT中,清除中斷標(biāo)志并等待停止條件后,即完成了一次主設(shè)備的發(fā)送。在主設(shè)備接收模式下,它的工作流程為:首先配置IIC模式,然后把從設(shè)備地址寫入接收發(fā)送數(shù)據(jù)移位寄存器IICDS中,再把0xB0寫入控制狀態(tài)寄存器IICSTAT中,這時等待從設(shè)備發(fā)送應(yīng)答信號,如果想要接收數(shù)據(jù),那么在應(yīng)答信號后,讀取寄存器IICDS,清除中斷標(biāo)志;如果不想接收數(shù)據(jù)了,那么就向寄存器IICSTAT寫入0x90,清除中斷標(biāo)志并等待停止條件后,即完成了一次主設(shè)備的接收。在完成上述兩個模式時,主要用到了控制寄存器IICCON、控制狀態(tài)寄存器IICSTAT和發(fā)送接收數(shù)據(jù)移位寄存器IICDS。由于我們只把s3c2440當(dāng)做主設(shè)備來用,并且系統(tǒng)的IIC總線上只有這么一個主設(shè)備,因此用來設(shè)置從設(shè)備地址的地址寄存器IICADD,和用于仲裁總線的多主設(shè)備線路控制寄存器IICLC都無需配置。寄存器IICCON的第6位和低4位用于設(shè)置IIC的時鐘頻率,因?yàn)镮IC的時鐘線SCL都是由主設(shè)備提供的。s3c2440的IIC時鐘源為PCLK,當(dāng)系統(tǒng)的PCLK為50MHz,而從設(shè)備最高需要100kHz時,可以將IICCON的第6位置1,IICCON的低4位全為0即可。寄存器IICCON的第7位用于設(shè)置是否發(fā)出應(yīng)答信號,第5位用于是否使能發(fā)送和接收中斷,第4位用于中斷的標(biāo)志,當(dāng)接收或發(fā)送數(shù)據(jù)后一定要對該位進(jìn)行清零,以清除中斷標(biāo)志。寄存器IICSTAT的高2位用于設(shè)置是哪種操作模式,當(dāng)向第5位寫0或?qū)?時,則表示結(jié)束IIC或開始IIC通訊,第4位用于是否使能接收/發(fā)送數(shù)據(jù)。
下面是用FL2440開發(fā)板的程序分析:
#include
#include "2440addr.h"
#include "def.h"
#include "IIC.h"
static U8 _iicData[IICBUFSIZE];
static volatile int _iicDataCount;//發(fā)送計數(shù)標(biāo)志
static volatile int _iicStatus;//IIC狀態(tài)標(biāo)志
static volatile int _iicMode;//IIC模式標(biāo)志
static int _iicPt;
extern void Uart_Printf(char *fmt,...);
extern void Uart_Init(int baud);
void Delay(int x);
//===================================================================
//
//
//
//===================================================================
//******************[ Test_Iic ]**************************************
void Test_Iic(void)
{
}
評論