注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
tiankai001的个人空间 https://home.eeworld.com.cn/space-uid-139222.html [收藏] [复制] [分享] [RSS]
日志

基于MSP430单片机的CPU卡模板程序(三)

已有 1505 次阅读2015-1-28 22:13 |个人分类:CPU卡开发设计程序实例| MSP430, CPU卡程序

; **************************************

1. 发送命令头5字节

; **************************************

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

;**********************************************************

2. ;发送一个字节C=0发送正确,C=1发送出错,容错次数为3次

;**********************************************************

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

;**************************************

3. ;发送一字节:8位加校验位

**************************************

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

;************************************************************

4. 复位应答,接收13个应答信号,存放在RSTDATABUF开始的区域

;************************************************************

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

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章