📄 jbdata.c
字号:
bool fFirstOk=0;
cbDelaySecond=4;
fDelaySecond=FALSE;
while(TRUE){
if(fDelaySecond){
bErrorCode=ERR_35;
break;
}
if(!fRxDataReady)
continue;
fRxDataReady=FALSE;
if(!fFirstOk){
if(bRecSBUF==OK)
fFirstOk=1;
continue;
}
else if(bRecSBUF==0xfe)
return TRUE;
}
return FALSE;
}
// End function: RxFirstOK()
/***************************************************************
*
* 函 数: RxPaNe()
* 说 明: 接收管理机下传的Pa,Ne,并作应答处理
*
**************************************************************/
bool RxPaNe(void)
{
byte i,aTemp[3];
bool fFalse=FALSE;
byte bSendTimes;
for(bSendTimes=0;bSendTimes<3;bSendTimes++){
for(i=0;i<3;i++){
if(!RxByte()){
if(fFalse)
return FALSE;
fFalse=TRUE;
i=0xff;
continue;
}
aTemp[i]=bRecSBUF;
if((i==1)&&(aTemp[0]==ERR_CS)&&(aTemp[1]==~ERR_CS)){
TxCmd(bLastCmd);
i=0xff;
continue;
}
}
if(aTemp[2]==(byte)(aTemp[0]+aTemp[1])){
bPaBuf=aTemp[0];
bNeBuf=aTemp[1];
iPaNeNum=((uint)bPaBuf*128)+bNeBuf;
iParaWord=iPaNeNum;
return TRUE;
}
TxCmd(ERR_CS);
}
bErrorCode=ERR_04;
return FALSE;
}
// End function: RxPaNe()
/***************************************************************
*
* 函 数: TxPaNe()
* 说 明: 向管理机发送Pa,Ne,并等待答应
*
**************************************************************/
bool TxPaNe(void)
{
byte i;
iPaNeNum=(uint)(bPaBuf*128)+bNeBuf;
for(i=0;i<3;i++){
TxByte(bPaBuf);
TxByte(bNeBuf);
TxByte(bPaBuf+bNeBuf);
if(!RxCmd())
return FALSE;
if(bRecSBUF==OK)
return TRUE;
else if(bRecSBUF!=ERR_CS){
bErrorCode=ERR_05;
return FALSE;
}
}
bErrorCode=ERR_04;
return FALSE;
}
// End function: TxPaNe()
/******************************************************************
*
* 函数名:RxData()
* 功 能:从CBUS口接收由bPaBuf,bNeBuf指定的数据
* 数据被顺序缓冲在aDataBuf[]中
* 包函接收数据和给出应答
*
******************************************************************/
bool RxData(void)
{
bool fOneTimes;
byte i,j,bCheckSum;
uint iAddr=0;
if(iPaNeNum!=0)
TxCmd(OK);
while(bPaBuf!=0){
for(i=0,fOneTimes=FALSE;i<3;i++){
for(j=0,bCheckSum=0;j<129;j++){
if(!RxByte()){
if((j>=1)&&
(aDataBuf[iAddr]==ERR_CS)&&(aDataBuf[iAddr+1]==~ERR_CS)){
aDataBuf[iAddr]=0;
aDataBuf[iAddr+1]=0;
TxCmd(bLastCmd);
j=0xff;
continue;
}
if(fOneTimes)
return FALSE;
else{
fOneTimes=TRUE;
j=0xff;
continue;
}
}
if(j<128){
bCheckSum+=bRecSBUF;
aDataBuf[iAddr+j]=bRecSBUF;
}
} // End for(j...)
if(bCheckSum!=bRecSBUF){ //若校验和不正确,重新发送数据
TxCmd(ERR_CS);
continue;
}
iAddr+=128;
Flash(1);
if((--bPaBuf!=0)||(bNeBuf!=0))
TxCmd(OK);
break;
} // End for(i...)
if(i==3){
bErrorCode=ERR_04;
return FALSE;
}
} // End while(bPaBuf!=0)
while(bNeBuf!=0){
for(i=0,fOneTimes=FALSE;i<3;i++){
for(j=0,bCheckSum=0;j<bNeBuf+1;j++){
if(!RxByte()){
if((j>=1)&&
(aDataBuf[iAddr]==ERR_CS)&&(aDataBuf[iAddr+1]==~ERR_CS)){
aDataBuf[iAddr]=0;
aDataBuf[iAddr+1]=0;
TxCmd(bLastCmd);
j=0xff;
continue;
}
if(fOneTimes){
DelaySecond(2);
return FALSE;
}
else{
fOneTimes=TRUE;
j=0xff;
continue;
}
}
if(j<bNeBuf){
aDataBuf[iAddr+j]=bRecSBUF;
bCheckSum+=bRecSBUF;
}
} // End for(j...)
if(bCheckSum!=bRecSBUF){ //若校验和不正确,重新发送数据
TxCmd(ERR_CS);
continue;
}
return TRUE;
} // End for(i...)
DelaySecond(2);
bErrorCode=ERR_04;
return FALSE;
} // End while(bNeBuf!=0)
return TRUE;
}
// End function: RxData()
/******************************************************************
*
* 函 数: TxData()
* 功 能: 从CBUS口发送由bPaBuf,bNeBuf指定的数据
* 数据被顺序缓冲在aDataBuf[]中
* 包函发送数据和接收应答
*
******************************************************************/
bool TxData(void)
{
byte i,j,bCheckSum;
uint iAddr;
iAddr=0;
while(bPaBuf!=0){
for(i=0;i<3;i++){
for(j=0,bCheckSum=0;j<128;j++){
if(!TxByte(aDataBuf[iAddr+j]))
return FALSE;
bCheckSum+=aDataBuf[iAddr+j];
}
TxByte(bCheckSum);
if(!RxCmd())
continue;
if(bRecSBUF==OK)
break;
else if(bRecSBUF!=ERR_CS)
break;
}
if((bRecSBUF!=OK)||(i==3)){
bErrorCode=ERR_04;
return FALSE;
}
--bPaBuf;
iAddr+=128;
FlashComm();
} // End while(bPaBuf!=0)
while(bNeBuf!=0){
for(i=0;i<3;i++){
for(j=0,bCheckSum=0;j<bNeBuf;j++){
if(!TxByte(aDataBuf[iAddr+j]))
return FALSE;
bCheckSum+=aDataBuf[iAddr+j];
}
TxByte(bCheckSum);
if(!RxCmd())
continue;
if(bRecSBUF==OK)
break;
else if(bRecSBUF!=ERR_CS)
break;
}
if((i==3)||(bRecSBUF!=OK)){
bErrorCode=ERR_04;
return FALSE;
}
break;
}
return TRUE;
}
// End function: TxData()
/**********************************************************************
*
* 函数名: WriteData()
* 功 能: 将DataBuf中指定长度的数据写入FLASH或RTC_RAM存储器中
* FLASH的写入过程在DlpTime0中断中进行
* 入口参数: bPage:欲写入的页面
* tAddr:欲写入的目标地址
* bLen: 欲写入数据的长度(1-256)
* 全局变量: fWriteFlashRequest: 写入FLASH请求标志
* bWriteFlashPage: 欲写入的页面
* tWriteFlashAddr: 欲写入的目标地址
* sWriteFlashBuf[256]:欲写入FLASH数据缓冲区
* bWriteFlashLen: 欲写入数据的长度(1-256)
* 注 意: 在有严格时间要求的过程中不能调用本函数,执行时间约30MS
*
**********************************************************************/
// 暂按128字节页面(SST29EE010/SST29EE020)设计:
void WriteData(byte bPage,uint tAddr,byte bLen,byte*p)
{
byte i,bTemp;
byte code *pFrom;
byte xdata *pTo;
if(bPage>=4){
for(i=0;i<bLen;i++){
bTemp=p[i];
Page(bPage);
XBYTE[tAddr+i]=bTemp;
Page(5);
}
return;
}
Page(4); // 拷贝写FLASH过程到Page4
for(pFrom=0x2000,pTo=0x2000;pFrom<0x2300;pFrom++,pTo++)
*pTo=*pFrom;
Page(5);
bWriteFlashPage=bPage; // 设置页面
tWriteFlashAddr=tAddr; // 设置目标地址
for(i=0;i<bLen;i++,p++)
sWriteFlashBuf[i]=*p;
bWriteFlashLen=bLen; // 设置长度
fWriteFlashRequest=1; // 开始请求写入
while(fWriteFlashRequest) IDLE; // 等待写入完成
}
// End function: WriteData()
/******************************************************************
*
* 函 数: GeneralWriteData()
* 功 能: 向FLASH中写入由bPaBuf,bNeBuf指定的已收到数据
* 数据被缓冲在aDataBuf[]中.
*
******************************************************************/
void GeneralWriteData(uint iAddr)
{
uint i;
byte bFirst=0;
byte bSecond=0;
byte bThree=0;
if((iAddr&0x007f)==0){
bSecond=iPaNeNum/128;
bThree=iPaNeNum%128;
}
else{
bFirst=(byte)(iAddr&0x00ff);
if(bFirst<0x80)
bFirst=0x80-bFirst;
else
bFirst=(byte)(0x100-bFirst);
i=iPaNeNum;
if(i>bFirst){
bSecond=(byte)((i-bFirst)/128);
bThree=(byte)((i-bFirst)%128);
}
else
bFirst=i;
}
i=0;
while(bFirst!=0){
WriteData(1,iAddr,bFirst,&aDataBuf[i]);
iAddr+=bFirst;
i+=bFirst;
bFirst=0;
}
while(bSecond!=0){
WriteData(1,iAddr,128,&aDataBuf[i]);
iAddr+=128;
i+=128;
--bSecond;
}
while(bThree!=0){
WriteData(1,iAddr,bThree,&aDataBuf[i]);
bThree=0;
}
}
// End function: GeneralWriteData()
/******************************************************************
*
* 函 数: GeneralReadData()
* 功 能: 从FLASH中读出由bPaBuf,bNeBuf指定的数据
* 缓冲到aBuf[]中.
*
******************************************************************/
void GeneralReadData(byte bPage,uint sAddr,uint iLen,byte *aBuf)
{
byte bTemp;
uint i;
for(i=0;i<iLen;i++,sAddr++){
Page(bPage);
bTemp=XBYTE[sAddr];
Page(5);
aBuf[i]=bTemp;
}
}
// End function: GeneralReadData()
/******************************************************************
*
* 函 数: ReadPara()
* 功 能: 从FLASH或RTC_RAM中读出由bLen指定的数据
* 缓冲到aBuf[]中.bLen<256.
*
******************************************************************/
void ReadData(byte bPage,uint sAddr,byte bLen,byte *aBuf)
{
byte i,bTemp;
for(i=0;i<bLen;i++,sAddr++){
Page(bPage);
bTemp=XBYTE[sAddr];
Page(5);
aBuf[i]=bTemp;
}
}
// End function: ReadData()
/******************************************************************
*
* 函 数: AutoReadPara()
* 功 能: 自动读参数.根据参数代码从参数索引表中取出页面,长度,
* 和类型,取出参数后自动转换,用Para类型返回.
*
******************************************************************/
bool AutoReadPara(byte bParaCode)
{
byte i;
byte code *Point;
byte xdata aBuf[6];
byte xdata aBuf1[10];
uint iAddr;
Point=PARA_START;
while(TRUE){ // 找参数代码
if(*Point==bParaCode)
break;
Point+=6;
if(Point>=PARA_END)
return FALSE;
}
Page(5);
for(i=0;i<6;i++)
aBuf[i]=Point[i];
iAddr=(uint)(aBuf[3]*256)+aBuf[4];
ReadData(aBuf[5],iAddr,aBuf[1],&aBuf1); // 读出参数内容:
i=aBuf[2]&0x0f;
switch(i){
case QUERY_BYTE: // 字节型可查询参数
case QUERY_BIT: // 位寻址可查询参数
bParaByte=aBuf1[0];
break;
case QUERY_HEX:
case QUERY_BCD: // 压缩BCD可查询参数
memcpy(&aParaBuf,&aBuf1,aBuf[1]);
if(aBuf[1]==1)
bParaByte=aBuf1[0];
break;
case QUERY_INT: // 整型可查询参数
iParaWord=(uint)(aBuf1[0]*256)+aBuf1[1];
break;
case QUERY_LONG: // 长整型可查询参数
lParaLWord=(ulint)(aBuf1[0]*65536)+(ulint)(aBuf1[1]*256)+aBuf1[2];
break;
default:
return FALSE;
}
return TRUE;
}
// End function: AutoReadPara()
/******************************************************************
*
*
* 函 数: AutoWritePara()
* 功 能: 自动写参数.根据参数代码从参数索引表中取出页面,长度,
* 和类型,将bParaByte等相应的值存入FLASH.
*
*
******************************************************************/
bool AutoWritePara(byte bParaCode)
{
byte i;
byte xdata aBuf[6];
byte xdata aBuf1[10];
uint iAddr;
byte code *Point;
Point=PARA_START;
while(TRUE){
if(bParaCode==*Point)
break;
Point+=6;
if(Point>PARA_END)
return FALSE;
}
for(i=0;i<6;i++,Point++)
aBuf[i]=*Point;
iAddr=(uint)(aBuf[3]*256)+aBuf[4]; // 计算目标地址
i=aBuf[2]&0x0f;
switch(i){
case QUERY_BYTE: // 字节型可查询参数
case QUERY_BIT: // 位寻址可查询参数
aBuf1[0]=bParaByte;
break;
case QUERY_HEX:
case QUERY_BCD: // 压缩BCD可查询参数
memcpy(&aBuf1,&aParaBuf,aBuf[1]);
if(aBuf[1]==1)
aBuf1[0]=bParaByte;
break;
case QUERY_INT: // 整型可查询参数
aBuf1[0]=(byte)(iParaWord/256);
aBuf1[1]=(byte)(iParaWord%256);
break;
case QUERY_LONG: // 长整型可查询参数
aBuf1[0]=(byte)((lParaLWord>>16)&0xff);
aBuf1[1]=(byte)((lParaLWord>>8)&0xff);
aBuf1[2]=(byte)(lParaLWord&0xff);
break;
default:
return FALSE;
}
WriteData(aBuf[5],iAddr,aBuf[1],&aBuf1);
return TRUE;
}
// End function: AutoWritePara()
//
// End file: jbData.c
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -