⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2ctest2.c

📁 利用单片机I2C资源口(SCL、SDA)写的I2C读写程序
💻 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 + -