-
- #include "main.h"
- volatile uint32_t I2CDATA1;
- void InitSYS()
- {
- UNLOCKREG();
- DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1); //选择外部晶振;
- DrvSYS_Delay(5000);
- LOCKREG();
- }
- void InitGPIO()
- {
- DrvGPIO_InitFunction( E_FUNC_I2C1); //使能I2C功能;
- }
- void InitI2C()
- {
- DrvI2C_Open(I2C_PORT1, 400000); //打开I2C硬件并配置时钟总线400KHZ;
- DrvI2C_SetClockFreq (I2C_PORT1, 400000);//给I2C配置时钟频率;
- DrvI2C_GetStatus (I2C_PORT1); //获取I2C状态码;
- DrvI2C_WriteData(I2C_PORT1, 0); //写字节;
- DrvI2C_ReadData(I2C_PORT1); //读字节;
- DrvI2C_Ctrl(I2C_PORT1, 0, 0, 0, 0); //设定I2C控制位,包括控制寄存器中的STA, STO, AA, SI。
- }
- void Write_data(uint32_t address ,uint32_t data )
- {
- uint32_t I2CDelay;
- DrvI2C_Open(I2C_PORT1, 400000); //打开I2C硬件,并配置时钟总线400KHZ
- DrvI2C_Ctrl(I2C_PORT1, 1, 0, 0, 0); //发送一个起始信号
- while(I2C1->CON.SI==0);
- DrvI2C_WriteData(I2C_PORT1, 0xA0); //发送写命令;
- DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);
- while(I2C1->CON.SI==0);
- DrvI2C_WriteData(I2C_PORT1, address); //写地址;
- DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);
- while(I2C1->CON.SI==0);
- DrvI2C_WriteData(I2C_PORT1, data); //写数据;
- DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //给响应并清除中断标志;
- while( I2C1->CON.SI == 0 );
- DrvI2C_Ctrl(I2C_PORT1, 0, 1, 1, 0); //清标志位 SI 并STOP
- for(I2CDelay=0;I2CDelay<50;I2CDelay++);
- DrvI2C_Close(I2C_PORT1);
- for(I2CDelay=0I2CDelay<6000;I2CDelay++);
- for(I2CDelay=0;I2CDelay<6000I2CDelay++);
- }
- uint32_t Read_data(uint32_t address,uint32_t wordaddress)
- {
- uint32_t I2CDATA=0;
- DrvI2C_Open(I2C_PORT1, 50000);
- DrvI2C_Ctrl(I2C_PORT1, 1, 0, 1, 0); //发送一个起始信号;
- while(I2C1->CON.SI==0);
- DrvI2C_WriteData(I2C_PORT1, 0xA0); //写从机地址+写
- DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);
- while(I2C1->CON.SI==0);
- DrvI2C_WriteData(I2C_PORT1, wordaddress); //写字地址;
- DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //清除中断标志位并ACK;
- while(I2C1->CON.SI==0);
- DrvI2C_Ctrl(I2C_PORT1, 1, 0, 1, 0); //设定I2C控制比特 START并清中断标志
- while( I2C1->CON.SI == 0 );
- DrvI2C_WriteData(I2C_PORT1, address++); //写地址+读;
- DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //清标志位 SI 并使能应答
- while( I2C1->CON.SI == 0 );
- DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0); //清标志位 SI
- while( I2C1->CON.SI == 0 );
- I2CDATA=DrvI2C_ReadData(I2C_PORT1);
- DrvI2C_Ctrl(I2C_PORT1, 0, 1, 1, 0);
- DrvI2C_Close(I2C_PORT1);
- return I2CDATA;
- }
- int main ()
- {
- InitSYS();
- InitGPIO();
- InitI2C();
-
- while(1)
- {
-
- Write_data(0x02,0x54);
- I2CDATA1=Read_data(0xA1,0x02);
- printf("%d\n\r",I2CDATA1);
-
- }
- }