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

📄 i2c.c

📁 用AVR控制旭光高频头JS-6B1/111程序.
💻 C
字号:
#include "..\inc\main.h"

BYTE ack=0;

//函数声明
void delay_us(BYTE count);
void Start_I2C(void);
void Stop_I2C(void);
void Ack_I2C(BYTE a);
void SendByte(BYTE c);
BYTE ReceiveByte(void);

void delay_us(BYTE count)
{
	BYTE i;
	for(i=0;i<count;i++)
	{
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
	}
}

void Start_I2C(void)
{
	I2C_DDR=(1<<SDA)|(1<<SCL);		/*SDA端口定义为输出*/
	SDA_H;							/*发送起始条件的数据信号*/
	delay_us(1);
	SCL_H;
	delay_us(5);					/*起始条件建立时间大于4.7us,延时*/
	SDA_L;							/*发送起始信号*/
	delay_us(4);					/*起始条件锁定时间大于4μs*/
	SCL_L;							/*钳住I2C总线,准备发送或接收数据 */
	delay_us(2);
}

void Stop_I2C(void)
{
	I2C_DDR=(1<<SDA)|(1<<SCL);		/*SDA端口定义为输出*/
	SDA_L;							/*发送结束条件的数据信号*/
	delay_us(1);
	SCL_H;							/*结束条件建立时间大于4us*/
	delay_us(5);
	SDA_H;							/*发送I2C总线结束信号*/
	delay_us(4);
	I2C_DDR=~((1<<SDA)|(1<<SCL));
	SDA_H;
	SCL_H;	
}

void Ack_I2C(BYTE a)
{
	I2C_DDR=(1<<SDA)|(1<<SCL);		/*SDA端口定义为输出*/
	if(a==0)						/*在此发出应答或非应答信号 */
	{
		SDA_L;
	}
	else
	{
		SDA_H;
	}
	delay_us(4);					
	SCL_H;
	delay_us(4);					/*时钟低电平周期大于4μs*/
	SCL_L;							/*清时钟线,钳住I2C总线以便继续接收*/
	delay_us(2);
}	

void SendByte(BYTE c)
{
	BYTE BitCnt;
	I2C_DDR=(1<<SDA)|(1<<SCL);		/*SDA SCL端口均定义为输出*/
	for(BitCnt=0;BitCnt<8;BitCnt++)	/*要传送的数据长度为8位*/
	{
		if((c<<BitCnt)&0x08)		/*判断发送位*/
		{
			SDA_H;
		}
		else
		{
			SDA_L;
		}
		delay_us(1);
		SCL_H;						/*置时钟线为高,通知被控器开始接收数据位*/
		delay_us(5);				/*保证时钟高电平周期大于4μs*/
		SCL_L;
	}
	delay_us(2);
	I2C_DDR=~(1<<SDA);				/*SDA定义为输入,置数据线为输入方式*/
	SDA_H;							/*8位发送完后释放数据线,准备接收应答位,打开内部上拉*/
	delay_us(2);
	SCL_H;
	delay_us(3);
	if(ACK_FAIL)					/*判断是否接收到应答信号*/
	{
		ack=0;
	}
	else
	{
		ack=1;
	}
	SCL_L;
	delay_us(2);
}

BYTE ReceiveByte(void)
{
	BYTE retc;
	BYTE BitCnt;
	retc=0;
	I2C_DDR=~(1<<SDA);
	SDA_H;							/*SDA定义为输入,置数据线为输入方式*/		
	for(BitCnt=0;BitCnt<8;BitCnt++)
	{
		delay_us(1);
		SCL_L;						/*置时钟线位低,准备接收数据位*/
		delay_us(5);				/*时钟低电平周期大于4.7μs*/
		SCL_H;						/*置时钟线为高,使数据线上数据有效*/
		delay_us(2);
		retc<<=1;
		if(SDA_HIGH)
		{
			retc+=1;				/*读数据位,接收的数据位放入retc中*/
		}
		delay_us(2);
	}
	SCL_L;
	delay_us(2);
	return retc;
}

⌨️ 快捷键说明

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