S3C2440IIC中断方式
时间:11-21
来源:互联网
点击:
- #include
- #include"2440addr.h"
- #include"2440lib.h"
- #include"Option.h"
- #include"def.h"
- intflag;//中断标志(在中断子程序里清零,即未中断flag=1,中断后flag=0)
- void__irqIicInt(void);
- voidWr24C02(U32slvAddr,U32addr,U8data);
- voidRd24C02(U32slvAddr,U32addr,U8*data);
- voidMain(void)
- {
- unsignedinti,j;
- staticU8data[256];//用于存储AT24C02读出的数据
- SelectFclk(2);//设置系统时钟400M
- ChangeClockDivider(2,1);//设置分频1:4:8
- CalcBusClk();//计算总线频率
- rGPHCON&=~((3<4)|(3<6));
- rGPHCON|=(2<4)|(2<6);//GPH2--TXD[0];GPH3--RXD[0]
- rGPHUP=0x00;//使能上拉功能
- Uart_Init(0,115200);
- Uart_Select(0);
- Uart_Printf("[IICTest(Polling)usingAT24C020]\n");
- rGPEUP|=0xc000;//关上拉
- rGPECON&=~0xf0000000;
- rGPECON|=0xa0000000;//GPE15:IICSDA,GPE14:IICSCL
- pISR_IIC=(unsigned)IicInt;//设置中断程序地址
- rINTMSK&=~(BIT_IIC);//开中断源
- //使能应答,IIC总线时钟IICCLK=PCLK/16,使能中断,发送时钟IICCLK/16
- rIICCON=(1<7)|(0<6)|(1<5)|(0xf);
- rIICADD=0x10;//2440从机地址=[7:1]
- rIICSTAT=0x10;//IIC总线数据输出使能(Rx/Tx)
- Uart_Printf("WritetestdataintoAT24C02\n");
- for(i=0;i<256;i++)
- Wr24C02(0xa0,(U8)i,i);//写入数据到AT24C02
- for(i=0;i<256;i++)//数组数据清零
- data[i]=0;
- Uart_Printf("ReadtestdatafromAT24C02\n");
- for(i=0;i<256;i++)
- Rd24C02(0xa0,(U8)i,&(data[i]));//读取AT24C02的数据放入data数组中
- for(i=0;i<16;i++)
- {
- for(j=0;j<16;j++)
- Uart_Printf("%2x",data[i*16+j]);//打印从AT24C02读出的数据
- Uart_Printf("\n");
- }
- }
- voidWr24C02(U32slvAddr,U32addr,U8data)
- {
- flag=1;
- rIICDS=slvAddr;//从器件地址写入数据移位寄存器
- rIICSTAT=0xf0;//主发模式,产生起始信号,使能Rx/Tx
- rIICCON&=~0x10;//清除Tx/Rx中断挂起标志
- while(flag==1)//等待发送完成
- Delay(1);
- flag=1;
- rIICDS=addr;//写入存储字节的地址到数据移位寄存器
- rIICCON&=~0x10;//清除Tx/Rx中断挂起标志
- while(flag==1)//等待发送完成
- Delay(1);
- flag=1;
- rIICDS=data;//把要发送的数据写入数据移位寄存器
- rIICCON&=~0x10;//清除Tx/Rx中断挂起标志
- while(flag==1)//等待发送完成
- Delay(1);
- rIICSTAT=0xd0;//禁止Rx/Tx
- rIICCON=0xaf;//ResumesIICoperation.
- Delay(1);
- }
- voidRd24C02(U32slvAddr,U32addr,U8*data)
- {
- U8temp;
- flag=1;
- rIICDS=slvAddr;//从器件地址写入数据移位寄存器
- rIICSTAT=0xf0;//主发模式,产生起始信号,使能Rx/Tx
- rIICCON&=~0x10;//清除Tx/Rx中断挂起标志
- while(flag==1)//等待发送完成
- Delay(1);
- flag=1;
- rIICDS=addr;//写入存储字节的地址到数据移位寄存器
- rIICCON&=~0x10;//清除Tx/Rx中断挂起标志
- while(flag==1)//等待发送完成
- Delay(1);
- flag=1;
- rIICDS=slvAddr;
- rIICSTAT=0xb0;//主接收模式,使能Rx/Tx
- rIICCON&=~0x10;//清除Tx/Rx中断挂起标志
- while(flag==1)//等待发送完成
- Delay(1);
- //注意:读取下面这个字节必须进行,因为在发送带有读命令的从设备地址后,
- //AT24C02A会再返回一个从设备地址信息或从设备内存地址信息作为应答,所以
- //一定要把该字节读取后抛弃,因为它不是我们所要读取的信息;
- flag=1;
- temp=rIICDS;
- rIICCON&=~0x10;//清除Tx/Rx中断挂起标志
- while(flag==1)
- Delay(1);
- rIICCON=0x2f;//ResumesIICoperation.禁止应答
- *data=rIICDS;
- Delay(1);
- rIICSTAT=0x90;//StopMasRxcondition
- rIICCON=0xaf;//ResumesIICoperation.
- Delay(1);//Waituntilstopcondtionisineffect.
- }
- void__irqIicInt(void)
- {
- ClearPending(BIT_IIC);
- flag=0;
- }
S3C2440IIC中断方 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)