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

📄 i2c.h

📁 I2C源码
💻 H
字号:

#define DLY1us() NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP()

#define BIT(x)	           (1 << (x))
#define SETBIT(x, y)   	   (x |= y)
#define CLEARBIT(x, y) 	   (x &= ~y)
#define CHECKBIT(x, y) 	   (x & y)

#define BIT7 0x80
#define BIT6 0x40
#define BIT5 0x20
#define BIT4 0x10
#define BIT3 0x08
#define BIT2 0x04
#define BIT1 0x02
#define BIT0 0x01

#define SDA BIT1
#define SCL BIT0

#define I2C_PORT	PORTD
#define I2C_DIR		DDRD
#define I2C_IN		PIND

void Init_I2C(void);
void I2C_Start (void);
void I2C_Stop (void);
void I2C_Clock (void);
unsigned char Test_Ack(void);
void Send_Ack(void);
void Send_NoAck(void);
void Write_I2C_Control (unsigned char Code,unsigned char IsRead);
void Write_I2C_Byte(unsigned char c);
unsigned char Read_I2C_Byte(void);

void Init_I2C(void)
{
	SETBIT(I2C_DIR,SCL);
	SETBIT(I2C_DIR,SDA );
	
	SETBIT(I2C_PORT,SCL);
	SETBIT(I2C_PORT,SDA );
	
	DLY1us();
}

void I2C_Start (void)
{
	SETBIT(I2C_PORT,SCL);
	SETBIT(I2C_PORT,SDA);
	
	DLY1us();
	
	SETBIT(I2C_DIR,SDA);
	CLEARBIT(I2C_PORT,SDA);
}

void I2C_Stop (void)
{
	SETBIT(I2C_DIR,SDA);
	CLEARBIT(I2C_PORT,SDA);
	CLEARBIT(I2C_PORT,SCL);
	
	DLY1us();
	
	SETBIT(I2C_PORT,SCL);
	SETBIT(I2C_PORT,SDA);
}

void I2C_Clock (void)
{
	SETBIT(I2C_PORT,SCL);
	
	DLY1us();
	
	CLEARBIT(I2C_PORT,SCL);
}

void Send_Ack(void)
{
	SETBIT(I2C_DIR,SDA);
	CLEARBIT(I2C_PORT,SDA);
	
	DLY1us();
	
	SETBIT(I2C_PORT,SCL);
	
	DLY1us();
	
	CLEARBIT(I2C_PORT,SCL);
}

void Send_NoAck(void)
{
	SETBIT(I2C_DIR,SDA);
	SETBIT(I2C_PORT,SDA);
	
	DLY1us();
	
	SETBIT(I2C_PORT,SCL);
	
	DLY1us();
	
	CLEARBIT(I2C_PORT,SCL);
}

void Write_I2C_Byte(unsigned char c)
{
	unsigned char i;
	
	SETBIT(I2C_DIR,SDA);
	CLEARBIT(I2C_PORT,SCL);
	
	DLY1us();
	
	for (i = 0; i < 8; i++)
	{
			if((c & 0x80) == 0x80) SETBIT(I2C_PORT, SDA);
			else CLEARBIT(I2C_PORT,SDA);
			
			SETBIT(I2C_PORT,SCL);
			
			c = c << 1;
			DLY1us();
			
			CLEARBIT(I2C_PORT,SCL);
	}
	while(Test_Ack()) WDR();	
}

unsigned char Read_I2C_Byte(void)
{
	unsigned char i,buff = 0;
	
	for (i = 0; i < 8; i++)
	{
			buff = buff << 1;
			
			CLEARBIT(I2C_DIR,SDA);
			
			SETBIT(I2C_PORT,SCL);
			
			if ( CHECKBIT( I2C_IN,SDA ) ) buff = buff | 0x01;
			DLY1us();
			
			CLEARBIT(I2C_PORT,SCL);
	}
	I2C_Clock();
	return buff;
}

unsigned char Test_Ack(void)
{
	unsigned char Ackn = 0;
	
	CLEARBIT(I2C_PORT,SCL);
	CLEARBIT(I2C_DIR,SDA);
	
	DLY1us();
	
	SETBIT(I2C_PORT,SCL);
	
	if ( CHECKBIT( I2C_IN,SDA ) ) Ackn = 1;
	
	DLY1us();
	
	CLEARBIT(I2C_PORT,SCL);
	
	return Ackn;
}	

void Write_I2C_Control(unsigned char Code,unsigned char IsRead)
{
	CLEARBIT(I2C_PORT,SCL);
	
	if( (Code & 0x80) == 0x80) SETBIT(I2C_PORT, SDA);
	else CLEARBIT(I2C_PORT,SDA);
	I2C_Clock();
	
	if( (Code & 0x40) == 0x40) SETBIT(I2C_PORT, SDA);
	else CLEARBIT(I2C_PORT,SDA);
	I2C_Clock();
	
	if( (Code & 0x20) == 0x20) SETBIT(I2C_PORT, SDA);
	else CLEARBIT(I2C_PORT,SDA);
	I2C_Clock();
	
	if( (Code & 0x10) == 0x10) SETBIT(I2C_PORT, SDA);
	else CLEARBIT(I2C_PORT,SDA);
	I2C_Clock();
	
	if( (Code & 0x08) == 0x08) SETBIT(I2C_PORT, SDA);
	else CLEARBIT(I2C_PORT,SDA);
	I2C_Clock();
	
	if( (Code & 0x04) == 0x04) SETBIT(I2C_PORT, SDA);
	else CLEARBIT(I2C_PORT,SDA);
	I2C_Clock();
	
	if( (Code & 0x02) == 0x02) SETBIT(I2C_PORT, SDA);
	else CLEARBIT(I2C_PORT,SDA);
	I2C_Clock();
	
	if(IsRead) SETBIT(I2C_PORT,SDA);
	else CLEARBIT(I2C_PORT,SDA);
	I2C_Clock();
	
	while(Test_Ack()) WDR();
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -