?? 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 + -