S3C2440IIC中斷方式
- #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);//設置系統(tǒng)時鐘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,使能中斷,發(fā)送時鐘IICCLK/16
- rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf);
- rIICADD=0x10;//2440從機地址=[7:1]
- rIICSTAT=0x10;//IIC總線數據輸出使能(Rx/Tx)
- Uart_Printf("WritetestdataintoAT24C02n");
- for(i=0;i<256;i++)
- Wr24C02(0xa0,(U8)i,i);//寫入數據到AT24C02
- for(i=0;i<256;i++)//數組數據清零
- data[i]=0;
- Uart_Printf("ReadtestdatafromAT24C02n");
- 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;//主發(fā)模式,產生起始信號,使能Rx/Tx
- rIICCON&=~0x10;//清除Tx/Rx中斷掛起標志
- while(flag==1)//等待發(fā)送完成
- Delay(1);
- flag=1;
- rIICDS=addr;//寫入存儲字節(jié)的地址到數據移位寄存器
- rIICCON&=~0x10;//清除Tx/Rx中斷掛起標志
- while(flag==1)//等待發(fā)送完成
- Delay(1);
- flag=1;
- rIICDS=data;//把要發(fā)送的數據寫入數據移位寄存器
- rIICCON&=~0x10;//清除Tx/Rx中斷掛起標志
- while(flag==1)//等待發(fā)送完成
- Delay(1);
- rIICSTAT=0xd0;//禁止Rx/Tx
- rIICCON=0xaf;//ResumesIICoperation.
- Delay(1);
- }
- voidRd24C02(U32slvAddr,U32addr,U8*data)
- {
- U8temp;
- flag=1;
- rIICDS=slvAddr;//從器件地址寫入數據移位寄存器
- rIICSTAT=0xf0;//主發(fā)模式,產生起始信號,使能Rx/Tx
- rIICCON&=~0x10;//清除Tx/Rx中斷掛起標志
- while(flag==1)//等待發(fā)送完成
- Delay(1);
- flag=1;
- rIICDS=addr;//寫入存儲字節(jié)的地址到數據移位寄存器
- rIICCON&=~0x10;//清除Tx/Rx中斷掛起標志
- while(flag==1)//等待發(fā)送完成
- Delay(1);
- flag=1;
- rIICDS=slvAddr;
- rIICSTAT=0xb0;//主接收模式,使能Rx/Tx
- rIICCON&=~0x10;//清除Tx/Rx中斷掛起標志
- while(flag==1)//等待發(fā)送完成
- Delay(1);
- //注意:讀取下面這個字節(jié)必須進行,因為在發(fā)送帶有讀命令的從設備地址后,
- //AT24C02A會再返回一個從設備地址信息或從設備內存地址信息作為應答,所以
- //一定要把該字節(jié)讀取后拋棄,因為它不是我們所要讀取的信息;
- 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;
- }
評論