📄 sle44064.c
字号:
{
qry_ext1(Le+2,resp);
sw1=resp[Le]; sw2=resp[Le+1];
}else{
f1: delay_50us_NOP(1);
for(i=0;i<Lc;i++)
{
XmtDat=comm[5+i];
RSXmt();
}
Lc=0;
goto A;
}
}else
{
sw1=BPrc;
qry_ext1(1,&BPrc);
sw2=BPrc;
if(sw1==0x61)
{
comm[0]=0x00;
comm[1]=0xC0;
comm[2]=0x00;
comm[3]=0x00;
comm[4]=sw2;
comm[5]=0;
len=5;
delay_50us_NOP(1);
goto Begin;
}
}
*lenr=Le;
return ( (((WORD)sw1)<<8)+sw2 );
}
void Check_VCC()
{
LED(RED,ON);
ECPU=FALSE;
if(ICVCC!=1)
{
ICVCC=1;
delay_10ms(1);
}
}
void n_nop(WORD _num)
{
WORD i;
for(i=_num;i!=0;i--)
{
_nop_();
}
}
void clkpulse()
{
ICCLK=1;
n_nop(10);
ICCLK=0;
}
void Reset_4406()
{
ICRST=1;
ICCLK=1;
n_nop(50);
ICCLK=0;
ICRST=0;
}
bit rd_bit() //shangshengran modify IO
{
bit RetBit;
ICIO=1;
n_nop(5);
RetBit=(ICIO==1);
n_nop(5);
return RetBit;
}
void rstpulse()
{
ICRST=1;
n_nop(10);
ICRST=0;
}
BYTE RdByte(BYTE j)
{
BYTE i, RcvDat;
bit rdbit;
for(i=0;i<8;i++)
{
if(j*8+i!=0)
clkpulse();
RcvDat=RcvDat<<1;
rdbit=rd_bit();
if(rdbit)
RcvDat=RcvDat|0x01;
}
return RcvDat;
}
void WtByte(BYTE PrgDat)
{
BYTE i;
for(i=8;i!=0;i--)
{
clkpulse();
PrgDat=PrgDat<<1;
if(!CY)
{
rstpulse();
ICCLK=1;
n_nop(10000);
ICCLK=0;
}
}
}
void Srd_4406(BYTE offset,BYTE len,BYTE *databuff)
{
bit rdbit;
BYTE j,RcvDat;
Check_VCC();
Reset_4406();
for(j=0;j<offset+len;j++)
{
RcvDat=RdByte(j);
if(j>=offset)
databuff[j-offset]=RcvDat;
}
}
void Swr_4406(BYTE offset,BYTE len,BYTE *databuff)
{
bit rdbit;
BYTE j,PrgDat;
Check_VCC();
Reset_4406();
for(j=0;j<offset+len;j++)
{
TOGGLE_WD();
if(j<offset)
{
RdByte(j);
}else{
PrgDat=databuff[j-offset];
WtByte(PrgDat);
} //j>=offset
} //end j
}
bit Eswc_4406(BYTE offset)
{
BYTE i,j;
bit rdbit;
Check_VCC();
Reset_4406();
for(j=0;j<offset;j++)
{
TOGGLE_WD();
if(j<offset-1)
{
RdByte(j);
}else{
for(i=8;i!=0;i--)
{
clkpulse();
rdbit=rd_bit();
if(rdbit)
{
rstpulse();
ICCLK=1;
n_nop(10000);
ICCLK=0;
rstpulse();
ICCLK=1;
n_nop(10000);
ICCLK=0;
return TRUE;
}
} //end i
} //j==offset-2
} //end j
return FALSE;
}
bit Csc_4406(BYTE* databuff)
{
BYTE i,j,PrgDat;
bit rdbit,CanCmp=FALSE;
Check_VCC();
Reset_4406();
for(j=0;j<9;j++)
RdByte(j);
for(i=8;i!=0;i--)
{
clkpulse();
rdbit=rd_bit();
if((!CanCmp)&&rdbit)
{
rstpulse();
ICCLK=1;
n_nop(10000);
ICCLK=0;
CanCmp=TRUE;
}
}
if(CanCmp)
{
for(j=0;j<3;j++)
{
TOGGLE_WD();
PrgDat=databuff[j];
for(i=8;i!=0;i--)
{
ICCLK=1;
n_nop(5);
PrgDat=PrgDat<<1;
ICIO=CY;
n_nop(5);
ICCLK=0;
n_nop(10);
}
}
}
return CanCmp;
}
/****************************************************************************
* Function: cmd_execution *
****************************************************************************/
void cmd_execution(void)
{
BYTE Status;
BYTE len;
BYTE cmd;
WORD Ret;
len = SerBuffer[LENGTH];
SerBuffer[LENGTH] = 0;
Status=OK;
cmd = SerBuffer[COMMAND];
switch (cmd)
{
case 0x5f: // Set Port
beep = SerBuffer[PORTBYTE]&0x01;
Status = OK;
break;
case 0x60:
Status=Check_ICSW();
if(Status!=OK)
break;
Reset(&SerBuffer[LENGTH], &SerBuffer[ADR]); //Insert Card or Warm Reset,CPU Card Reset
Status=OK;
break;
case 0x61: //Remove Card
Power_off();
break;
case 0x62: //Get Interface Device Status
SerBuffer[ADR] =ICSW==CARDON? 0x00: 0x05;
SerBuffer[LENGTH]=1;
break;
case 0x66: //CPUC_Cmd
SerBuffer[len+3]=0x00;
Ret=CPUC_Cmd(len,&SerBuffer[ADR], &SerBuffer[LENGTH], &SerBuffer[ADR]);
len=SerBuffer[LENGTH];
*((WORD *)(&SerBuffer[3+len]))=Ret;
SerBuffer[LENGTH]+=2;
break;
case 0x67:
Status=Check_ICSW();
if(Status!=OK)
break;
len=SerBuffer[ADR+3];
Srd_4406(SerBuffer[ADR+1],len,&SerBuffer[ADR]);
SerBuffer[LENGTH]=len;
break;
case 0x68:
Status=Check_ICSW();
if(Status!=OK)
break;
len=SerBuffer[ADR+3];
Swr_4406(SerBuffer[ADR+1],len,&SerBuffer[ADR+4]);
break;
case 0x69:
Status=Check_ICSW();
if(Status!=OK)
break;
Status=Eswc_4406(SerBuffer[ADR+1])? OK : 1;
break;
case 0x6a:
Status=Check_ICSW();
if(Status!=OK)
break;
Csc_4406(&SerBuffer[ADR]);
break;
default:
Status = W_CMD_NY_IMPL;
break;
} // end switch (Command)
SerBuffer[STATUS] = Status;
}
/****************************************************************************
* Function: InitCommPort *
****************************************************************************/
void InitCommPort(void)
{
TxFlag=0;
RxFlag=0;
RxErr =0;
RcvRdy=0;
RPtr=0;
//For 11.0592 MHz OSC, use Timer 2 can generate 38.4K, 19.2 or 9600 bps.
SCON = 0x50; // Mode 1, 8-bit UART, enable receiption
T2CON = 0x34; // baud rate generator for Phytec's 12.0/11.0592 MHz OSC
// recv'd & X'mit have the same baud rate,use timer 2
RCAP2H= 0xff; // 11.0592 MHz OSC, for 115.2K bps use FFH
RCAP2L= 0xdc; // 11.0592 MHz OSC, for 115.2K bps use FDH;9.6K bps use DCH
PCON = 0x00; // SMOD = 0; (single baud rate)
ES = TRUE;
ET0 = TRUE; // Enable timer 0 interrupt
ET1 = TRUE; // Enable timer 0 interrupt
EA = TRUE;
DataDleReceived=FALSE;
CmdReceived = FALSE;
CmdValid = FALSE;
Quit = FALSE;
LLfReady = TRUE;
SendReady = TRUE;
RepCnt = 0;
RecvState = RECV_STX;
}
/****************************************************************************
* function: init *
****************************************************************************/
void init(void)
{
BYTE i;
bit SW=ON;
beep=ON;
for(i=0;i<5;i++)
{
TOGGLE_WD();
TOGGLE_BP();
SW=~SW;
LED(GREEN,~SW);
LED(RED,SW);
delay_10ms(20);
}
InitCommPort();
Power_off();
}
/****************************************************************************
* Function: Check_cmd *
****************************************************************************/
void Check_cmd()
{
if (CmdValid) //TRUE
{
CmdValid = FALSE;
TOGGLE_WD();
cmd_execution();
TI= 1;
}
}
/****************************************************************************
* Function: Check_ICSW *
****************************************************************************/
BYTE Check_ICSW()
{
/* if(ICSW ==CARDOFF)
{
delay_10ms(1);
if(ICSW ==CARDOFF)
{
Power_off();
return W_NOCARD;
}
}*/
return OK;
}
/****************************************************************************
* Function: main *
****************************************************************************/
void main(void)
{
init();
while(1)
{
TOGGLE_WD();
Check_cmd();
Check_ICSW();
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -