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

📄 bus_driver.c

📁 电能表源码
💻 C
字号:
/*************************************************************************************

	文件类型:利用不同总线读写数据
	文件作用:
	修改权限:
	文件相关:
	
	创 建 人:chenbo
	创建日期:2007.06.21
	当前版本:Ver0.1
	
	版本信息:Ver0.1					GeminiKQ

**************************************************************************************/
#include "Tiger.h"

extern unsigned char read_byte(a,addr);
extern unsigned char write_byte(unsigned char a,unsigned char addr,unsigned char *addrpoint);

//=====================================================================
//函数功能:从ram和eep中回复数据
// 入口:存放类型 ,  个数
//备注:1:读操作成功,0:失败
//=====================================================================
unsigned char Read_data(unsigned char type,unsigned char num)
{ unsigned char value,i,slaveaddr;
  if(num!=0)
 	{ switch(type)
  	      { case  RAM :                                       //从RAM中读取数据
		          value=1;
                  for(i=0;i<num;i++)
  	                 { if(data_addr.word[1]<200)
  	                        wr_buff[i]=ram[data_addr.word[1]];
  	                   data_addr.word[1]=data_addr.word[1]+1;
                     }
  	              break;
		 
  	       case FLASH: 
                  for(i=0;i<num;i++)
              	     { wr_buff[i]=IAP_FLASH_ByteRead(data_addr.word[1]);
					   data_addr.word[1]++;
					 }
                  break;
 
  	       case EEPROM:     
                  #if(Type_EEP==E24C04)                       //根据芯片类型,定义从地址
				      if(data_addr.byte[2]!=0)
                         slaveaddr=0xa0|0x20;
				      else
					     slaveaddr=0xa0;
                  #else
                      slaveaddr=0xa0;
				  #endif
                  value=0;
  	              for(i=0;i<3;i++)
  	  	             { if(1==read_byte(num,slaveaddr))
  	                      { value=1;
  	                         i=3;
  	                      }
  	                   else 
                          delay_1ms();
  	                 }
                  
  	  	          break;
  	 
       	} 

   }
  return value;
}
  

//=====================================================================
//函数功能:通过ID号读取数据
//入口参数:ID号
//出口参数:数据放在wr-buff中,返回数据个数
//===================================================================
unsigned char Read_datafromID(unsigned int dataIDnum)
{ unsigned char i,j,sumdata,value,num;
  value=0;
  num=addr_from_coreID(1,dataIDnum);
  for(j=0;j<num;j++)
     { data_addr.word[1]=(*ID_coretalbpoint[j]).dataaddr;
       Read_data((*ID_coretalbpoint[j]).stortype,(*ID_coretalbpoint[j]).datalong);
       sumdata=0;
       if(((*ID_coretalbpoint[j]).datatype==BCDSUM)||((*ID_coretalbpoint[j]).datatype==HEXSUM))  //如果带校验和
           { for(i=0;i<(*ID_coretalbpoint[j]).datalong-1;i++)
                 sumdata+=wr_buff[i];
             if(wr_buff[(*ID_coretalbpoint[j]).datalong-1]==sumdata+0x33)
                 { if((*ID_coretalbpoint[j]).datatype==BCDSUM)
                      {if(1==check_X_bcd((*ID_coretalbpoint[j]).datalong-1,wr_buff))       //BCD码检测
                          { value=(*ID_coretalbpoint[j]).datalong-1;
						    break;
						  }
                      }
                   else
                      { value=(*ID_coretalbpoint[j]).datalong-1; 
                        break;
					  }
                 }
           } 
       else if((*ID_coretalbpoint[j]).datatype==BCDSUM)
           { if(1==check_X_bcd((*ID_coretalbpoint[j]).datalong,wr_buff))       //BCD码检测
               { value=(*ID_coretalbpoint[j]).datalong;
			     break;
               } 
           }
       else
            { value=(*ID_coretalbpoint[j]).datalong;
              break;
            }
     }
  return value;
}



//==================================================================
//函数功能:根据芯片型号,返回页长度
//返回参数:页长度
// 
//==================================================================
unsigned char count_pagglen(void)
{ unsigned char pagelen;
  if(Type_EEP==E24C128||Type_EEP==E24C256)     //根据芯片类型,定义页长度
      pagelen=64;
  else if(Type_EEP==E24C04)
      pagelen=16;
  else if(Type_EEP==E24C01||Type_EEP==E24C02)
      pagelen=8; 
  return pagelen;
}

//====================================================================
//函数功能:根据芯片类型,选择命令方式
//  从地址:1010 0000    0xa0
//====================================================================
unsigned char choosecommand(void)
{ unsigned char slaveaddr;
  #if(Type_EEP==E24C04)                       //根据芯片类型,定义从地址
      if(data_addr.byte[2]!=0)
           slaveaddr=0xa0|0x20;
      else
           slaveaddr=0xa0;
  #else
      slaveaddr=0xa0;
  #endif
  return slaveaddr;
}
//==================================================================
//函数功能:写数据操作
//入口参数:要写的数据放在wr-buff中,地址放在data_addr.word[1],type表示类型,num:长度
//==================================================================
unsigned char Write_data(unsigned char type,unsigned char num)
{ unsigned char d1,d2,value,len,pagelen,slaveaddr;
  unsigned int address;
  value=0;
  if(num!=0)
    { switch(type)
  	     { case RAM:
                 value=1;// xiang zhi
  	              for(d1=0;d1<num;d1++)
  	                  { if(data_addr.word[1]<200)
  	                         ram[data_addr.word[1]]=wr_buff[d1];
  	                    data_addr.word[1]=data_addr.word[1]+1;
                      }
  	              break;
	  	   case FLASH: 
                  if(data_addr.word[1]>=0x6e00)
                     { Ready_progamflash();                  // 准备开始写flash
                       for(d1=0;d1<num;d1++)
                          { IAP_FLASH_ByteWrite(data_addr.word[1],wr_buff[d1]);   //写一个字节的flash
                            data_addr.word[1]++;
                          }
                       End_progamflash();                    // 写flash完毕
                     }
                  else
                     value=1;                                 // 出错
 	              break;
	       case  EEPROM:
                  pagelen=count_pagglen();                    // 根据芯片类型,定义页长度
                  address=data_addr.word[1];
				  len=pagelen-address%pagelen;				  // 确定地址
				  if(num<len)                                 // 不夸页
				      d2=num;
				  else
				      d2=len;
   	  	          value=0;
				  slaveaddr=choosecommand();                 // 根据芯片类型,定义从地址 0xa0 
 	  	          for(d1=0;d1<3;d1++)						 // 写三次
  	  	               { if(1==write_byte(d2,slaveaddr,wr_buff))
  	  	            	    { value=1;
  	  	                      d1=3;
                            }
  	  	                 else
                            delay_10ms();
                       } 

  	  	          if((value==1)&&(num>len))                    // 如果存贮正确且还未存完        
                     {  value=0;
					    num=num-len;                           
						slaveaddr=choosecommand();              // 根据芯片类型,定义从地址
						for(d2=0;d2<num/pagelen;d2++)           // 整页存贮
      				       { data_addr.word[1]=address+len+pagelen*d2;
                             for(d1=0;d1<3;d1++)
  	  	             	       { if(1==write_byte(pagelen,slaveaddr,&wr_buff[len+pagelen*d2]))
  	  	             	            { value++;
  	  	             	              d1=3;
                                    }
  	  	             	         else 
                                     delay_10ms();
                               }
						   }
  	  	                if(value>=num/pagelen)
						    value=1;
						if((value==1)&&(num%pagelen!=0))           //不完整页
  	  	                   { value=0;
						     d2=num/pagelen;
                             data_addr.word[1]=address+len+pagelen*d2;
						     for(d1=0;d1<3;d1++)
  	  	             	       { if(1==write_byte(num%pagelen,slaveaddr,&wr_buff[len+pagelen*d2]))
  	  	             	          { value=1;
  	  	             	            d1=3;
                                  }
  	  	             	         else 
                                  delay_10ms();
                               }
						   }
  	  	             }
  	  	         delay_10ms();
                  
  	  	         break;
 	   	} 	
   }
return value;
}
 

//=====================================================================
// 函数功能:通过ID号写数据
// 入口参数:ID号
// 出口参数:1 成功, 0 失败
//===================================================================
unsigned char Write_datafromID(unsigned int dataIDnum)
{ unsigned char i,j,sumdata,value,num;
  value=0;
  num=addr_from_coreID(1,dataIDnum);			// 根据数据ID号获取数据总个数
  for(j=0;j<num;j++)
     { sumdata=0;
	   data_addr.word[1]=(*ID_coretalbpoint[j]).dataaddr;		                  // 取地址
       if((*ID_coretalbpoint[j]).datatype==BCDSUM)                                //如果带校验和
           { for(i=0;i<(*ID_coretalbpoint[j]).datalong-1;i++)
                 sumdata+=wr_buff[i];
			 wr_buff[(*ID_coretalbpoint[j]).datalong-1]=sumdata+0x33;             //计算校验和
           } 
       Write_data((*ID_coretalbpoint[j]).stortype,(*ID_coretalbpoint[j]).datalong);
     }
  return value;
}

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  

⌨️ 快捷键说明

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