读书人

S3C2440 I2C总路线控制

发布时间: 2013-10-08 16:38:32 作者: rapoo

S3C2440 I2C总线控制

概述:话不多说,直接上图

多主机IIC总线控制(IICCON):

S3C2440 I2C总路线控制

IIC控制总线状态(IICSTAT):

S3C2440 I2C总路线控制

IIC总线地址(IICADD):

S3C2440 I2C总路线控制

IIC发送,接收总线寄存器(IICDS)

S3C2440 I2C总路线控制

IIC总线控制寄存器:

S3C2440 I2C总路线控制

源码如下:

void Rd24C080(U32 slvAddr,U32 addr,U8 *data)
{
_iicMode = SETRDADDR;
_iicPt = 0;
_iicData[0] = (U8)addr;
_iicDataCount = 1;

rIICDS = slvAddr;
rIICSTAT = 0xf0; //MasTx,Start
//Clearing the pending bit isn't needed because the pending bit has been cleared.
while(_iicDataCount!=-1);

_iicMode = RDDATA;
_iicPt = 0;
_iicDataCount = 1;

rIICDS = slvAddr;
rIICSTAT = 0xb0; //MasRx,Start
rIICCON = 0xaf; //Resumes IIC operation.
while(_iicDataCount!=-1);

*data = _iicData[1];
}

void Wr24C080(U32 slvAddr,U32 addr,U8 data)
{
_iicMode = WRDATA;
_iicPt = 0;
_iicData[0] = (U8)addr;
_iicData[1] = data;
_iicDataCount = 2;

rIICDS = slvAddr; //0xa0
rIICSTAT = 0xf0; //MasTx,Start
//Clearing the pending bit isn't needed because the pending bit has been cleared.

while(_iicDataCount!=-1);

_iicMode = POLLACK;

while(1)
{
rIICDS = slvAddr;
_iicStatus = 0x100;
rIICSTAT = 0xf0; //MasTx,Start
rIICCON = 0xaf; //Resumes IIC operation.

while(_iicStatus==0x100);

if(!(_iicStatus&0x1))
break; //When ACK is received
}
rIICSTAT = 0xd0; //Stop MasTx condition
rIICCON = 0xaf; //Resumes IIC operation.
Delay(1); //Wait until stop condtion is in effect.
//Write is completed.
}

void Test_Iic(void)
{
unsigned int i,j,save_E,save_PE;
static U8 data[256];

Uart_Printf("\nIIC Test(Interrupt) using AT24C02\n");

save_E = rGPECON;
save_PE = rGPEUP;
rGPEUP |= 0xc000; //Pull-up disable
rGPECON |= 0xa00000; //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 delay added by junon

Uart_Printf("Write test data into AT24C02\n");

for(i=0;i<256;i++)
Wr24C080(0xa0,(U8)i,i);

for(i=0;i<256;i++)
data[i] = 0;

Uart_Printf("Read test data from AT24C02\n");

for(i=0;i<256;i++)
Rd24C080(0xa0,(U8)i,&(data[i]));

//Line changed 0 ~ f
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
Uart_Printf("%2x ",data[i*16+j]);
Uart_Printf("\n");
}
rINTMSK |= BIT_IIC;
rGPEUP = save_PE;
rGPECON = save_E;
}

void main()

{

Test_Iic();

}

读书人网 >编程

热点推荐