S3C2440IIC中斷方式
- #include
- #include"2440addr.h"
- #include"2440lib.h"
- #include"Option.h"
- #include"def.h"
- intflag;//中斷標(biāo)志(在中斷子程序里清零,即未中斷flag=1,中斷后flag=0)
- void__irqIicInt(void);
- voidWr24C02(U32slvAddr,U32addr,U8data);
- voidRd24C02(U32slvAddr,U32addr,U8*data);
- voidMain(void)
- {
- unsignedinti,j;
- staticU8data[256];//用于存儲(chǔ)AT24C02讀出的數(shù)據(jù)
- SelectFclk(2);//設(shè)置系統(tǒng)時(shí)鐘400M
- ChangeClockDivider(2,1);//設(shè)置分頻1:4:8
- CalcBusClk();//計(jì)算總線頻率
- 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;//關(guān)上拉
- rGPECON&=~0xf0000000;
- rGPECON|=0xa0000000;//GPE15:IICSDA,GPE14:IICSCL
- pISR_IIC=(unsigned)IicInt;//設(shè)置中斷程序地址
- rINTMSK&=~(BIT_IIC);//開中斷源
- //使能應(yīng)答,IIC總線時(shí)鐘IICCLK=PCLK/16,使能中斷,發(fā)送時(shí)鐘IICCLK/16
- rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf);
- rIICADD=0x10;//2440從機(jī)地址=[7:1]
- rIICSTAT=0x10;//IIC總線數(shù)據(jù)輸出使能(Rx/Tx)
- Uart_Printf("WritetestdataintoAT24C02n");
- for(i=0;i<256;i++)
- Wr24C02(0xa0,(U8)i,i);//寫入數(shù)據(jù)到AT24C02
- for(i=0;i<256;i++)//數(shù)組數(shù)據(jù)清零
- data[i]=0;
- Uart_Printf("ReadtestdatafromAT24C02n");
- for(i=0;i<256;i++)
- Rd24C02(0xa0,(U8)i,&(data[i]));//讀取AT24C02的數(shù)據(jù)放入data數(shù)組中
- for(i=0;i<16;i++)
- {
- for(j=0;j<16;j++)
- Uart_Printf("%2x",data[i*16+j]);//打印從AT24C02讀出的數(shù)據(jù)
- Uart_Printf("n");
- }
- }
- voidWr24C02(U32slvAddr,U32addr,U8data)
- {
- flag=1;
- rIICDS=slvAddr;//從器件地址寫入數(shù)據(jù)移位寄存器
- rIICSTAT=0xf0;//主發(fā)模式,產(chǎn)生起始信號(hào),使能Rx/Tx
- rIICCON&=~0x10;//清除Tx/Rx中斷掛起標(biāo)志
- while(flag==1)//等待發(fā)送完成
- Delay(1);
- flag=1;
- rIICDS=addr;//寫入存儲(chǔ)字節(jié)的地址到數(shù)據(jù)移位寄存器
- rIICCON&=~0x10;//清除Tx/Rx中斷掛起標(biāo)志
- while(flag==1)//等待發(fā)送完成
- Delay(1);
- flag=1;
- rIICDS=data;//把要發(fā)送的數(shù)據(jù)寫入數(shù)據(jù)移位寄存器
- rIICCON&=~0x10;//清除Tx/Rx中斷掛起標(biāo)志
- 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;//從器件地址寫入數(shù)據(jù)移位寄存器
- rIICSTAT=0xf0;//主發(fā)模式,產(chǎn)生起始信號(hào),使能Rx/Tx
- rIICCON&=~0x10;//清除Tx/Rx中斷掛起標(biāo)志
- while(flag==1)//等待發(fā)送完成
- Delay(1);
- flag=1;
- rIICDS=addr;//寫入存儲(chǔ)字節(jié)的地址到數(shù)據(jù)移位寄存器
- rIICCON&=~0x10;//清除Tx/Rx中斷掛起標(biāo)志
- while(flag==1)//等待發(fā)送完成
- Delay(1);
- flag=1;
- rIICDS=slvAddr;
- rIICSTAT=0xb0;//主接收模式,使能Rx/Tx
- rIICCON&=~0x10;//清除Tx/Rx中斷掛起標(biāo)志
- while(flag==1)//等待發(fā)送完成
- Delay(1);
- //注意:讀取下面這個(gè)字節(jié)必須進(jìn)行,因?yàn)樵诎l(fā)送帶有讀命令的從設(shè)備地址后,
- //AT24C02A會(huì)再返回一個(gè)從設(shè)備地址信息或從設(shè)備內(nèi)存地址信息作為應(yīng)答,所以
- //一定要把該字節(jié)讀取后拋棄,因?yàn)樗皇俏覀兯x取的信息;
- flag=1;
- temp=rIICDS;
- rIICCON&=~0x10;//清除Tx/Rx中斷掛起標(biāo)志
- while(flag==1)
- Delay(1);
- rIICCON=0x2f;//ResumesIICoperation.禁止應(yīng)答
- *data=rIICDS;
- Delay(1);
- rIICSTAT=0x90;//StopMasRxcondition
- rIICCON=0xaf;//ResumesIICoperation.
- Delay(1);//Waituntilstopcondtionisineffect.
- }
- void__irqIicInt(void)
- {
- ClearPending(BIT_IIC);
- flag=0;
- }
評(píng)論