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