||
; **************************************
; **************************************
SEND_COMMAND:
MOV.b @BX+,TRDATA //发送命令头5字节
CALL #SENDCHAR
bit #c,sr
Jnz sendcom_out
DEC.B RESETCNT
JNZ SEND_COMMAND
CLRC
sendcom_out:
RET
;**********************************************************
;**********************************************************
SENDCHAR:
MOV.B #3,ERRCNT //错误次数为3次
schar1:
BIS.B #ICIO+ICRST,&PDIRA //将数据口设为输出口
BIS.B #SAMIO+SAMRST,&PDIRB
clr.b icflag1
BIT.B #ICSAM
JNZ SCHAR_IC1
BIC.B #SAMIO,&POUTB //发送起始位
CALL #DELAY1ETU
BIS.B #SAMIO,&PDIRB
CALL #SENDONEbYTE
BIC.B #SAMIO,&PDIRB //转为接收态
CALL #DELAY05ETU
bit.b #samio,&pinb
JZ SCHAR_ERR //若数据线为低,表出错
JMP SCHAR_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
JZ SCHAR_ERR
SCHAR_OK:
CALL #DELAY05ETU //一字节发送完毕
call #DELAY1ETU
CLRC
RET
SCHAR_ERR:
CALL #DELAY1ETU
BIS.B #ICIO,&PDIRA
BIS.B #SAMIO,&PDIRB
CALL #DELAY1ETU
DEC.B ERRCNT
JNZ SCHAR1
SETC
RET
;**************************************
;**************************************
SENDONEBYTE: //发送一字节:8位加校验位
MOV.B #8,CNTREG
CLRC
BIT.B #ICSAM
JNZ S1BYTE_IC //ICCARD
S1BYTE_ASAM:
RRA.B TRDATA
JC S1BYTE_C1 //=1
BIC.B #SAMIO,&POUTB
JMP S1BYTE_NEXT
S1BYTE_C1:
BIS.B #SAMIO,&POUTB
XOR.B #80H,ICFLAG1 //计算校验和
S1BYTE_NEXT:
CALL #DELAY1ETU
DEC.B CNTREG
JNZ S1BYTE_ASAM
BIT.B #80H,ICFLAG1 //发校验和
JNZ S1BYTE_MXOR1 //1
BIC.B #SAMIO,&POUTB
JMP S1BYTE_OUT
S1BYTE_MXOR1:
BIS.B #SAMIO,&POUTB
S1BYTE_OUT:
CALL #DELAY1ETU
BIC.B #SAMIO,&PDIRB
JMP S1BYTE_OUT2
S1BYTE_IC:
RRA.B TRDATA
JC S1BYTE_IC1 //=1
BIC.B #ICIO,&POUTA
JMP S1BYTE_NEXTIC
S1BYTE_IC1:
BIS.B #ICIO,&POUTA
XOR.B #80H,ICFLAG1 //计算校验和
S1BYTE_NEXTIC:
CALL #DELAY1ETU
DEC.B CNTREG
JNZ S1BYTE_IC
BIT.B #80H,ICFLAG1
JNZ S1BYTE_MXORIC1 //1
BIC.B #ICIO,&POUTA
JMP S1BYTE_OUTIC
S1BYTE_MXORIC1:
BIS.B #ICIO,&POUTA
S1BYTE_OUTIC:
CALL #DELAY1ETU
BIC.B #ICIO,&PDIRA
S1BYTE_OUT2:
RET
;************************************************************
;************************************************************
CARDRESET:
clr.b icflag1
MOV.B #8,CNTREG ;发送或接收的位数
CLR.B TRDATA ;发送或接收的数据
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的复位
jz rst_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置高
;start to receive data: 400clk
call #delay1etu
JMP RST_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
;start to receive data: 400clk
call #delay1etu
RST_A:
call #recchar //接收13个复位字符
bit.b #c,sr
jnz rst_err
mov.b trdata,0(bx)
inc bx
dec.b resetcnt
jnz RST_A
ret
rst_err:
bis.b #CARDPRO_ERR //将错误标志置1
ret