📄 jb8_io~1.lst
字号:
DFAF 95 tSX
FILE: RF.c
(0001) //------------------------------------------------------------------------*
(0002) //文件名:RF.C *
(0003) //功 能:与射频读卡芯片通信相关程序。 *
(0004) //包 含: *
(0005) // (1)RC531的驱动函数 *
(0006) // (2)RC531的复位及初始化 *
(0007) // (3)RC531的读卡操作 *
(0008) //------------------------------------------------------------------------*
(0009) #include "RF.h"
(0010)
(0011) //------------------------------------------------------------------------*
(0012) //1.RC531的驱动函数 *
(0013) //------------------------------------------------------------------------*
(0014)
(0015) //RFRegRead---------------------------------------------------------------*
(0016) //功 能: 读出给定地址的寄存器的值并返回 *
(0017) //参 数: adder 被访问寄存器的地址 *
(0018) //返 回: 读出的数据 *
(0019) //------------------------------------------------------------------------*
(0020) INT8U RFRegRead(INT8U addr)
(0021) {
DFB0 E6 05 ldA 5,X
DFB2 48 lslA
DFB3 E7 02 stA 2,X
(0022) INT8U ReData1,ReData2; //接收数据变量
(0023) INT8U SndData; //发送数据变量
(0024)
(0025) //处理第一个字节,bit7:MSB=1,bit6~1:addr,bit0:RFU=0
(0026) SndData = (addr << 1);
(0027) SndData |= (1 << 7);
DFB5 AA 80 orA #-128
DFB7 E7 02 stA 2,X
(0028) SndData &= ~(1 << 0);
DFB9 A4 FE and #-2
DFBB E7 02 stA 2,X
(0029)
(0030) //SPI1_SS引脚拉低,选中从机
(0031) SPI1_P &= ~(1 << SPI1_SS);
DFBD 1F 03 Bclr 7,0x03
(0032)
(0033) //读取过程
(0034) ReData1 = SPI1MASTERCOM(SndData); //发送读取目的寄存器地址
DFBF 87 pshA
DFC0 CD DF40 jsr _SPI1MASTERCOM
DFC3 A7 01 aiS #1
DFC5 95 tSX
DFC6 B7 41 stA *__r1
DFC8 F7 stA 0,X
(0035) ReData2 = SPI1MASTERCOM(0x00); //读取结束,取回寄存器内容
DFC9 4F clrA
DFCA 87 pshA
DFCB CD DF40 jsr _SPI1MASTERCOM
DFCE A7 01 aiS #1
DFD0 95 tSX
DFD1 B7 41 stA *__r1
DFD3 E7 01 stA 1,X
(0036)
(0037) //SPI1_SS引脚拉高,取消选中
(0038) SPI1_P |= (1 << SPI1_SS);
DFD5 1E 03 Bset 7,0x03
(0039)
(0040) return ReData2; //返回接收数据
DFD7 A7 03 aiS #3
DFD9 81 rts
_RFRegWrite:
ReData2 --> X+0
ReData1 --> X+1
SndAddr --> X+2
Data --> X+6
addr --> X+5
DFDA A7 FD aiS #-3
DFDC 95 tSX
(0041) }
(0042)
(0043) //RFRegWrite--------------------------------------------------------------*
(0044) //功 能: 向给定地址的寄存器写一个值 *
(0045) //参 数: adder 被访问寄存器的地址; Data 写入的数据 *
(0046) //返 回: 无 *
(0047) //------------------------------------------------------------------------*
(0048) void RFRegWrite(INT8U addr, INT8U Data)
(0049) {
DFDD E6 05 ldA 5,X
DFDF 48 lslA
DFE0 E7 02 stA 2,X
(0050) INT8U ReData1,ReData2;
(0051) INT8U SndAddr;
(0052)
(0053) //处理第一个字节,bit7:MSB=0,bit6~1:addr,bit0:RFU=0
(0054) SndAddr = (addr << 1);
(0055) SndAddr &= 0x7E;
DFE2 A4 7E and #126
DFE4 E7 02 stA 2,X
(0056)
(0057) //SPI1_SS引脚拉低,选中从机
(0058) SPI1_P &= ~(1 << SPI1_SS);
DFE6 1F 03 Bclr 7,0x03
(0059)
(0060) //写入过程
(0061) ReData1 = SPI1MASTERCOM(SndAddr); //写入目标地址
DFE8 87 pshA
DFE9 CD DF40 jsr _SPI1MASTERCOM
DFEC A7 01 aiS #1
DFEE 95 tSX
DFEF B7 41 stA *__r1
DFF1 E7 01 stA 1,X
(0062) ReData2 = SPI1MASTERCOM(Data); //写入内容
DFF3 E6 06 ldA 6,X
DFF5 87 pshA
DFF6 CD DF40 jsr _SPI1MASTERCOM
DFF9 A7 01 aiS #1
DFFB 95 tSX
DFFC B7 41 stA *__r1
DFFE F7 stA 0,X
(0063)
(0064) //SPI1_SS引脚拉高,取消选中
(0065) SPI1_P |= (1 << SPI1_SS);
DFFF 1E 03 Bset 7,0x03
E001 A7 03 aiS #3
E003 81 rts
_Command_Send:
time --> X+0
Data --> X+1
i --> X+2
j --> X+3
comm_set --> X+9
Length --> X+8
Send_Buf --> X+6
E004 A7 FC aiS #-4
E006 95 tSX
(0066) }
(0067)
(0068) //Command_Send------------------------------------------------------------*
(0069) //功 能: 向MF RC531发送命令 *
(0070) //参 数: Length: 要写入的字节数 *
(0071) // Send_Buf: 待发送数据应放在Send_Buf缓冲区中 *
(0072) // comm_set: 命令操作码 *
(0073) //返 回: 1 - 命令执行失败; 0 - 命令执行成功 *
(0074) //------------------------------------------------------------------------*
(0075) INT8U Command_Send(INT8U *Send_Buf, INT8U Length, INT8U comm_set)
(0076) {
E007 CD E057 jsr _Clear_FIFO
E00A 95 tSX
(0077) INT8U Data;
(0078) INT8U time;
(0079) INT8U i,j;
(0080)
(0081) //清空FIFO缓冲区
(0082) Clear_FIFO();
(0083)
(0084) //写命令参数
(0085) Write_FIFO(Send_Buf, Length);
E00B E6 08 ldA 8,X
E00D 87 pshA
E00E E6 07 ldA 7,X
E010 87 pshA
E011 E6 06 ldA 6,X
E013 87 pshA
E014 CD E0DE jsr _Write_FIFO
E017 A7 03 aiS #3
E019 95 tSX
(0086)
(0087) //设置延时时间
(0088) time = 0xff;
E01A A6 FF ldA #-1
E01C F7 stA 0,X
(0089)
(0090) //向command寄存器写控制命令码
(0091) RFRegWrite(RegCommand, comm_set);
E01D E6 09 ldA 9,X
E01F 87 pshA
E020 A6 01 ldA #1
E022 87 pshA
E023 CD DFDA jsr _RFRegWrite
E026 A7 02 aiS #2
E028 95 tSX
(0092)
(0093) //检测命令是否被执行
(0094) for(i = 0; i < time; i++)
E029 6F 02 clr 2,X
E02B 20 20 bra 0xE04D
(0095) {
E02D A6 01 ldA #1
E02F 87 pshA
E030 CD DFAD jsr _RFRegRead
E033 A7 01 aiS #1
E035 95 tSX
E036 B7 41 stA *__r1
E038 E7 01 stA 1,X
(0096) Data = RFRegRead(RegCommand); //读取Command_Reg寄存器
(0097) if(Data == 0) //判断Command_Reg寄存器是否已为0
E03A 26 03 bne 0xE03F
(0098) return 0; //成功
E03C 4F clrA
E03D 20 15 bra 0xE054
(0099) for(j = 0; j < 250; j++); //延时
E03F 6F 03 clr 3,X
E041 20 02 bra 0xE045
E043 6C 03 inc 3,X
E045 E6 03 ldA 3,X
E047 A1 FA cmp #-6
E049 25 F8 bcs 0xE043
(0100) }
E04B 6C 02 inc 2,X
E04D E6 02 ldA 2,X
E04F F1 cmp 0,X
E050 25 DB bcs 0xE02D
(0101) return 1; //失败
E052 A6 01 ldA #1
E054 A7 04 aiS #4
E056 81 rts
_Clear_FIFO:
i --> X+0
Data --> X+1
j --> X+2
E057 A7 FD aiS #-3
E059 95 tSX
(0102) }
(0103)
(0104) //Clear_FIFO--------------------------------------------------------------*
(0105) //功 能: 清空RC531的FIFO寄存器 *
(0106) //参 数: 无 *
(0107) //返 回: 1 - 命令执行失败; 0 - 命令执行成功 *
(0108) //------------------------------------------------------------------------*
(0109) INT8U Clear_FIFO(void)
(0110) {
E05A A6 09 ldA #9
E05C 87 pshA
E05D CD DFAD jsr _RFRegRead
E060 A7 01 aiS #1
E062 95 tSX
E063 B7 41 stA *__r1
E065 E7 01 stA 1,X
(0111) INT8U Data;
(0112) INT8U i,j;
(0113)
(0114) //清空FIFO缓冲区
(0115) Data = RFRegRead(RegControl); //读取Control寄存器
(0116) Data |= 0x01; //Bit0置1清FIFO
E067 AA 01 orA #1
E069 E7 01 stA 1,X
(0117) RFRegWrite(RegControl, Data); //设置Control寄存器
E06B 87 pshA
E06C A6 09 ldA #9
E06E 87 pshA
E06F CD DFDA jsr _RFRegWrite
E072 A7 02 aiS #2
E074 95 tSX
(0118)
(0119) //判断FIFO缓冲区是否被清空
(0120) for(i = 0; i < 0x10; i++)
E075 7F clr 0,X
E076 20 1F bra 0xE097
(0121) {
E078 A6 04 ldA #4
E07A 87 pshA
E07B CD DFAD jsr _RFRegRead
E07E A7 01 aiS #1
E080 95 tSX
E081 B7 41 stA *__r1
E083 E7 01 stA 1,X
(0122) Data = RFRegRead(RegFIFOLength); //读取FIFOLength寄存器
(0123) if(Data == 0) //判断FIFOLength寄存器是否已为0
E085 26 03 bne 0xE08A
(0124) return 0; //成功
E087 4F clrA
E088 20 14 bra 0xE09E
(0125) for(j = 0; j < 100; j++); //延时
E08A 6F 02 clr 2,X
E08C 20 02 bra 0xE090
E08E 6C 02 inc 2,X
E090 E6 02 ldA 2,X
E092 A1 64 cmp #100
E094 25 F8 bcs 0xE08E
(0126) }
E096 7C inc 0,X
E097 F6 ldA 0,X
E098 A1 10 cmp #16
E09A 25 DC bcs 0xE078
(0127) return 1; //失败
E09C A6 01 ldA #1
E09E A7 03 aiS #3
E0A0 81 rts
_Read_FIFO:
Length --> X+0
i --> X+1
Send_Buf --> X+4
E0A1 A7 FE aiS #-2
E0A3 95 tSX
(0128) }
(0129)
(0130) //Read_FIFO---------------------------------------------------------------*
(0131) //功 能: 读RC531的FIFO寄存器 *
(0132) //参 数: *Send_Buf *
(0133) //返 回: Length 读得数据长度 *
(0134) // Send_Buf[Length] 读出的数据置于发送,接收缓冲区中 *
(0135) //------------------------------------------------------------------------*
(0136) INT8U Read_FIFO(INT8U *Send_Buf)
(0137) {
E0A4 A6 04 ldA #4
E0A6 87 pshA
E0A7 CD DFAD jsr _RFRegRead
E0AA A7 01 aiS #1
E0AC 95 tSX
E0AD B7 41 stA *__r1
E0AF F7 stA 0,X
(0138) INT8U Length;
(0139) INT8U i;
(0140)
(0141) //获得FIFOLength缓冲区内数据长度
(0142) Length = RFRegRead(RegFIFOLength);
(0143)
(0144) //根据缓冲区长度依次读取数据
(0145) for (i = 0; i < Length; i++)
E0B0 6F 01 clr 1,X
E0B2 20 21 bra 0xE0D5
(0146) Send_Buf[i] = RFRegRead(RegFIFOData);
E0B4 A6 02 ldA #2
E0B6 87 pshA
E0B7 CD DFAD jsr _RFRegRead
E0BA A7 01 aiS #1
E0BC 95 tSX
E0BD B7 41 stA *__r1
E0BF 3F 42 clr *__r2
E0C1 E6 01 ldA 1,X
E0C3 EB 05 add 5,X
E0C5 B7 43 stA *__r3
E0C7 B6 42 ldA *__r2
E0C9 E9 04 adc 4,X
E0CB B7 42 stA *__r2
E0CD B6 41 ldA *__r1
E0CF 55 42 ldHX *__r2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -