📄 iic.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 + -