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

📄 iic.c

📁 本代码以低成本的瑞萨单片机为主控制器
💻 C
字号:
#define	  IIC_GLOBALS

#include "sfr_r81b.h"
#include "Iic.h"

#define		EE_Addr_2Bytes		0

#define		IIC_SDA_Out		(pd3_7=1)
#define		IIC_SDA_Input	(pd3_7=0)
#define		IIC_SDA			p3_7
#define		IIC_SDA_High	(p3_7=1)
#define		IIC_SDA_Low		(p3_7=0)

#define		IIC_SCL_Out		(pd3_5=1)
#define		IIC_SCL_Input	(pd3_5=0)

#define		IIC_SCL_High	(p3_5=1)//p3_5=1
#define		IIC_SCL_Low		(p3_5=0)//p3_5=0


uchar TEST1[16] ;
uchar TEST2[16] ;

/*********************/
//函 数 名:void IIC_Start(void); 
//功    能:启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变; 
//入口参数:
//中间变量:
//出口参数:
//创建时间:
//修改时间:
//修改记录:

/********************/

void iic_data_init(void);
void Write_eeprom_function(uchar block_add,uchar *write_data_array , uchar write_long ,uint write_address_start );
void data_add(uchar *add_start,uchar data_long);

void IIC_Start(void) 
{ 
	IIC_SDA_High;
	IIC_SCL_Out ;
	IIC_SDA_Out ;
	nop();nop();
	IIC_SDA_High;
	Delay_iic2p5us();//  //2.5us
	IIC_SCL_High;
	Delay_iic2p5us();
	Delay_iic2p5us();
	IIC_SDA_Low ;
	Delay_iic2p5us();
	Delay_iic2p5us();
	IIC_SCL_Low;
	Delay_iic2p5us();

}

/*********************/
//函 数 名:void IIC_Stop(void); 
//功    能:终止I2C总线,当SCL为高电平时使SDA产生一个正跳变; 
//入口参数:
//中间变量:
//出口参数:
//创建时间:
//修改时间:
//修改记录:
/********************/
void IIC_Stop(void) 
{ 
	//P3DDR_Temp.Byte=0;
	IIC_SCL_Out ;
	IIC_SDA_Out ;
	nop();nop();
	IIC_SCL_Low; 
	nop();nop();
	IIC_SDA_Low ;
	Delay_iic2p5us();
	IIC_SCL_High ;
	Delay_iic2p5us();
	Delay_iic2p5us();
	IIC_SDA_High ;
	nop();nop();nop();nop();nop();

}
/*********************/
//函 数 名:void IIC_AckWr(void) ;
//功    能:发送0,在SCL为高电平时使SDA信号为低 
//入口参数:none ;
//中间变量:none ;
//出口参数:none ;
//创建时间:
//修改时间:
//修改记录:
/********************/
void IIC_AckWr(void)
{
	IIC_SCL_Out ;
	IIC_SDA_Out ;
	nop();nop();
	IIC_SCL_High ;	
	Delay_iic2p5us();
	IIC_SCL_Low ;
	IIC_SDA_Low ;
	Delay_iic2p5us();
	IIC_SCL_Out ;
	IIC_SDA_Out ;
}
/*********************/
//函 数 名:void IIC_AckRd( void )
//功    能:eeprom读应答 ; 
//入口参数:none ;
//中间变量:none ;
//出口参数:none ;
//创建时间:
//修改时间:
//修改记录:
/********************/
void IIC_AckRd( void )
{
	IIC_SCL_Out ;
	IIC_SDA_Out ;
	nop();nop();
	IIC_SDA_Low ;
	nop();nop();
	IIC_SCL_High ;	
	Delay_iic2p5us();
	Delay_iic2p5us();
	IIC_SCL_Low ;
	nop();nop();nop();
	IIC_SCL_Out ;
	IIC_SDA_Input ;
	nop();nop();nop();

}
/*********************/
//函 数 名:void Eepr_NoAck(void)
//功    能:
//入口参数:
//中间变量:
//出口参数:
//创建时间:
//修改时间:
//修改记录:
/********************/
void IIC_NoAck(void)
{
	IIC_SCL_Out ;
	IIC_SDA_Out ;
	nop();nop();
	IIC_SDA_High;
	nop();nop();
	IIC_SCL_High;	
	Delay_iic2p5us();
	Delay_iic2p5us();
	IIC_SCL_Low;
	nop();nop();nop();

}
/*********************/
//函 数 名:uchar IIC_Rd1Byte( void ) ;
//功    能:从eeprom读取一字节数据 ;
//入口参数:none ;
//中间变量:
//出口参数:LUB_data.BYTE ;
//创建时间:
//修改时间:
//修改记录:
/********************/

uchar IIC_Rd1Byte( void )
{
	union Union_ByteDef LUB_data ;
	uchar i ;
	IIC_SCL_Out ;
	IIC_SDA_Input ;
	LUB_data.Byte = 0 ;
	for( i = 0 ; i != 8 ; i++ )
		{
		IIC_SCL_High ;
		Delay_iic2p5us();
		LUB_data.BIT.b0 = IIC_SDA ;
		IIC_SCL_Low ;					
		if( i == 7 )
			{
			IIC_SDA_Low ;
			return LUB_data.Byte ;
			}	
		LUB_data.Byte <<= 1 ;
		Delay_iic2p5us();
		}
}

/*********************/
//函 数 名:
//功    能:
//入口参数:
//中间变量:
//出口参数:
//创建时间:
//修改时间:
//修改记录:
/********************/
void IIC_Wr1Byte( uchar PB_data )
{
	uchar i ;
	union Union_ByteDef LUB_data ;
	IIC_SCL_Out ;
	IIC_SDA_Out ;
	LUB_data.Byte = PB_data ;
	for( i = 0 ; i != 8 ; i++ )
		{
		IIC_SDA = LUB_data.BIT.b7 ;
		Delay_iic2p5us();
		IIC_SCL_High ;		
		LUB_data.Byte <<= 1 ;
		Delay_iic2p5us();
		IIC_SCL_Low ;
		nop();nop();nop();
		}
	IIC_SDA_Low ;
	IIC_AckWr() ;
}

/*********************/
//函 数 名:
//功    能:
//入口参数:
//中间变量:
//出口参数:
//创建时间:
//修改时间:
//修改记录:
/********************/

void Write_EeprData(uchar SlaveWrAddr,uchar *PP_DataAddr,uchar PB_Num ,uint EeprAddr)
{

	uchar i ;	
	IIC_SCL_High;
	IIC_Start() ;
	IIC_Wr1Byte(SlaveWrAddr) ;
	if(EE_Addr_2Bytes)
		{
		i = ( EeprAddr >> 8 ) ;
		IIC_Wr1Byte( i ) ;
		nop();
		}
	i = (uchar)( EeprAddr ) ;
	IIC_Wr1Byte( i ) ;
	for( i = 0 ; i != PB_Num ; i++ )
		{
		IIC_Wr1Byte( *( PP_DataAddr + i ) ) ;
		nop();
		}	
	IIC_Stop()  ;
	Delay_XMS( 5 ) ;
}

void Read_EeprData(uchar SlaveRdAddr,uchar *PP_DataAddr , uchar PB_Num , uint PB_EeprAddr,uchar PB_Cmp )
{
	uchar i ;
	IIC_SCL_High;
	IIC_Start() ;
	IIC_Wr1Byte( SlaveRdAddr&0xFE ) ;
	if(EE_Addr_2Bytes)
		{
		i = ( PB_EeprAddr >> 8 ) ;
		IIC_Wr1Byte( i ) ;
		}
	i = (uchar)( PB_EeprAddr ) ;
	IIC_Wr1Byte( i ) ;

	IIC_Start() ;
	IIC_Wr1Byte( SlaveRdAddr ) ;

	for(i=0;i!=PB_Num;i++)
		{
		if(PB_Cmp)
			{
			if(*(PP_DataAddr+i)!=IIC_Rd1Byte())
				{
				IIC_NoAck() ;
				IIC_Stop();
//				return 1;
				}
			}
		else *(PP_DataAddr+i)=IIC_Rd1Byte();
		if(i==(PB_Num-1))
			{
			IIC_NoAck() ;
			}
		else
			{
			IIC_AckRd();			
			}
		}
	IIC_Stop();
//	return 0;
}

void Delay_iic2p5us(void)
{
	nop();nop();nop();nop();nop();
	nop();nop();nop();

}

void Delay_XMS(uchar PB_delay)
{
	uchar i,j;
	for(i=PB_delay;i!=0;i--)
		{
		for(j=0;j<255;j++)
			{	
			nop();nop();nop();nop();nop();
			nop();nop();nop();nop();nop();
			nop();nop();nop();nop();nop();
			nop();nop();nop();nop();nop();
			nop();nop();nop();nop();nop();
			nop();nop();nop();nop();nop();
			nop();nop();nop();nop();nop();			
			}
		}
}

void Write_eeprom_function(uchar block_add,uchar *write_data_array , uchar write_long ,uint write_address_start )
{
	uchar i ,j ;
	uchar write_long_temp ; 
	uint write_address_start_temp ;
	uchar *p ;
/**********************************************/
/*	uchar *check_p ;
	uchar check_data ; 
	check_data = 0x00 ;
	check_p = write_data_array ;
	for(i=0;i<write_long ;i++)
	{
		check_data = check_data + *(check_p + i) ;
	}
	*(check_p+write_long) = check_data ;*/
/*********************************************/
	reset_wdt();
	write_long_temp = write_long ; 
	write_address_start_temp = write_address_start ; 
	p = write_data_array ;
	i = 16 - write_address_start%16 ;
	j = write_long_temp/16 ;
	if(write_long<=i)
	{
		Write_EeprData(block_add,write_data_array,write_long,write_address_start);
	}
	else
	{
		Write_EeprData(block_add,write_data_array,i,write_address_start);
		Delay_XMS( 20 ) ;
		write_long_temp = write_long_temp - i ; 
		write_address_start_temp = write_address_start_temp + i ;
		p = p + i ;
		while(write_long_temp/16)
		{
			Write_EeprData(block_add,p,16,write_address_start_temp);	
			Delay_XMS( 20 ) ;
			p = p +16 ;
			//write_data_array = write_data_array + 16 ;
			write_long_temp = write_long_temp - 16 ; 
			write_address_start_temp = write_address_start_temp + 16 ; 
		}
		Write_EeprData(block_add,p,write_long_temp,write_address_start_temp);		
		Delay_XMS( 20 ) ;
	}
}
void iic_data_init(void)
{
	uchar array_eeprom_init[20] ; 
	uchar i ,j;

	for(i=0;i<20;i++){array_eeprom_init[i] = 0x00;}

//			array_eeprom_init[0] = 0x01 ; 
//			array_eeprom_init[1] = 0x01 ; 

/*			Write_eeprom_function(0xa0,array_eeprom_init, 5 ,fu_now_power) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 5 ,fu_now_power) ;

			for(i=0;i<9;i++){array_eeprom_init[i] = 0xaa ;}	
			data_add(array_eeprom_init,9);
			Write_eeprom_function(0xa0,array_eeprom_init,10 ,0x00) ;	
			Write_eeprom_function(0xa2,array_eeprom_init,10 ,0x00);
			for(i=0;i<20;i++){array_eeprom_init[i] = 0x00;}

//			Read_EeprData(0xA3,array_eeprom_init,10,0x00,0 );

			for(i=0;i<20;i++){array_eeprom_init[i] = 0x00 ;}	
			data_add(array_eeprom_init,4) ;
			Write_eeprom_function(0xa0,array_eeprom_init, 5 ,now_total_power) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 5 ,now_total_power) ;	

//	for(i=0;i<20;i++){array_eeprom_init[i] = 0x00 ;}	
//	Read_EeprData(0xA1,array_eeprom_init,5,now_total_power,0 );

			Write_eeprom_function(0xa0,array_eeprom_init, 4 ,meter_constant ) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 4 ,meter_constant ) ;	
			for(i=0;i<6;i++){array_eeprom_init[i] = 0x05 ; }
			data_add(array_eeprom_init,6) ;
			Write_eeprom_function(0xa0,array_eeprom_init,7,meter_number) ;
			Write_eeprom_function(0xa2,array_eeprom_init,7,meter_number) ;
			for(i=0;i<6;i++){array_eeprom_init[i] = 0x00; }
			Read_EeprData(0xa1,array_eeprom_init,6,meter_number,0 );		


//	for(i=0;i<6;i++){array_eeprom_init[i] = 0x00 ; }
//	Read_EeprData(0xa1,array_eeprom_init,7,meter_number,0) ;

			data_add(array_eeprom_init,3) ;
			Write_eeprom_function(0xa0,array_eeprom_init, 3 ,save_pulse) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 3 ,save_pulse) ;	
			for(i=0;i<6;i++){array_eeprom_init[i] = i; }
			data_add(array_eeprom_init,4) ;	
			Write_eeprom_function(0xa0,array_eeprom_init, 5 ,password) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 5 ,password) ;	
			for(i=0;i<6;i++){array_eeprom_init[i] = 0; }
			Read_EeprData(0xA1,array_eeprom_init,5,password,0 );*/

	Read_EeprData(0xA1,array_eeprom_init,10,0x00,0 );
	j = 0 ;
	for(i=0;i<9;i++)
	{
		j = j + array_eeprom_init[i];
	}
	if(j == array_eeprom_init[9])
	{
		return ; 
	}
	else
	{
		j = 0 ; 
		Read_EeprData(0xA3,array_eeprom_init,10,0x00,0 );
		for(i=0;i<9;i++)
		{
			j = j + array_eeprom_init[i];
		}
		if(j == array_eeprom_init[9])
		{
			return;
		}
		else
		{
			for(i=0;i<9;i++){array_eeprom_init[i] = 0xaa ;}	
			data_add(array_eeprom_init,9);
			Write_eeprom_function(0xa0,array_eeprom_init,10 ,0x00) ;	
			Write_eeprom_function(0xa2,array_eeprom_init,10 ,0x00);
			for(i=0;i<20;i++){array_eeprom_init[i] = 0x00 ;}	
			Write_eeprom_function(0xa0,array_eeprom_init, 20 ,now_total_power) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 20 ,now_total_power) ;	
			Write_eeprom_function(0xa0,array_eeprom_init, 20 ,now_total_power+20) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 20 ,now_total_power+20) ;	
			Write_eeprom_function(0xa0,array_eeprom_init, 20 ,now_total_power+40) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 20 ,now_total_power+40) ;	
			Write_eeprom_function(0xa0,array_eeprom_init, 20 ,now_total_power+60) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 20 ,now_total_power+60) ;
			Write_eeprom_function(0xa0,array_eeprom_init, 20 ,now_total_power+80) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 20 ,now_total_power+80) ;	


//	for(i=0;i<20;i++){array_eeprom_init[i] = 0x00 ;}	
//	Read_EeprData(0xA1,array_eeprom_init,5,now_total_power,0 );

/*			array_eeprom_init[0] = 0x00 ;array_eeprom_init[1] = 0x00 ;
			data_add(array_eeprom_init,2) ;
			Write_eeprom_function(0xa0,array_eeprom_init, 3 ,nnnn ) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 3 ,nnnn ) ;
			data_add(array_eeprom_init,1) ;
			Write_eeprom_function(0xa0,array_eeprom_init, 2 ,nn) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 2 ,nn) ;	
			array_eeprom_init[1] = 0x00 ;array_eeprom_init[2] = 0x00 ;array_eeprom_init[3] = 0x00 ;
			data_add(array_eeprom_init,3) ;
			Write_eeprom_function(0xa0,array_eeprom_init, 4 ,meter_constant ) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 4 ,meter_constant ) ;	
			for(i=0;i<6;i++){array_eeprom_init[i] = 0x03 ; }
			data_add(array_eeprom_init,6) ;
			Write_eeprom_function(0xa0,array_eeprom_init,7,meter_number) ;
			Write_eeprom_function(0xa2,array_eeprom_init,7,meter_number) ;

//	for(i=0;i<6;i++){array_eeprom_init[i] = 0x00 ; }
//	Read_EeprData(0xa1,array_eeprom_init,7,meter_number,0) ;

			for(i=0;i<20;i++){array_eeprom_init[i] = 0x00 ; }
			data_add(array_eeprom_init,4) ;
			Write_eeprom_function(0xa0,array_eeprom_init, 5 ,kwh) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 5 ,kwh) ;	

			for(i=0;i<20;i++){array_eeprom_init[i] = 0x00 ; }
			data_add(array_eeprom_init,4) ;
			Write_eeprom_function(0xa0,array_eeprom_init, 5 ,fu_now_power) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 5 ,fu_now_power) ;
				
			for(i=0;i<20;i++){array_eeprom_init[i] = 0x00 ; }
			data_add(array_eeprom_init,1) ;
			Write_eeprom_function(0xa0,array_eeprom_init, 2 ,jdq_save) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 2 ,jdq_save) ;	

			data_add(array_eeprom_init,3) ;
			Write_eeprom_function(0xa0,array_eeprom_init, 3 ,save_pulse) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 3 ,save_pulse) ;	

			data_add(array_eeprom_init,6) ;
			Write_eeprom_function(0xa0,array_eeprom_init, 7 ,guandong) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 7 ,guandong) ;	
			data_add(array_eeprom_init,4) ;	
			Write_eeprom_function(0xa0,array_eeprom_init, 5 ,password) ;
			Write_eeprom_function(0xa2,array_eeprom_init, 5 ,password) ;*/	
			}
	}

}

void data_add(uchar *add_start,uchar data_long)
{
	uchar i ; 
	uchar data_add_temp ;
	data_add_temp = 0x00 ; 
	for(i=0;i<data_long ;i++)
	{
		data_add_temp = data_add_temp + *(add_start + i); 
	}
	*(add_start + data_long) = data_add_temp ; 
}

⌨️ 快捷键说明

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