;**************************************
1.;发送命令头5字节
;**************************************
SEND_COMMAND:
MOV.b@BX+,TRDATA//发送命令头5字节
CALL#SENDCHAR
bit#c,sr
Jnzsendcom_out
DEC.BRESETCNT
JNZSEND_COMMAND
CLRC
sendcom_out:
RET
;**********************************************************
2.;发送一个字节,C=0发送正确,C=1发送出错,容错次数为3次
;**********************************************************
SENDCHAR:
MOV.B#3,ERRCNT//错误次数为3次
schar1:
BIS.B#ICIO+ICRST,&PDIRA//将数据口设为输出口
BIS.B#SAMIO+SAMRST,&PDIRB
clr.bicflag1
BIT.B#ICSAM
JNZSCHAR_IC1
BIC.B#SAMIO,&POUTB//发送起始位
CALL#DELAY1ETU
BIS.B#SAMIO,&PDIRB
CALL#SENDONEbYTE
BIC.B#SAMIO,&PDIRB//转为接收态
CALL#DELAY05ETU
bit.b#samio,&pinb
JZSCHAR_ERR//若数据线为低,表出错
JMPSCHAR_OK
SCHAR_IC1:
BIC.B#ICIO,&POUTA
CALL#DELAY1ETU
BIS.B#ICIO,&PDIRA
CALL#SENDONEbYTE
BIC.B#ICIO,&PDIRA
CALL#DELAY05ETU
BIT.B#ICIO,&PINA
JZSCHAR_ERR
SCHAR_OK:
CALL#DELAY05ETU//一字节发送完毕
call#DELAY1ETU
CLRC
RET
SCHAR_ERR:
CALL#DELAY1ETU
BIS.B#ICIO,&PDIRA
BIS.B#SAMIO,&PDIRB
CALL#DELAY1ETU
DEC.BERRCNT
JNZSCHAR1
SETC
RET
;**************************************
3.;发送一字节:8位加校验位
;**************************************
SENDONEBYTE://发送一字节:8位加校验位
MOV.B#8,CNTREG
CLRC
BIT.B#ICSAM
JNZS1BYTE_IC//ICCARD
S1BYTE_ASAM:
RRA.BTRDATA
JCS1BYTE_C1//=1
BIC.B#SAMIO,&POUTB
JMPS1BYTE_NEXT
S1BYTE_C1:
BIS.B#SAMIO,&POUTB
XOR.B#80H,ICFLAG1//计算校验和
S1BYTE_NEXT:
CALL#DELAY1ETU
DEC.BCNTREG
JNZS1BYTE_ASAM
BIT.B#80H,ICFLAG1//发校验和
JNZS1BYTE_MXOR1//1
BIC.B#SAMIO,&POUTB
JMPS1BYTE_OUT
S1BYTE_MXOR1:
BIS.B#SAMIO,&POUTB
S1BYTE_OUT:
CALL#DELAY1ETU
BIC.B#SAMIO,&PDIRB
JMPS1BYTE_OUT2
S1BYTE_IC:
RRA.BTRDATA
JCS1BYTE_IC1//=1
BIC.B#ICIO,&POUTA
JMPS1BYTE_NEXTIC
S1BYTE_IC1:
BIS.B#ICIO,&POUTA
XOR.B#80H,ICFLAG1//计算校验和
S1BYTE_NEXTIC:
CALL#DELAY1ETU
DEC.BCNTREG
JNZS1BYTE_IC
BIT.B#80H,ICFLAG1
JNZS1BYTE_MXORIC1//1
BIC.B#ICIO,&POUTA
JMPS1BYTE_OUTIC
S1BYTE_MXORIC1:
BIS.B#ICIO,&POUTA
S1BYTE_OUTIC:
CALL#DELAY1ETU
BIC.B#ICIO,&PDIRA
S1BYTE_OUT2:
RET
;************************************************************
4.;复位应答,接收13个应答信号,存放在RSTDATABUF开始的区域
;************************************************************
CARDRESET:
clr.bicflag1
MOV.B#8,CNTREG;发送或接收的位数
CLR.BTRDATA;发送或接收的数据
MOV#RSTDATABUF,BX;复位信号存放区
MOV.B#13,RESETCNT;计数器
clr.b&poutb;
bis.b#sampower,&poutb;
bis.b#samio,&poutB;esam模块io口输出高
bic.b#samrst,&poutB;esam模块rst口输出低
bis.b#sampower+samio+samrst,&pdirb;
BIC.B#CARDPRO_ERR
call#delay1etu
bit.b#icsam//判是对IC卡还是对ESAM的复位
jzrst_sam
RST_IC://对IC卡复位
clr.b&poutA
bis.b#ICpower,&poutA
bis.b#ICio,&poutA
bic.b#ICrst,&poutA
bis.b#ICpower+ICio+ICrst,&pdirA
BIC.B#CARDPRO_ERR
call#delay1etu
mov.b#0fh,&scfi1//对时钟频率进行设置
bis.b#dcoplus,&053h
mov.b#(64-1),&scfqctl//MCLK=4.196MHZ
mov.b#40h,&scfi0
mov.b#02h,P1dir//使P1.1为时钟输出
mov.b#02h,p1sel
bic.b#ICpower,&poutA//上电
bis.b#ICpower,&pdirA
CALL#DELAY05ETU
bic.b#ICIO,&pdirA//把口线置为接收态
call#delay1etu
call#delay1etu
call#delay1etu
BIS.B#ICRST,&POUTA//把RST置高
;starttoreceivedata:400clk
call#delay1etu
JMPRST_A
rst_sam:
bic.b#sampower,&poutB
bis.b#sampower,&pdirB
mov.b#0fh,&scfi1
bis.b#dcoplus,&053h
mov.b#(64-1),&scfqctl//MCLK=4.196MHZ
mov.b#40h,&scfi0
mov.b#02h,P1dir
mov.b#02h,p1sel
CALL#DELAY05ETU
bic.b#samio,&pdirb
call#delay1etu
call#delay1etu
call#delay1etu
BIS.B#SAMRST,&POUTB
;starttoreceivedata:400clk
call#delay1etu
RST_A:
call#recchar//接收13个复位字符
bit.b#c,sr
jnzrst_err
mov.btrdata,0(bx)
incbx
dec.bresetcnt
jnzRST_A
ret
rst_err:
bis.b#CARDPRO_ERR//将错误标志置1
ret