📄 i2ctest1.c
字号:
#include <p18f4620.h>
#define I2CDataIn PORTCbits.RC4
#define I2CDataOut LATCbits.LATC4
#define I2CDataDir TRISCbits.TRISC4
#define I2CClk LATCbits.LATC3
#define I2CCLKDir TRISCbits.TRISC3
#define SUCCESS 0
#define FAILED1 1
#define FAILED2 2
#define uchar unsigned char
#define uint unsigned int
void DelayMicroTime(uint);
void InitialI2cPort();
void StartI2c();
void Out8Bits(uchar byte);
void GiveAck();
void StopI2c();
uchar AckCheck();
void DelayMicroTime(uint z)
{
while(z)
z--;
}
void InitialI2cPort()
{
I2CDataDir=0;//初始化时都是0
I2CCLKDir =0;
I2CClk=1;
DelayMicroTime(80);
I2CDataOut=1;
}
//ok sda=1;scl=1;sda=0;scl=0
void StartI2c()
{
I2CDataDir=0;
I2CDataOut=1;
I2CClk=1;
DelayMicroTime(150);
I2CDataOut=0;
DelayMicroTime(150);
I2CClk=0;
}
void Out8Bits(uchar byte)
{
uchar i;
I2CDataDir=0;
for(i=0;i<8;i++)
{
I2CClk=0;
DelayMicroTime(50);
if(byte&0x0080)
I2CDataOut=1;
else
I2CDataOut=0;
DelayMicroTime(50);
byte<<=1;
I2CClk=1;
DelayMicroTime(50);
}
I2CClk=0;
I2CDataDir=1;//输入方向
I2CDataOut=1;
DelayMicroTime(80);
}
uchar AckCheck()
{
uchar result;
I2CClk=1;
DelayMicroTime(80);
if(I2CDataIn==0)
result=SUCCESS;
else
result=FAILED1;
DelayMicroTime(80);
I2CClk=0;
DelayMicroTime(80);
return result;
}
void GiveAck()
{
I2CClk=0;
I2CDataDir=0;
I2CDataOut=0;
DelayMicroTime(80);
I2CClk=1;
DelayMicroTime(80);
I2CClk=0;
DelayMicroTime(80);
I2CDataDir=1;
}
void In8Bits(uchar *byte)
{
uchar i;
I2CClk=0;
DelayMicroTime(80);
I2CDataIn=1;
I2CDataDir=1;
*byte=0;
for(i=0;i<8;i++)
{
*byte<<=1;
DelayMicroTime(80);
I2CClk=1;
DelayMicroTime(80);
if(I2CDataIn==1)
*byte|=0x01;
else
*byte&=0xfe;
I2CClk=0;
}
}
//ok scl=0;sda=0;scl=1;sda=1
void StopI2c()
{
I2CClk=0;
I2CDataDir=0;
I2CDataOut=0;
DelayMicroTime(80);
I2CClk=1;
DelayMicroTime(80);
I2CDataOut=1;
DelayMicroTime(80);
}
unsigned char DummyWrite(uchar address)
{
StartI2c();
Out8Bits(0xa0);
if(AckCheck()!=SUCCESS)
return FAILED1;
Out8Bits(address);
if(AckCheck()!=SUCCESS)
return FAILED1;
StopI2c();
return SUCCESS;
}
uchar ReadAt24c02(uchar *buffer,uchar length)
{
uchar i;
StartI2c();
Out8Bits(0xa1);
if(AckCheck()!=SUCCESS)
return FAILED1;
for(i=0;i<length;i++)
{
In8Bits(&buffer[i]);
if(i!=length-1)
{
GiveAck();
}
}
StopI2c();
return SUCCESS;
}
uchar WriteAt24c02(uchar address,uchar *buffer,char length)
{
uchar i;
StartI2c();
DelayMicroTime(50);
Out8Bits(0xa0);
if(AckCheck()!=SUCCESS)
return FAILED1;
Out8Bits(address);
if(AckCheck()!=SUCCESS)
return FAILED1;
for(i=0;i<length;i++)
{
Out8Bits(buffer[i]);
if(AckCheck()!=SUCCESS)
return FAILED1;
}
StopI2c();
return SUCCESS;
}
void main()
{
uchar a[8],b[8];
uchar i;
for (i=0;i<8;i++)
{
a[i]=1+i;
b[i]=9+i;
}
InitialI2cPort();
DelayMicroTime(30000);
DummyWrite(0x00);
DelayMicroTime(30000);
ReadAt24c02(b,8);
// WriteAt24c02(0x00,a,8);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -