- void I2C_Delay(void)
- {
- u16 dly;
- dly = 8; //取1对应SCL H为0.5us,L为1.5us,读写仍正常.为了可靠,取8
- while(--dly) ;
- }
-
- void I2C_Start(void) //start the I2C, SDA High-to-low when SCL is high
- {
- P_I2C_SDA = 1; //SDA = 1;
- I2C_Delay();
- P_I2C_SCL = 1; //SCL = 1;
- I2C_Delay();
- I2C_Delay();
- I2C_Delay();
- I2C_Delay();
- P_I2C_SDA = 0; //SDA = 0;
- I2C_Delay();
- I2C_Delay();
- I2C_Delay();
- P_I2C_SCL = 0; //SCL = 0;
- I2C_Delay();
- }
-
-
- void I2C_Stop(void) //STOP the I2C, SDA Low-to-high when SCL is high
- {
- P_I2C_SCL = 0; //SCL = 0;
- I2C_Delay();
- P_I2C_SDA = 0; //SDA = 0;
- I2C_Delay();
- P_I2C_SCL = 1; //SCL = 1;
- I2C_Delay();
- I2C_Delay();
- I2C_Delay();
- P_I2C_SDA = 1; //SDA = 1;
- I2C_Delay();
- }
-
- u8 I2C_Check_ACK(void) //Check ACK, If status=0: right, if status=1: error
- {
- u8 status;
- P_I2C_SDA = 1; //SDA = 1;
- I2C_Delay();
- P_I2C_SCL = 1; //SCL = 1;
- I2C_Delay();
- status = 0;
- if(P_I2C_SDA)
- status = 1;
- P_I2C_SCL = 0; //SCL = 0;
- I2C_Delay();
- return status;
- }
-
- /****************************/
- void I2C_WriteAbyte(u8 dat) //write a byte to I2C
- {
- u8 i;
- for(i=0; i<8; i++)
- {
- if(dat & 0x80)
- P_I2C_SDA = 1; //SDA = 1;
- else
- P_I2C_SDA = 0; //SDA = 0;
- I2C_Delay();
- P_I2C_SCL = 1; //SCL = 1;
- dat <<= 1;
- I2C_Delay();
- P_I2C_SCL = 0; //SCL = 0;
- I2C_Delay();
- }
- }
-
- u8 I2C_RegWrite(u8 RegAddr, u8 dat) //返回0: 正确, >0: 错误
- {
- u8 status;
-
- status = 1;
- I2C_Start();
- I2C_WriteAbyte(I2C_WR); //device address + WR
- if(I2C_Check_ACK() == 0)
- {
- I2C_WriteAbyte(RegAddr); //register address
- if(I2C_Check_ACK() == 0)
- {
- I2C_WriteAbyte(dat); //data
- if(I2C_Check_ACK() == 0) //data
- status = 0;
- }
- }
- I2C_Stop();
- return status;
- }
-
- u8 I2C_WriteCmd(u16 RegAddr, u16 dat)
- {
- u8 status;
-
- status = 1;
- I2C_Start();
- I2C_WriteAbyte(I2C_WR); //device address + WR
- if(I2C_Check_ACK() == 0)
- {
- dat = (RegAddr << 8) | dat;
- I2C_WriteAbyte((u8)(dat >> 8));
- if(I2C_Check_ACK() == 0)
- {
- I2C_WriteAbyte((u8)dat);
- if(I2C_Check_ACK() == 0) status = 0;
- }
- }
- I2C_Stop();
- return status;
- }
复制代码
|