|
|
|
|
#include"i2c.h"
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Delay10us()
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>ʱ10us
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
|
|
void Delay10us()
|
|
|
|
|
{
|
|
|
|
|
unsigned char a,b;
|
|
|
|
|
for(b=1;b>0;b--)
|
|
|
|
|
for(a=2;a>0;a--);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : I2cStart()
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>ʼ<EFBFBD>źţ<EFBFBD><EFBFBD><EFBFBD>SCLʱ<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD>ڸߵ<EFBFBD>ƽ<EFBFBD>ڼ<EFBFBD>SDA<EFBFBD>źŲ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD>ע : <EFBFBD><EFBFBD>ʼ֮<EFBFBD><EFBFBD>SDA<EFBFBD><EFBFBD>SCL<EFBFBD><EFBFBD>Ϊ0
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
|
|
void I2cStart()
|
|
|
|
|
{
|
|
|
|
|
SDA=1;
|
|
|
|
|
Delay10us();
|
|
|
|
|
SCL=1;
|
|
|
|
|
Delay10us();//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>SDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>>4.7us
|
|
|
|
|
SDA=0;
|
|
|
|
|
Delay10us();//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>>4us
|
|
|
|
|
SCL=0;
|
|
|
|
|
Delay10us();
|
|
|
|
|
}
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : I2cStop()
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>ֹ<EFBFBD>źţ<EFBFBD><EFBFBD><EFBFBD>SCLʱ<EFBFBD><EFBFBD><EFBFBD>źŸߵ<EFBFBD>ƽ<EFBFBD>ڼ<EFBFBD>SDA<EFBFBD>źŲ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD>ע : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD>SDA<EFBFBD><EFBFBD>SCL<EFBFBD><EFBFBD>Ϊ1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
|
|
void I2cStop()
|
|
|
|
|
{
|
|
|
|
|
SDA=0;
|
|
|
|
|
Delay10us();
|
|
|
|
|
SCL=1;
|
|
|
|
|
Delay10us();//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4.7us
|
|
|
|
|
SDA=1;
|
|
|
|
|
Delay10us();
|
|
|
|
|
}
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : I2cSendByte(unsigned char dat)
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : ͨ<EFBFBD><EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽڡ<EFBFBD><EFBFBD><EFBFBD>SCLʱ<EFBFBD><EFBFBD><EFBFBD>źŸߵ<EFBFBD>ƽ<EFBFBD>ڼ䣬<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>SDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : num
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : 0<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD>0
|
|
|
|
|
* <EFBFBD><EFBFBD>ע : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>SCL=0,SDA=1
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
|
|
unsigned char I2cSendByte(unsigned char dat)
|
|
|
|
|
{
|
|
|
|
|
unsigned char a=0,b=0;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>255<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1us<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ255us<EFBFBD><EFBFBD>
|
|
|
|
|
for(a=0;a<8;a++)//Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>8λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>ʼ
|
|
|
|
|
{
|
|
|
|
|
SDA=dat>>7; //<EFBFBD><EFBFBD>ʼ<EFBFBD>ź<EFBFBD>֮<EFBFBD><EFBFBD>SCL=0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӹı<EFBFBD>SDA<EFBFBD>ź<EFBFBD>
|
|
|
|
|
dat=dat<<1;
|
|
|
|
|
Delay10us();
|
|
|
|
|
SCL=1;
|
|
|
|
|
Delay10us();//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>>4.7us
|
|
|
|
|
SCL=0;
|
|
|
|
|
Delay10us();//ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4us
|
|
|
|
|
}
|
|
|
|
|
SDA=1;
|
|
|
|
|
Delay10us();
|
|
|
|
|
SCL=1;
|
|
|
|
|
while(SDA)//<EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD>ǵȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>SDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
{
|
|
|
|
|
b++;
|
|
|
|
|
if(b>200) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2000usû<EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>Ӧ<EFBFBD>𣬱<EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
{
|
|
|
|
|
SCL=0;
|
|
|
|
|
Delay10us();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
SCL=0;
|
|
|
|
|
Delay10us();
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : I2cReadByte()
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : ʹ<EFBFBD><EFBFBD>I2c<EFBFBD><EFBFBD>ȡһ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : dat
|
|
|
|
|
* <EFBFBD><EFBFBD>ע : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>SCL=0,SDA=1.
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
|
|
unsigned char I2cReadByte()
|
|
|
|
|
{
|
|
|
|
|
unsigned char a=0,dat=0;
|
|
|
|
|
SDA=1; //<EFBFBD><EFBFBD>ʼ<EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>֮<EFBFBD><EFBFBD>SCL<EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
|
|
|
|
Delay10us();
|
|
|
|
|
for(a=0;a<8;a++)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
{
|
|
|
|
|
SCL=1;
|
|
|
|
|
Delay10us();
|
|
|
|
|
dat<<=1;
|
|
|
|
|
dat|=SDA;
|
|
|
|
|
Delay10us();
|
|
|
|
|
SCL=0;
|
|
|
|
|
Delay10us();
|
|
|
|
|
}
|
|
|
|
|
return dat;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : void At24c02Write(unsigned char addr,unsigned char dat)
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>24c02<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַд<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
|
|
void At24c02Write(unsigned char addr,unsigned char dat)
|
|
|
|
|
{
|
|
|
|
|
I2cStart();
|
|
|
|
|
I2cSendByte(0xa0);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
I2cSendByte(addr);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫд<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
I2cSendByte(dat); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
I2cStop();
|
|
|
|
|
}
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : unsigned char At24c02Read(unsigned char addr)
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>ȡ24c02<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
|
|
unsigned char At24c02Read(unsigned char addr)
|
|
|
|
|
{
|
|
|
|
|
unsigned char num;
|
|
|
|
|
I2cStart();
|
|
|
|
|
I2cSendByte(0xa0); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
I2cSendByte(addr); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD>ĵ<EFBFBD>ַ
|
|
|
|
|
I2cStart();
|
|
|
|
|
I2cSendByte(0xa1); //<EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
num=I2cReadByte(); //<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
I2cStop();
|
|
|
|
|
return num;
|
|
|
|
|
}
|
|
|
|
|
|