意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

S3C2440 I2C总线控制

来源:恒创科技 编辑:恒创科技编辑部
2024-01-28 11:15:59


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

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


S3C2440 I2C总线控制

S3C2440 I2C总线控制_i++

IIC控制总线状态(IICSTAT):

S3C2440 I2C总线控制_寄存器_02

IIC总线地址(IICADD):

S3C2440 I2C总线控制_控制总线_03

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

S3C2440 I2C总线控制_寄存器_04

IIC总线控制寄存器:

S3C2440 I2C总线控制_S3C2440 I2C_05

源码如下:

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();
}
上一篇: TQ2440定时器之PWM 下一篇: 手机怎么远程登录云服务器?