?? ticcard.asm
字號:
MOVF irqBits,W
ANDLW 20H
BTFSC STATUS,Z
GOTO SRI_6
MOVLW RegInterruptRq
MOVWF ADDRESS
MOVLW 20H
MOVWF DAT3
CALL PUTRC500
MOVLW MI_NOTAGERR
MOVWF MfStatus
SRI_6:
GOTO SRI_0
SRI_EX:
MOVF oldPageSelect,W
IORLW 0X80
MOVWF DAT3
MOVLW REGPAGE
MOVF ADDRESS
CALL PUTRC500 ;還原頁面地址
GOTO INTERRUPT_RET
;++++++++++++++++++++++++++++++++++++++++++++++
;rc500的庫函數
;++++++++++++++++++++++++++++++++++++++++++++++
;***********************************************************
;射頻卡子程序
;PcdReset 初始化RC500
;Mf500PiccCommonRequest 尋卡
;Mf500PiccCascAnticoll 防沖撞
;Mf500PiccCascSelect 選定一張卡
;CHANGE_KEY 轉換密鑰匙格式
;Mf500PiccAuthKey 傳送密鑰
;PCD_AUTHENTICATION 驗證密鑰
;PCD_RED 讀卡
;PCD_WRITE 寫卡
;PCD_MANIPULATION 扣款/充值
;PCD_RESTORE 調錢包
;PCD_TRANSFER 保存錢包
;Mf500PiccHalt 卡休眠
;PCD_READ_EE 讀RC500-EEPROM
;PCD_WRITE_EE 寫RC500-EEPROM
;RESTORE 恢復RC500出廠設置
;LOADCONFIG 調自定義RC500設置
;LOADKEYEE 調RC500-EEPROM中的密鑰
;PCD_RFON 開天線
;PCD_RFOFF 關天線
;=================================================
; 設置RC500定時
;=================================================
;=======================================
PcdSetTmo:
MOVWF COUNT0
MOVLW 08H
SUBWF COUNT0,W
BTFSC STATUS,C
GOTO pst_08
MOVF COUNT0,W
ADDWF PCL,F
GOTO pst_08
GOTO pst_01
GOTO pst_02
GOTO pst_03
GOTO pst_04
GOTO pst_05
GOTO pst_06
GOTO pst_07
pst_01
MOVLW 07H
MOVWF VALUE
MOVLW 6AH
MOVWF RF1
GOTO pst_RET
pst_02:
MOVLW 07H
MOVWF VALUE
MOVLW 0A0H
MOVWF RF1
GOTO pst_RET
pst_03:
MOVLW 09H
MOVWF VALUE
MOVLW 0A0H
MOVWF RF1
GOTO pst_RET
pst_04:
MOVLW 09H
MOVWF VALUE
MOVLW 0FFH
MOVWF RF1
GOTO pst_RET
pst_05:
MOVLW 0BH
MOVWF VALUE
MOVLW 0FFH
MOVWF RF1
GOTO pst_RET
pst_06:
MOVLW 0DH
MOVWF VALUE
MOVLW 0FFH
MOVWF RF1
GOTO pst_RET
pst_07
MOVLW 0FH
MOVWF VALUE
MOVLW 0FFH
MOVWF RF1
GOTO pst_RET
pst_08
MOVLW 07H
MOVWF VALUE
MOVF COUNT0,W
MOVWF RF1
pst_RET
MOVLW REGTIMERCLOCK ;PAGE5
MOVWF address1
CALL WRITERC
MOVLW REGTIMERRELOAD ;PAGE5啟動時定時器裝入TReloadValue,改變該寄存器只在下次啟動事件影響定時
MOVWF address
MOVF RF1,W
MOVWF DAT3
CALL PUTRC500
RETURN
;----------------------------------
;=================================================
; 初始化RC500
;注 意:RC500上電后應延時500ms才能可靠初始化
;占用資源:
;=================================================
;//////////////////////////////////////////////////////////////////////
;// R E S E T
;///////////////////////////////////////////////////////////////////////
PcdRfReset:
MOVLW RegTxControl
MOVWF ADDRESS1
MOVLW 03H
MOVWF CLRBUF
call CLEARBIT
MOVF COUNT0,F
BTFSC STATUS,Z
GOTO PRR_ex
call Delay1ms
MOVLW RegTxControl
MOVWF ADDRESS1
MOVLW 03H
MOVWF SETBUF
call SetBit
PRR_ex:
MOVLW MI_OK
MOVWF STATUS_REG
RETURN
;;
;/////////////////////////////////////////////////////////////////////
; M I F A R E M O D U L E R E S E T
;/////////////////////////////////////////////////////////////////////
PcdReset:
BCF RC500_RST
CALL DELAY25MS
BSF RC500_RST
CALL DELAY10MS
BCF RC500_RST
; CALL DELAY2.5MS
BCF RC500_CS
MOVLW 03H
MOVWF PORTA
MOVLW 83H
MOVWF TMR1L
MOVLW 6DH
MOVWF TMR1H
MOVLW D'21'
MOVWF TMR1_CNT
CALL StartT2Timeout ;2.1S
MOVLW REGPAGE
MOVWF ADDRESS1
CLRF VALUE
CALL WRITERC
MOVLW REGCOMMAND ;啟動(和停止)命令的執行
MOVWF address1 ;讀REGCOMMAND地址
MOVLW REGPAGE
MOVWF VALUE ;讀頁面
MOVF address1,W
MOVWF ADDRESS
pr_00:
CALL GETRC500 ;讀REGCOMMAND值
MOVF TEMP_DATA,W
ANDLW 3FH
XORLW 3FH ;判斷讀出數據是否3FH
BTFSC STATUS,Z
GOTO pr_01
pr_001:
BTFSC FLAG_T2OUT
GOTO pr_err
GOTO pr_00
pr_01:
MOVLW REGCOMMAND ;啟動(和停止)命令的執行
MOVWF address
CALL GETRC500 ;讀REGCOMMAND值
MOVF TEMP_DATA,W
ANDLW 3FH
BTFSC STATUS,Z
GOTO pr_02
BTFSC FLAG_T2OUT
GOTO pr_err
GOTO pr_01
pr_02
call StopT2Timeout
MOVLW REGPAGE
MOVWF ADDRESS
MOVLW 80H
MOVWF DAT3 ;向REGCOMMAND寫入80H
CALL PUTRC500
MOVLW RegCommand
MOVWF ADDRESS
CALL GETRC500
MOVF TEMP_DATA,W
BTFSS STATUS,Z
GOTO pr_03
MOVLW MI_OK
MOVWF STATUS_REG
MOVLW REGPAGE
MOVWF ADDRESS
MOVLW 00H
MOVWF DAT3 ;
CALL PUTRC500
RETURN
pr_03:
MOVLW MI_INTERFACEERR
MOVWF STATUS_REG
RETURN
pr_err:
call StopT2Timeout
MOVLW MI_RESETERR
MOVWF STATUS_REG
RETURN
;///////////////////////////////////////////////////////////////////////
;// M I F A R E M O D U L E C O N F I G U R A T I O N
;///////////////////////////////////////////////////////////////////////
Mf500PcdConfig:
call PcdReset
movlw MI_OK
XORWF STATUS_REG,W
BTFSS STATUS,Z
GOTO MPC_ex
MOVLW REGCLOCKQCONTROL ;控制時鐘產生用于90度相移的Q信道時鐘
MOVWF ADDRESS1
MOVLW 00H ;80H
MOVWF VALUE
CALL WRITERC
MOVLW REGCLOCKQCONTROL
MOVWF ADDRESS1
MOVLW 40H ;0C0H
MOVWF VALUE
CALL WRITERC
CALL DELAY100US
MOVLW REGCLOCKQCONTROL
MOVWF ADDRESS1
MOVLW 40H
MOVWF CLRBUF
CALL CLEARBIT
MOVLW REGBITPHASE ;選擇發送器和接收器時鐘之間的位相位
MOVWF ADDRESS1
MOVLW 0ADH
MOVWF VALUE
CALL WRITERC
MOVLW REGRXTHRESHOLD
MOVWF ADDRESS1
MOVLW 0FFH ;BIT7-BIT4定義解碼器輸入端可接受的最小信號強度,如果信號小于該值將不進行計算
;BIT3-BIT0定義解碼器輸入的最小信號強度,該信號必須被Manchester編碼信號的弱半位達到以產生相對于強半位幅度的位沖突
MOVWF VALUE
CALL WRITERC
MOVLW RegRxControl2
MOVWF ADDRESS1
MOVLW 01H ;81H ;接收器始終有效,內部解調器
MOVWF VALUE
CALL WRITERC
MOVLW REGFIFOLEVEL
MOVWF ADDRESS1
MOVLW 04H ;1AH ;該寄存器定義了MF RC500用于微處理器的FIFO上溢和下溢警告界限,
;如果FIFO緩沖區剩余空間等于或小于FIFO緩沖區中的WaterLevel字節,HiAlert設置為1,
;如果等于或小于FIFO緩沖區中的WaterLevel字節,LoAlert設置為1
MOVWF VALUE
CALL WRITERC
MOVLW RegTimerControl
MOVWF ADDRESS1
MOVLW 02H ;
MOVWF VALUE
CALL WRITERC
MOVLW 01H
CALL PcdSetTmo
MOVLW REGIRQPINCONFIG ;
MOVWF ADDRESS1
MOVLW 03H ;管腳IRQ上的信號與對應的位IRQ狀態相反,IRQ為開漏輸出
MOVWF VALUE
CALL WRITERC
MOVLW 01H
MOVWF COUNT0
call PcdRfReset
; MOVLW RegTxControl ;天線驅動腳TX1和TX2的邏輯狀態控制
; MOVWF ADDRESS1
; MOVLW 5BH
; MOVWF VALUE
; CALL WRITERC
MOVLW MI_OK
MOVWF STATUS_REG
MPC_ex:
RETURN
;=================================================
; 尋卡
;入 口:@RF_SBUF=尋卡方式
; @RF_SBUF=52H:尋天線區內所有符合14443A標準的卡
; @RF_SBUF=26H:只尋未進入休眠狀態的卡
;出 口:CERR=0/1:有卡/無卡
;占用資源:
;=================================================
;///////////////////////////////////////////////////////////////////////
;// M I F A R E C O M M O N R E Q U E S T
;///////////////////////////////////////////////////////////////////////
Mf500PiccCommonRequest:
MOVLW MI_OK
MOVWF STATUS_REG
; MOVLW D'106'
; call PcdSetTmo
MOVLW REGCHANNELREDUNDANCY ;選擇 信道上數據完整性檢測的類型和模式
MOVWF ADDRESS1
MOVLW 03H
MOVWF VALUE
CALL WRITERC
MOVLW REGCONTROL ;不同的控制標志:例如:定時器,節電
MOVWF ADDRESS1
MOVLW 08H ;清除與卡的所有數據通信加密
MOVWF CLRBUF
CALL CLEARBIT
MOVLW REGBITFRAMING ;位方式幀的調節
MOVWF ADDRESS1
MOVLW 07H
MOVWF VALUE
CALL WRITERC
MOVLW RegTxControl
MOVWF ADDRESS1
MOVLW 03H
MOVWF SETBUF
CALL SetBit ;啟動天線
CALL ResetInfo
; MOVF RF1,W
; MOVWF SND_QUEUE
MOVLW 01H
MOVWF MfBytesToSend
MOVLW PCD_TRANSCEIVE
call PcdSingleResponseCmd
MOVLW MI_OK
XORWF STATUS_REG,W
BTFSS STATUS,Z
GOTO MPCR_ex
MOVLW D'16'
XORWF MfBitsReceived,W
BTFSS STATUS,Z
GOTO MPCR_1
MOVF RCV_QUEUE,W
MOVWF ATQ_BUF
MOVF RCV_QUEUE+1,W
MOVWF ATQ_BUF+1
MOVLW MI_OK
MOVWF STATUS_REG
GOTO MPCR_ex
MPCR_1:
MOVLW MI_BITCOUNTERR
MOVWF STATUS_REG
MPCR_ex:
RETURN
;=================================================
; 防沖撞
;入 口:無
;出 口:CERR=0/1:成功/失敗
; @RF_SBUF-@(RF_SBUF+3)=序列號
; @(RF_SBUF+4)=序列號的校驗字
;占用資源:
;注 :尋卡成功后,通過此函數向天線區內卡片發送防沖撞
; 命令,無論天線區內有幾張卡,此函數只得到一張卡片
; 的序列號,再用Pcdselect()函數選定這張卡,則所有
; 后續命令針對此卡,操作完畢后用PcdHalt()命令此卡
; 進入休眠狀態,再尋未進入休眠狀態的卡,可進行其
; 它卡片的操作
;=================================================
;///////////////////////////////////////////////////////////////////////
;// M I F A R E A N T I C O L L I S I O N
;// for extended serial numbers
;///////////////////////////////////////////////////////////////////////
Mf500PiccCascAnticoll:
GOTO Mf500PiccCascAnticoll_1
;=================================================
; 選定一張卡
;入 口:@RF_SBUF-@(RF_SBUF+3)=序列號
; @(RF_SBUF+4)=序列號的校驗字
;出 口:CERR=0/1:成功/失敗
;占用資源:ACC,temp_data,R0-R7,PSW
;=================================================
;///////////////////////////////////////////////////////////////////////
;// M I F A R E C A S C A D E D S E L E C T
;// for extended serial number
;R1-RF1,R2-RF2,A-RF3,R0-RF0
;///////////////////////////////////////////////////////////////////////
Mf500PiccCascSelect:
MOVLW MI_OK
MOVWF STATUS_REG
MOVLW D'106'
CALL PcdSetTmo
MOVLW RegChannelRedundancy ;PAGE4
MOVWF ADDRESS1
MOVLW 0fh
MOVWF VALUE
CALL WRITERC
MOVLW REGCONTROL ;PAGE1不同的控制標志:例如:定時器,節電
MOVWF ADDRESS1
MOVLW 08H ;清除與卡的所有數據通信加密
MOVWF CLRBUF
CALL CLEARBIT
; //************* Cmd Sequence **********************************
call ResetInfo
MOVLW SND_QUEUE
MOVWF FSR
MOVF RF2,W
MOVWF INDF
INCF FSR
MOVLW 70H
MOVWF INDF
MOVF RF0,W
MOVWF RF2
MOVWF FSR1
MOVLW SND_QUEUE+2
MOVWF FSR2
MOVLW 04H
MOVWF COUNT0
MPCS_1:
MOVF FSR1,W
MOVWF FSR
MOVF INDF,W
MOVWF COUNT1
MOVF FSR2,W
MOVWF FSR
MOVF COUNT1,W
MOVWF INDF
INCF FSR1
INCF FSR2
DECFSZ COUNT0,F
GOTO MPCS_1
MOVF RF2,W
MOVWF FSR
MOVF INDF,W
INCF FSR
XORLW INDF
INCF FSR
XORLW INDF
INCF FSR
XORLW INDF
MOVWF COUNT0
MOVF FSR2,W
MOVWF FSR
MOVF COUNT0,W
MOVWF INDF
MOVLW 07H
MOVWF MfBytesToSend
MOVLW PCD_TRANSCEIVE
call PcdSingleResponseCmd
BTFSC CERR
GOTO MPCS_ex
MOVLW 08H
XORWF MfBitsReceived,W
BTFSS STATUS,Z
GOTO MPCS_2
MOVF RCV_QUEUE,W
MOVWF SAK_BUF
MOVF RF2,W
MOVWF FSR1
MOVLW MLastSelectedSnr
MOVWF FSR2
MOVLW 04H
MOVWF COUNT0
MPCS1_1:
MOVF FSR1,W
MOVWF FSR
MOVF INDF,W
MOVWF COUNT1
MOVF FSR2,W
MOVWF FSR
MOVF COUNT1,W
MOVWF INDF
INCF FSR1
INCF FSR2
DECFSZ COUNT0,F
GOTO MPCS1_1
BCF CERR
GOTO MPCS_ex
MPCS_2:
MOVLW MI_BITCOUNTERR
MOVWF STATUS_REG
MPCS_ex:
RETURN
;=================================================
; 和RC500通訊
;入 口:@RF_SBUF=RC500命令字
; @(RF_SBUF+1)=發送的數據長度
; @(RF_SBUF+2)...@(RF_SBUF+N)=發送數據
;出 口:@RF_SBUF=錯誤字
; @(RF_SBUF+1)=接收到的位長度
; @(RF_SBUF+2)...@(RF_SBUF+N)=接收數據
;=================================================
;//////////////////////////////////////////////////////////////////////
;// W R I T E A P C D C O M M A N D
;///////////////////////////////////////////////////////////////////////
PcdSingleResponseCmd:
GOTO PcdSingleResponseCmd_1
;=================================================
; 命令卡進入休眠狀態
;入 口:無
;出 口:CERR=0/1:成功/失敗
;占用資源:
;=================================================
;///////////////////////////////////////////////////////////////////////
;// M I F A R E H A L T
;///////////////////////////////////////////////////////////////////////
Mf500PiccHalt:
MOVLW D'106'
CALL PcdSetTmo
; // ************* Cmd Sequence **********************************
call ResetInfo
MOVLW PICC_HALT
MOVWF SND_QUEUE
CLRF SND_QUEUE+1
MOVLW 02H
MOVWF MfBytesToSend
MOVLW PCD_TRANSCEIVE
call PcdSingleResponseCmd
MOVLW MI_OK
XORWF STATUS_REG,W
BTFSC STATUS,Z
GOTO MPH_ex
MPH_1:
MOVLW MI_NOTAGERR
XORWF STATUS_REG,W
BTFSC STATUS,Z
GOTO MPH1_1
MOVLW MI_OK
MOVWF STATUS_REG
GOTO MPH_ex
MPH1_1:
MOVLW MI_ACCESSTIMEOUT
XORWF STATUS_REG,W
BTFSS STATUS,Z
GOTO MPH_ex
MOVLW MI_OK
MOVWF STATUS_REG
MPH_ex:
MOVLW RegCommand
MOVWF ADDRESS1
MOVLW PCD_IDLE
MOVWF VALUE
CALL WRITERC
RETURN
;=================================================
; 讀RC500-EEPROM的數據
;入 口:@RF_SBUF--@(RF_SBUF+1)=讀取的起始地址(低位在前)
; @(RF_SBUF+2)=讀字節數
;出 口:CERR=0/1:讀成功/失敗
; @RF_SBUF--@RF_SBUF+15=讀出的數據
;占用資源:ACC,temp_data,R0-R7,PSW
;=================================================
;///////////////////////////////////////////////////////////////////////
;// E E P R O M R E A D
;///////////////////////////////////////////////////////////////////////
PcdReadE2:
call ResetInfo
MOVF RF_SBUF,W
MOVWF SND_QUEUE
MOVF RF_SBUF+1,W
MOVWF SND_QUEUE+1
MOVF RF_SBUF+2,W ;讀取數據位數
MOVWF SND_QUEUE+2
MOVLW 03H
MOVWF MfBytesToSend
MOVLW PCD_READE2
call PcdSingleResponseCmd
MOVLW MI_OK
XORWF STATUS_REG,W
BTFSS STATUS,Z
GOTO PRE_ex
MOVLW RCV_QUEUE
MOVWF FSR1
MOVLW RC500_SNR
MOVWF FSR2
PRE_1:
MOVF FSR1,W
MOVWF FSR
MOVF INDF,W ;把序列號存儲至RC500_SNR
MOVWF COUNT0
MOVF FSR2,W
MOVWF FSR
MOVF COUNT0,W
MOVWF INDF
INCF FSR1
INCF FSR2
DECFSZ RF_SBUF+1,F
GOTO PRE_1
MOVLW MI_OK
MOVWF STATUS_REG
PRE_ex:
RETURN
;=================================================
; 寫數據到RC500-EEPROM
;入 口:@RF_SBUF--@(RF_SBUF+1)=寫起始地址(低位在前)
; @(RF_SBUF+2)=寫字節數
; @(RF_SBUF+3).....=要寫的數據
;出 口:CERR=0/1:寫成功/失敗
;占用資源:
;=================================================
;///////////////////////////////////////////////////////////////////////
;// E E P R O M W R I T E
;///////////////////////////////////////////////////////////////////////
PcdWriteE2:
call ResetInfo
MOVF RF7,W
MOVWF COUNT0
INCF COUNT0
INCF COUNT0
MOVF COUNT0,W
MOVWF MfBytesToSend
MOVLW SND_QUEUE+2
MOVWF FSR1
MOVF RF0
MOVWF FSR2
PWE_1:
MOVF FSR2,W
MOVWF FSR
MOVF INDF,W
MOVWF COUNT0
MOVF FSR1,W
MOVWF FSR
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -