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

📄 t103_i2c.c

📁 MCU为:ATMGEA128
💻 C
字号:
//#####################---文件信息-----############################ 
//文   件   名   :   i2c.c 
//创   建   人   :    
//建  立 时 间   :   2006-9-4 
//版  本 描 述   :    
//功  能 描 述   :   AVR i2c 读写程序,封装I2C接口函数
//备      注	 :   调试环境为iccavr,MCU为Mega128 晶振为8mhz 
//最后修改时间   :   2006-8-11 
//################################################################## 
#include "include.h"

//** 需要根据硬件连线改动的几个语句 
#define SDA			 	1
#define SCL          			2		
#define I2C_DDR		 DDRF 
#define I2C_PORT	 PORTF  
#define Set_SDA      PORTF=PORTF|(1<<SDA)
#define Cls_SDA      PORTF=PORTF&~(1<<SDA)
#define Set_SCL      PORTF=PORTF|(1<<SCL)
#define Cls_SCL      PORTF=PORTF&~(1<<SCL)
#define SDA_High     PINF&(1<<SDA)
//function declaration

#define I2C_Delay	
void I2C_Error(void);
void I2C_Start(void);
void I2C_Stop(void);
void I2C_Write(unsigned char wb);
unsigned char I2C_Read(unsigned char bEnd);
void t103_write(unsigned char address,unsigned char reg_address,unsigned char data);
unsigned char t103_read(unsigned char address,unsigned char reg_address);
void t103_write2(unsigned char address,unsigned char reg_address,unsigned char data1,unsigned char data2);


void t103_write2(unsigned char address,unsigned char reg_address,unsigned char data1,unsigned char data2)
{
	I2C_Start();
	I2C_Write(address);
	I2C_Write(reg_address);
	I2C_Write(data1);
	I2C_Write(data2);	
	I2C_Stop();
}
//***************************************************************** 
//函   数   名   :   t101_write/t101_read   
//建 立 时  间   :   2006-8-11 
//功 能 描  述   :   
//备        注   :   没有返回值 
//最后修改时间   :   2006-8-11
//*****************************************************************
void t103_write(unsigned char address,unsigned char reg_address,unsigned char data){
	I2C_Start();
	I2C_Write(address);
	I2C_Write(reg_address);
	I2C_Write(data);
	I2C_Stop();
}
unsigned char t103_read(unsigned char address,unsigned char reg_address){
	unsigned char temp;
	I2C_Start();
	I2C_Write(address);
	I2C_Write(reg_address);			
	I2C_Stop(); 
	I2C_Start();
	I2C_Write(address|1);//
	temp=I2C_Read(1);			
	I2C_Stop();
	return temp;					
}

//***************************************************************** 
//函   数   名   :   I2C_Error    
//建 立 时  间   :   2006-8-11 
//功 能 描  述   :   
//备        注   :   没有返回值 
//最后修改时间   :   2006-8-11
//***************************************************************** 
void I2C_Error(void)
{
  LED2_ON;
  return;//no instruction
}

//***************************************************************** 
//函   数   名   :   I2C_Delay    
//建 立 时  间   :   2006-8-11 
//功 能 描  述   :   I2C延时程序,T101的SCL频率可达到1MHZ
//备        注   :   没有返回值 
//最后修改时间   :   2006-8-11
//***************************************************************** 
/*void I2C_Delay(void)
{
 	// unsigned int i;
     //for( i=0; i<2; i++ );
	//	 asm("nop");
	 
}*/
//***************************************************************** 
//函   数   名   :   I2C_Start    
//建 立 时  间   :   2006-8-11 
//功 能 描  述   :   
//备        注   :   没有返回值 
//最后修改时间   :   2006-8-11
//***************************************************************** 
void I2C_Start(void)
{
	 I2C_DDR|=(1<<SDA);
	 I2C_DDR|=(1<<SCL);
     Set_SDA;
     I2C_Delay;
     Set_SCL;
     I2C_Delay;
     Cls_SDA;
     I2C_Delay;
     Cls_SCL;
     I2C_Delay;         
}
//***************************************************************** 
//函   数   名   :   I2C_Stop    
//建 立 时  间   :   2006-8-11 
//功 能 描  述   :   
//备        注   :   没有返回值 
//最后修改时间   :   2006-8-11
//***************************************************************** 
void I2C_Stop(void)
{             
	 I2C_DDR|=(1<<SDA);
	 I2C_DDR|=(1<<SCL);
     Set_SCL;
     I2C_Delay;
     Set_SDA;
     I2C_Delay;
     Set_SCL;
     I2C_Delay;
}

//***************************************************************** 
//函   数   名   :   I2C_Write    
//建 立 时  间   :   2006-8-11 
//功 能 描  述   :   
//备        注   :   没有返回值 
//最后修改时间   :   2006-8-11
//***************************************************************** 
void I2C_Write(unsigned char dat)
{
     unsigned char acktime,i;
	 unsigned char wb;
	 wb=dat;
     for(i=0;i<8;i++)
     {
         if( wb&0x80 ) Set_SDA;
         else          Cls_SDA;
         wb=wb<<1;		 
         I2C_Delay;
         Set_SCL;
         I2C_Delay;
         Cls_SCL;
         I2C_Delay;
     }
	 //**应答处理**
	 Set_SDA;
	 I2C_DDR&=~(1<<SDA);//in
	 I2C_Delay;
     Set_SCL;
	 //等待应答
	 for(acktime=0;acktime<100;acktime++){
	      if( SDA_High )
		  {
		  I2C_Delay;	
		  }
		  else
		  {
		  break;  
		  }	 
		  if(acktime==100)I2C_Error();
	 }	 
	 Cls_SCL;
	 I2C_Delay;	
	 //**应答处理退出**
	 Cls_SDA;
	 I2C_DDR|=(1<<SDA);//out	 
}

//***************************************************************** 
//函   数   名   :   I2C_Read    
//建 立 时  间   :   2006-8-11 
//功 能 描  述   :   
//备        注   :   返回1字节数据。
//最后修改时间   :   2006-8-11
//***************************************************************** 
unsigned char I2C_Read(unsigned char bEnd)
{
    register unsigned char i,mb;
    mb=0;
	Set_SDA;
	I2C_DDR&=~(1<<SDA);//sda in
	I2C_Delay;
	for(i=0;i<8;i++)
    {
       I2C_Delay;
       mb=mb<<1;
       Set_SCL;
       I2C_Delay;
       if( SDA_High ) mb|=(1<<0);
	   else mb&=~(1<<0);                
       Cls_SCL;
    }
	I2C_DDR|=(1<<SDA);// sda out
	I2C_Delay;
    if( bEnd )      Set_SDA;
    else            Cls_SDA;
    I2C_Delay;
    Set_SCL;
    I2C_Delay;
    Cls_SCL;	
    I2C_Delay;
    return mb;
}


⌨️ 快捷键说明

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