📄 i2ctest2.c
字号:
#include<p18f4620.h>
#define uint unsigned int
#define uchar unsigned char
#define fail 1
#define success 0
/*
#define SDA_OUT LATCbits.LATC4
#define SDA_IN PORTCbits.RC4
#define SDA_DIR TRISCbits.TRISC4
#define SCL LATCbits.LATC3
*/
void I2C_START();
void I2C_STOP();
int SEND_8bits(uchar x);
int SEND_ONE_BYTE(uchar addr,uchar data);
int PAGE_WRITE(uchar addr,uchar *buffer);
void delay(uint z)
{
while(z)
z--;
}
void CLOSE_I2C()
{
SSPCON1=0x00;
}
void OPEN_I2C()
{
SSPCON1=0x28; //使能I2C,工作于主控模式
SSPSTATbits.SMP=1; //标准速度模式下禁止变化率控制
SSPADD=0x27; //设置Fscl=100kHz
}
void I2C_START()
{
PIR1bits.SSPIF=0;
SSPCON2bits.SEN=1;
while(!PIR1bits.SSPIF);
}
void I2C_STOP()
{
PIR1bits.SSPIF=0;
SSPCON2bits.PEN=1;
while(!PIR1bits.SSPIF);
}
int SEND_8bits(uchar x)
{
PIR1bits.SSPIF=0;
if(SSPSTATbits.BF==1)
return fail;
while(SSPSTATbits.R);
// if (SSPSTATbits.R=1)
// return fail;
// else
SSPBUF=x;
while(!SSPSTATbits.R);
while(SSPSTATbits.R);
if(SSPCON2bits.ACKSTAT)
return fail;
else
{
SSPCON2bits.ACKSTAT=1;
return success;
}
}
int SEND_ONE_BYTE(uchar addr,uchar data)
{
I2C_START();
if(SEND_8bits(0xa0)!=success)
return fail;
if(SEND_8bits(addr)!=success)
return fail;
if(SEND_8bits(data)!=success)
return fail;
I2C_STOP();
return success;
}
int GET__ONE_BYTE(uchar addr)
{
I2C_START();
if(SEND_8bits(0xa0)!=success)
return fail;
if(SEND_8bits(addr)!=success)
return fail;
I2C_STOP();
I2C_START();
if(SEND_8bits(0xa1)!=success)
return fail;
SSPCON1bits.SSPOV=0;
SSPCON2bits.RCEN=1;
PIR1bits.SSPIF=0;
while(!PIR1bits.SSPIF);
I2C_STOP();
return SSPBUF;
}
int PAGE_WRITE(uchar addr,uchar *buffer)
{
int i;
I2C_START();
if(SEND_8bits(0xa0)!=success)
return fail;
if(SEND_8bits(addr)!=success)
return fail;
for(i=0;i<8;i++)
{
if(SEND_8bits(buffer[i])!=success)
return fail;
}
I2C_STOP();
return success;
}
int READ_N_BYTE(uchar addr,uchar n,uchar *buffer)
{
int i;
I2C_START();
if(SEND_8bits(0xa0)!=success)
return fail;
if(SEND_8bits(addr)!=success)
return fail;
I2C_STOP();
I2C_START();
if(SEND_8bits(0xa1)!=success)
return fail;
for(i=0;i<n;i++)
{
delay(15);
SSPCON2bits.RCEN=1;
PIR1bits.SSPIF=0;
while(!SSPSTATbits.BF);
buffer[i]=SSPBUF;
PIR1bits.SSPIF=0;
if(i!=n-1)
{
SSPCON2bits.ACKEN=1;
while(!PIR1bits.SSPIF);
}
}
I2C_STOP();
return success;
}
void main()
{
uchar a[8],b[8];
int i,temp;
OPEN_I2C();
for(i=0;i<8;i++)
{
a[i]=i+1;
}
SEND_ONE_BYTE(0x10,0xaa);
delay(400);
PAGE_WRITE(0x00,a);
delay(400);
temp=GET__ONE_BYTE(0x10);
delay(200);
READ_N_BYTE(0x00,8,b);
delay(400);
CLOSE_I2C();
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -