久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 十 ARM9(2440)的IIC-理論知識及程序實例

十 ARM9(2440)的IIC-理論知識及程序實例

作者: 時間:2016-11-27 來源:網絡 收藏
概述

S3C2440A RISC 微處理器可以支持一個多主控IIC 總線串行接口。一條專用串行數據線(SDA)和一條專用
串行時鐘線(SCL)傳遞連接到IIC 總線的總線主控和外設之間的信息。SDA 和SCL 線都為雙向的。
多主控IIC 總線模式中,多個S3C2440A RISC 微處理器可以發送或接收串行數據來自或到從設備。主機
S3C2440A 可以通過IIC 總線啟動和結束數據傳輸。S3C2440A 中的IIC 總線是使用標準總線仲裁步驟。
為了控制多主控IIC 總線操作,必須寫入值到以下寄存器中:
– 多主控IIC 總線控制寄存器,IICCON
– 多主控IIC 總線控制/狀態寄存器,IICSTAT
– 多主控IIC 總線Tx/Rx 數據移位寄存器,IICDS
– 多主控IIC 總線地址寄存器,IICADD
當釋放了IIC 總線時,SDA 和SCL 線應該都保持為高電平。一個高到低SDA 的變化可以啟動一個起始條件。
SCL 穩定保持在高電平時的一個低到高SDA 的變化可以啟動一個停止條件。
起始和停止條件通常由主設備產生。第一個數據字節為7 位地址值,其在啟動起始條件后放到總線上,可以確
定出主設備要選擇的從設備。第8 位是決定傳輸方向(讀或寫)。
每個放到SDA 線上的字節都應該總共為8 位。字節可以在總線傳輸操作期間無限制的發送或接收。數據通常
從最高有效位(MSB)開始始發送,并且每個字節應該立即通過應答(ACK)位跟上。

本文引用地址:http://cqxgywz.com/article/201611/322175.htm

I2C總線可構成多主和多從系統。在多主系統結構中,系統通過硬件或軟件仲裁獲得總線控制使用權。應用系統中I2C總線多采用主從結構,即總線上只有一個主控節點,總線上的其他設備都作為從設備。I2C總線上的設備尋址由器件地址接線決定,并且通過訪問地址最低位來控制讀/寫方向。

目前,通用存儲器芯片多為EEPROM,其常用的協議主要有兩線串行連接協議(I2C)和

三線串行連接協議。帶I2C總線接口的EEPROM有許多型號,其中AT24CXX系列使用十分普遍。產品包括AT24C01、AT24C02、AT24C04、AT24C08、AT24C16等。

AT24系列存儲器芯片采用CMOS工藝制造,內置有升壓電路,可在單電壓供電條件下工作。其標準封裝為8腳DIP封裝形式。

各引腳的功能說明如下:

SCL:串行時鐘。遵循ISO/IEC7816同步協議,漏極開路,需接上拉電阻。在該引腳的上升沿,系統將數據輸人到每個EEPROM器件,在下降沿輸出。

SDA:串行數據線。漏極開路,需接上拉電阻。雙向串行數據線,漏極開路,可與其他開路器件“線或”。

A0、A1、A2:器件/頁面尋址地址輸人端。在AT24C01和AT24C02中,引腳被硬連接,其他AT24Cxx均可接尋址地址線。

WP:讀/寫保護。接低電平時可對整片空間進行讀/寫,高電平時不能讀/寫,受保護。

Vcc/GND:5V工作電壓。

設備地址(DADDR)AT24C04的器件地址是1010。

AT24CXX的數據操作格式

在I2C總線中,對AT24C04內部存儲單元讀/寫,除了要給出器件的設備地址(DADDR)

外,還須指定讀/寫的頁而地址(PADDR)。兩者組成操作地址(OPADDR)如下:

1010 A2 A1 A0-R/W,一般A2 A1 A0被硬連接,比如是接地,所以設備地址就是0xa0

下面是我摘自別人的文章中關于IIC的描述,寫的很好

s3c2440內部有一個IIC總線接口,因此為我們連接帶有IIC通信模塊的外圍設備提供了便利。它具有四種操作模式:主設備發送模式、主設備接收模式、從設備發送模式和從設備接收模式。在這里我們只把s3c2440當做IIC總線的主設備來使用,因此只介紹前兩種操作模式。在主設備發送模式下,它的工作流程為:首先配置IIC模式,然后把從設備地址寫入接收發送數據移位寄存器IICDS中,再把0xF0寫入控制狀態寄存器IICSTAT中,這時等待從設備發送應答信號,如果想要繼續發送數據,那么在接收到應答信號后,再把待發送的數據寫入寄存器IICDS中,清除中斷標志后,再次等待應答信號;如果不想再發送數據了,那么把0x90寫入寄存器IICSTAT中,清除中斷標志并等待停止條件后,即完成了一次主設備的發送。在主設備接收模式下,它的工作流程為:首先配置IIC模式,然后把從設備地址寫入接收發送數據移位寄存器IICDS中,再把0xB0寫入控制狀態寄存器IICSTAT中,這時等待從設備發送應答信號,如果想要接收數據,那么在應答信號后,讀取寄存器IICDS,清除中斷標志;如果不想接收數據了,那么就向寄存器IICSTAT寫入0x90,清除中斷標志并等待停止條件后,即完成了一次主設備的接收。在完成上述兩個模式時,主要用到了控制寄存器IICCON、控制狀態寄存器IICSTAT和發送接收數據移位寄存器IICDS。由于我們只把s3c2440當做主設備來用,并且系統的IIC總線上只有這么一個主設備,因此用來設置從設備地址的地址寄存器IICADD,和用于仲裁總線的多主設備線路控制寄存器IICLC都無需配置。寄存器IICCON的第6位和低4位用于設置IIC的時鐘頻率,因為IIC的時鐘線SCL都是由主設備提供的。s3c2440的IIC時鐘源為PCLK,當系統的PCLK為50MHz,而從設備最高需要100kHz時,可以將IICCON的第6位置1,IICCON的低4位全為0即可。寄存器IICCON的第7位用于設置是否發出應答信號,第5位用于是否使能發送和接收中斷,第4位用于中斷的標志,當接收或發送數據后一定要對該位進行清零,以清除中斷標志。寄存器IICSTAT的高2位用于設置是哪種操作模式,當向第5位寫0或寫1時,則表示結束IIC或開始IIC通訊,第4位用于是否使能接收/發送數據。

由于通訊是雙方的事情,在了解了主設備的操作模式后,還要清楚從設備的運行機制,兩者要達到完美地結合,才能實現彼此的通訊。在這里,從設備是EEPROM——AT24C02A,要想讓s3c2440能夠正確地對AT24C02A讀寫,就必須讓s3c2440的時序完全按照AT24C02A的時序。AT24C02A的寫操作有兩種模式:字節寫和頁寫。字節寫是先接收帶有寫命令的設備地址信息,如果符合就應答,再接收設備內存地址信息,發出應答后,再接收要寫入的數據,這樣就完成了字節寫過程。頁寫與字節寫的區別就是,頁寫可以一次寫多個數據,而字節寫只能一次寫一個數據。但由于AT24C02A的一頁才8個字節,所以頁寫也最多寫8個數據,而且只能在該頁內寫,不會發生一次頁寫同時寫兩頁的情況。AT24C02A的讀操作有三種模式:當前地址讀、隨機讀和序列讀。當前地址讀是只能讀取當前地址內的數據,它的時序是先接收帶有讀命令的設備地址信息,如果符合就應答,然后發送當前地址內的數據,在沒有接收從主設備發來的應答信號的情況下終止該次操作。隨機讀的時序是,連續接收帶有寫命令的設備地址信息和設備內存地址信息,然后主設備重新開啟IIC通信,AT24C02A再次接收到帶有讀命令的設備地址信息,在發出應答信號以后,發送該內存地址的數據,在沒有接收到任何應答信號的情況下結束該次通信。當前地址讀和隨機讀一次都只能讀取一個數據,而序列讀一次可以讀取若干個數據,它的時序就是在當前地址讀或隨機讀發出數據后,接收到了應答信號,那么AT24C02A會把下一個內存地址中的數據送出,除非AT24C02A接收不到任何應答信號,否則它會一直把下一個內存地址中的數據送出。序列讀沒有一頁8個字節的限制。

在介紹完了s3c2440和AT24C02A的IIC通訊方式后,我們就可以寫程序了。在這里,我們用UART來實現PC機對AT24C02A的讀寫。UART的通訊協議是,PC機先發送命令字節:0xC0表示要向AT24C02A寫數據,0xC1表示要讀取AT24C02A的數據,在命令字節后,緊跟著的是設備內存地址和寫入或讀取的字節數。如果是要寫EEPROM數據,則在這三個字節后是要寫入的數據內容。在UART通訊完畢后,s3c2440會根據命令的不同,寫入或讀取AT24C02A,如果是讀取EEPROM,則s3c2440還會利用UART把讀取到的數據上傳到PC機。在這個程序中,我們只開啟了UART的接收中斷,而沒有開啟發送中斷,即讓s3c2440主動去完成發送任務。并且在與AT24C02A操作中,我們使用的是頁寫和序列讀的模式,這樣可以最大程度的完成一次讀或寫操作,而且我們所編寫的頁寫和序列讀子程度也同樣可以實現字節寫和隨機讀的模式。在這里我們限制一次讀或寫的數據量最多為8個字節。

下面是用FL2440開發板的程序分析:


#include
#include "2440addr.h"
#include "def.h"
#include "IIC.h"

static U8 _iicData[IICBUFSIZE];
static volatile int _iicDataCount;//發送計數標志
static volatile int _iicStatus;//IIC狀態標志
static volatile int _iicMode;//IIC模式標志
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] 實驗中沒有此語句時也沒有影響,因為使用的是主機模式
rIICSTAT = 0x10;//IIC bus data output enable(Rx/Tx)
rIICLC = (1<<2)|(1);// Filter enable, 15 clocks SDA output delayadded 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寫入數據0--255

for(i=0;i<256;i++)//256
data[i] = 0;//數組清零

Uart_Printf("Read test data from AT24C02n");

for(i=0;i<256;i++)
Rd24C080(0xa0,(U8)i,&(data[i]));//將讀取的數據存入data數組

//Line changed 0 ~ f
for(i=0;i<16;i++)//打印讀取的數據16
{
for(j=0;j<16;j++)
Uart_Printf("%2x ",data[i*16+j]);
Uart_Printf("n");
}
rINTMSK |= BIT_IIC;//屏蔽中斷
rGPEUP= save_PE;//恢復GPE口
rGPECON = save_E;
while(1);
}


上一頁 1 2 下一頁

關鍵詞: ARM92440II

評論


技術專區

關閉