新闻中心

S3C2440-IIC

作者: 时间:2016-12-02 来源:网络 收藏
void __irq IIC_ISR(void){
rSRCPND |= 0x1<<27;
rINTPND |= 0x1<<27;
flag = 0;
}
void wrat24c02(unsigned char add,unsigned char word, U32 length){
int i;
flag = 1;
rIICDS = 0xa0; //dev add
rIICCON &= "(0x1<<4); //清中断
rIICSTAT = 0xf0; //主发送模式,写开始信号输出,IIC Rx/Tx使能
//等待ACK,接收器在接受到8位数据后,在第9个时钟周期,拉低SDA电平,然后会产生中断
while(flag == 1)
delay(100);
flag = 1;
rIICDS = word; //word add 发送要写入的数据的内存其实地址
rIICCON &= "(0x1<<4);
while(flag)
delay(100); //注意要有delay
for(i = 0; i < length; i++){
flag = 1;
rIICDS = iic_buffer[ i];
rIICCON &= "(0x1<<4);
while(flag)
delay(100);
}
rIICCON = 0xe0; //IIC应答有效,IICCLK=fpclk/512,IIC接受发送中断使能位
rIICSTAT = 0xd0; //主发送模式,rIICCON和rIICSTAT配置好,方便下次使用
}
void rdat24c02(unsigned char add, unsigned char word, U32 length){
int i;
char temp;
flag = 1;
rIICDS = add; //dev add
rIICCON &= "(0x1<<4);
rIICSTAT = 0xf0;
while(flag)
delay(100);
flag = 1;
rIICDS = word; //word add
rIICCON &= "(0x1<<4);
while(flag)
delay(100);
flag = 1;
//这里的IIC的随机读操作,根据IIC的随机读时序,先发启动,要读取的设备地址和写的内存地址,方向是写,即0,重启IIC,
//发要读取的设备地址,这次方向是读,然后接到ACK,从机向主机发data,主机相应ACK,直到最后一个data,主机不相应ACK,
//发送停止信号
rIICDS = add; //dev add
rIICSTAT = 0xb0; //改变方向为主接收
rIICCON &= "(0x1<<4);
while(flag)
delay(100);
flag = 1;
temp = rIICDS;
rIICCON &= "(0x1<<4);
while(flag)
delay(100);
for(i = 0; i < length; i++){
flag = 1;
if(i == (length - 1)){
rIICCON &= "(0x1<<7);
}
iic_buffer[ i] = rIICDS;
rIICCON &= "(0x1<<4);
while(flag)
delay(100);
}
rIICCON = 0xd0;
rIICSTAT = 0x90;
delay(200);
}
int Main(){
int i;
count= 0;
length = 0;
cmd = 0;
command = 0;
rGPECON = 0xa0000000; //GPE15~14 IICSDA,IICSCL
rGPEUP = 0xc000;
rIICCON = 0xe0; //IIC应答有效,IICCLK=fpclk/512,IIC接受发送中断使能位
rIICSTAT = 0x10; //IIC总线有效Rx/Tx
rULCON0 = 0x3;
rUCON0 = (1<<11)|(1<<2)|(1<<0);
rUBRDIV0 = 26;
rSRCPND = (0x1<<28)|(0x1<<27);
rINTPND = (0x1<<28)|(0x1<<27);
rSUBSRCPND = 0x1<<0;
rINTMSK &= "((0x1<<28)|(0x1<<27));
rINTSUBMSK &= "(0x1<<0);
pISR_UART0 = (U32)UART0_ISR;
pISR_IIC = (U32)IIC_ISR;
for(i = 0; i < 8; i++){
iic_buffer[ i] = 0xee;
}
while(1){
switch(cmd){
case 0x01:
cmd = 0;
wrat24c02(add, word, length);
break;
case 0x02:
cmd = 0;
rdat24c02(add, word, length);
for(i = 0; i < 8; i++){
while(!(rUTRSTAT0&0x4));
rUTXH0 = iic_buffer[ i];
}
break;
}
}
return 0;
}
上一页 1 2 下一页

关键词: S3C2440IIC串行总

评论


技术专区

关闭