📄 rf.s
字号:
.module RF.c
.area text
.dbfile RF.c
.dbfunc e RFRegRead _RFRegRead fc
; ReData1 -> 0,X
; ReData2 -> 1,X
; SndData -> 2,X
; addr -> 5,X
_RFRegRead::
.dbline -1
ais #-3
tsx
.dbline 21
; //------------------------------------------------------------------------*
; //文件名:RF.C *
; //功 能:与射频读卡芯片通信相关程序。 *
; //包 含: *
; // (1)RC531的驱动函数 *
; // (2)RC531的复位及初始化 *
; // (3)RC531的读卡操作 *
; //------------------------------------------------------------------------*
; #include "RF.h"
;
; //------------------------------------------------------------------------*
; //1.RC531的驱动函数 *
; //------------------------------------------------------------------------*
;
; //RFRegRead---------------------------------------------------------------*
; //功 能: 读出给定地址的寄存器的值并返回 *
; //参 数: adder 被访问寄存器的地址 *
; //返 回: 读出的数据 *
; //------------------------------------------------------------------------*
; INT8U RFRegRead(INT8U addr)
; {
.dbline 26
; INT8U ReData1,ReData2; //接收数据变量
; INT8U SndData; //发送数据变量
;
; //处理第一个字节,bit7:MSB=1,bit6~1:addr,bit0:RFU=0
; SndData = (addr << 1);
lda 5,X
lsla
sta 2,X
.dbline 27
; SndData |= (1 << 7);
ora #-128
sta 2,X
.dbline 28
; SndData &= ~(1 << 0);
and #-2
sta 2,X
.dbline 31
;
; //SPI1_SS引脚拉低,选中从机
; SPI1_P &= ~(1 << SPI1_SS);
bclr #7,0x3
.dbline 34
;
; //读取过程
; ReData1 = SPI1MASTERCOM(SndData); //发送读取目的寄存器地址
psha
jsr _SPI1MASTERCOM
ais #1
tsx
sta *__r1
sta ,X
.dbline 35
; ReData2 = SPI1MASTERCOM(0x00); //读取结束,取回寄存器内容
clra
psha
jsr _SPI1MASTERCOM
ais #1
tsx
sta *__r1
sta 1,X
.dbline 38
;
; //SPI1_SS引脚拉高,取消选中
; SPI1_P |= (1 << SPI1_SS);
bset #7,0x3
.dbline 40
;
; return ReData2; //返回接收数据
.dbline -2
L1:
ais #3
.dbline 0 ; func end
rts
.dbsym l ReData1 0 c
.dbsym l ReData2 1 c
.dbsym l SndData 2 c
.dbsym l addr 5 c
.dbend
.dbfunc e RFRegWrite _RFRegWrite fV
; ReData2 -> 0,X
; ReData1 -> 1,X
; SndAddr -> 2,X
; Data -> 6,X
; addr -> 5,X
_RFRegWrite::
.dbline -1
ais #-3
tsx
.dbline 49
; }
;
; //RFRegWrite--------------------------------------------------------------*
; //功 能: 向给定地址的寄存器写一个值 *
; //参 数: adder 被访问寄存器的地址; Data 写入的数据 *
; //返 回: 无 *
; //------------------------------------------------------------------------*
; void RFRegWrite(INT8U addr, INT8U Data)
; {
.dbline 54
; INT8U ReData1,ReData2;
; INT8U SndAddr;
;
; //处理第一个字节,bit7:MSB=0,bit6~1:addr,bit0:RFU=0
; SndAddr = (addr << 1);
lda 5,X
lsla
sta 2,X
.dbline 55
; SndAddr &= 0x7E;
and #126
sta 2,X
.dbline 58
;
; //SPI1_SS引脚拉低,选中从机
; SPI1_P &= ~(1 << SPI1_SS);
bclr #7,0x3
.dbline 61
;
; //写入过程
; ReData1 = SPI1MASTERCOM(SndAddr); //写入目标地址
psha
jsr _SPI1MASTERCOM
ais #1
tsx
sta *__r1
sta 1,X
.dbline 62
; ReData2 = SPI1MASTERCOM(Data); //写入内容
lda 6,X
psha
jsr _SPI1MASTERCOM
ais #1
tsx
sta *__r1
sta ,X
.dbline 65
;
; //SPI1_SS引脚拉高,取消选中
; SPI1_P |= (1 << SPI1_SS);
bset #7,0x3
.dbline -2
L2:
ais #3
.dbline 0 ; func end
rts
.dbsym l ReData2 0 c
.dbsym l ReData1 1 c
.dbsym l SndAddr 2 c
.dbsym l Data 6 c
.dbsym l addr 5 c
.dbend
.dbfunc e Command_Send _Command_Send fc
; time -> 0,X
; Data -> 1,X
; i -> 2,X
; j -> 3,X
; comm_set -> 9,X
; Length -> 8,X
; Send_Buf -> 6,X
_Command_Send::
.dbline -1
ais #-4
tsx
.dbline 76
; }
;
; //Command_Send------------------------------------------------------------*
; //功 能: 向MF RC531发送命令 *
; //参 数: Length: 要写入的字节数 *
; // Send_Buf: 待发送数据应放在Send_Buf缓冲区中 *
; // comm_set: 命令操作码 *
; //返 回: 1 - 命令执行失败; 0 - 命令执行成功 *
; //------------------------------------------------------------------------*
; INT8U Command_Send(INT8U *Send_Buf, INT8U Length, INT8U comm_set)
; {
.dbline 82
; INT8U Data;
; INT8U time;
; INT8U i,j;
;
; //清空FIFO缓冲区
; Clear_FIFO();
jsr _Clear_FIFO
tsx
.dbline 85
;
; //写命令参数
; Write_FIFO(Send_Buf, Length);
lda 8,X
psha
lda 7,X
psha
lda 6,X
psha
jsr _Write_FIFO
ais #3
tsx
.dbline 88
;
; //设置延时时间
; time = 0xff;
lda #-1
sta ,X
.dbline 91
;
; //向command寄存器写控制命令码
; RFRegWrite(RegCommand, comm_set);
lda 9,X
psha
lda #1
psha
jsr _RFRegWrite
ais #2
tsx
.dbline 94
;
; //检测命令是否被执行
; for(i = 0; i < time; i++)
clr 2,X
bra L7
L4:
.dbline 95
; {
.dbline 96
; Data = RFRegRead(RegCommand); //读取Command_Reg寄存器
lda #1
psha
jsr _RFRegRead
ais #1
tsx
sta *__r1
sta 1,X
.dbline 97
; if(Data == 0) //判断Command_Reg寄存器是否已为0
bne L8
.dbline 98
; return 0; //成功
clra
bra L3
L8:
.dbline 99
clr 3,X
bra L13
L10:
.dbline 99
L11:
.dbline 99
inc 3,X
L13:
.dbline 99
lda 3,X
cmp #-6
blo L10
.dbline 100
L5:
.dbline 94
inc 2,X
L7:
.dbline 94
lda 2,X
cmp ,X
blo L4
.dbline 101
; for(j = 0; j < 250; j++); //延时
; }
; return 1; //失败
lda #1
.dbline -2
L3:
ais #4
.dbline 0 ; func end
rts
.dbsym l time 0 c
.dbsym l Data 1 c
.dbsym l i 2 c
.dbsym l j 3 c
.dbsym l comm_set 9 c
.dbsym l Length 8 c
.dbsym l Send_Buf 6 pc
.dbend
.dbfunc e Clear_FIFO _Clear_FIFO fc
; i -> 0,X
; Data -> 1,X
; j -> 2,X
_Clear_FIFO::
.dbline -1
ais #-3
tsx
.dbline 110
; }
;
; //Clear_FIFO--------------------------------------------------------------*
; //功 能: 清空RC531的FIFO寄存器 *
; //参 数: 无 *
; //返 回: 1 - 命令执行失败; 0 - 命令执行成功 *
; //------------------------------------------------------------------------*
; INT8U Clear_FIFO(void)
; {
.dbline 115
; INT8U Data;
; INT8U i,j;
;
; //清空FIFO缓冲区
; Data = RFRegRead(RegControl); //读取Control寄存器
lda #9
psha
jsr _RFRegRead
ais #1
tsx
sta *__r1
sta 1,X
.dbline 116
; Data |= 0x01; //Bit0置1清FIFO
ora #1
sta 1,X
.dbline 117
; RFRegWrite(RegControl, Data); //设置Control寄存器
psha
lda #9
psha
jsr _RFRegWrite
ais #2
tsx
.dbline 120
;
; //判断FIFO缓冲区是否被清空
; for(i = 0; i < 0x10; i++)
clr ,X
bra L18
L15:
.dbline 121
; {
.dbline 122
; Data = RFRegRead(RegFIFOLength); //读取FIFOLength寄存器
lda #4
psha
jsr _RFRegRead
ais #1
tsx
sta *__r1
sta 1,X
.dbline 123
; if(Data == 0) //判断FIFOLength寄存器是否已为0
bne L19
.dbline 124
; return 0; //成功
clra
bra L14
L19:
.dbline 125
clr 2,X
bra L24
L21:
.dbline 125
L22:
.dbline 125
inc 2,X
L24:
.dbline 125
lda 2,X
cmp #100
blo L21
.dbline 126
L16:
.dbline 120
inc ,X
L18:
.dbline 120
lda ,X
cmp #16
blo L15
.dbline 127
; for(j = 0; j < 100; j++); //延时
; }
; return 1; //失败
lda #1
.dbline -2
L14:
ais #3
.dbline 0 ; func end
rts
.dbsym l i 0 c
.dbsym l Data 1 c
.dbsym l j 2 c
.dbend
.dbfunc e Read_FIFO _Read_FIFO fc
; Length -> 0,X
; i -> 1,X
; Send_Buf -> 4,X
_Read_FIFO::
.dbline -1
ais #-2
tsx
.dbline 137
; }
;
; //Read_FIFO---------------------------------------------------------------*
; //功 能: 读RC531的FIFO寄存器 *
; //参 数: *Send_Buf *
; //返 回: Length 读得数据长度 *
; // Send_Buf[Length] 读出的数据置于发送,接收缓冲区中 *
; //------------------------------------------------------------------------*
; INT8U Read_FIFO(INT8U *Send_Buf)
; {
.dbline 142
; INT8U Length;
; INT8U i;
;
; //获得FIFOLength缓冲区内数据长度
; Length = RFRegRead(RegFIFOLength);
lda #4
psha
jsr _RFRegRead
ais #1
tsx
sta *__r1
sta ,X
.dbline 145
;
; //根据缓冲区长度依次读取数据
; for (i = 0; i < Length; i++)
clr 1,X
bra L29
L26:
.dbline 146
lda #2
psha
jsr _RFRegRead
ais #1
tsx
sta *__r1
clr *__r2
lda 1,X
add 5,X
sta *__r3
lda *__r2
adc 4,X
sta *__r2
lda *__r1
ldhx *__r2
sta ,x
tsx
L27:
.dbline 145
inc 1,X
L29:
.dbline 145
lda 1,X
cmp ,X
blo L26
.dbline 147
; Send_Buf[i] = RFRegRead(RegFIFOData);
; return Length;
lda ,X
.dbline -2
L25:
ais #2
.dbline 0 ; func end
rts
.dbsym l Length 0 c
.dbsym l i 1 c
.dbsym l Send_Buf 4 pc
.dbend
.dbfunc e Write_FIFO _Write_FIFO fV
; i -> 0,X
; Length -> 5,X
; Send_Buf -> 3,X
_Write_FIFO::
.dbline -1
ais #-1
tsx
.dbline 157
; }
;
; //Write_FIFO--------------------------------------------------------------*
; //功 能: 读RC531的FIFO寄存器 *
; //参 数: Length: 要写入的字节数 *
; // Send_Buf: 待发送数据应放在Send_Buf缓冲区中 *
; //返 回: 无 *
; //------------------------------------------------------------------------*
; void Write_FIFO(INT8U *Send_Buf, INT8U Length)
; {
.dbline 161
; INT8U i;
;
; //写入
; for (i = 0; i < Length; i++)
clr ,X
bra L34
L31:
.dbline 162
clr *__r0
lda ,X
add 4,X
sta *__r1
lda *__r0
adc 3,X
sta *__r0
ldhx *__r0
lda ,x
psha
lda #2
psha
jsr _RFRegWrite
ais #2
tsx
L32:
.dbline 161
inc ,X
L34:
.dbline 161
lda ,X
cmp 5,X
blo L31
.dbline -2
L30:
ais #1
.dbline 0 ; func end
rts
.dbsym l i 0 c
.dbsym l Length 5 c
.dbsym l Send_Buf 3 pc
.dbend
.dbfunc e RFReset _RFReset fc
; data -> 0,X
; i -> 1,X
_RFReset::
.dbline -1
ais #-2
tsx
.dbline 175
; RFRegWrite(RegFIFOData, Send_Buf[i]);
; }
;
; //------------------------------------------------------------------------*
; //2.RC531的复位及初始化 *
; //------------------------------------------------------------------------*
;
; //RFReset-----------------------------------------------------------------*
; //功 能: 端口设置和射频芯片复位 *
; //参 数: 无 *
; //返 回: 0 - 初始化成功 ;1 - 初始化失败 *
; //------------------------------------------------------------------------*
; INT8U RFReset(void)
; {
.dbline 180
; INT8U i;
; INT8U data;
;
; //控制端口设置
; RF_CTL_D |= (1 << RF_RST); //设置RF_RST为输出
bset #2,0x7
.dbline 181
; RF_CTL_D &= ~(1 << RF_IRQ); //设置RF_IRQ为输入
bclr #3,0x7
.dbline 182
; SPI1Init(); //SPI1初始化(与RC531通信)模拟主机
jsr _SPI1Init
tsx
.dbline 185
;
; //RF复位,下降沿复位
; RF_CTL_D |= 1 << RF_RST; //高电平复位
bset #2,0x7
.dbline 186
clr 1,X
bra L39
L36:
.dbline 186
L37:
.dbline 186
inc 1,X
L39:
.dbline 186
; for(i = 0; i < 200; i++); //延时,等待高电平稳定
lda 1,X
cmp #-56
blo L36
.dbline 187
; RF_CTL_D &= ~(1 << RF_RST); //初始化RF_RST为低
bclr #2,0x7
.dbline 188
clr 1,X
bra L43
L40:
.dbline 188
L41:
.dbline 188
inc 1,X
L43:
.dbline 188
; for(i = 0; i < 5000; i++); //复位后等待一定的时间,必须!
lda 1,X
cmp #-120
blo L40
.dbline 191
;
; //验证初始化是否成功
; RFRegWrite(RegPage, 0); //线性地址模式
clra
psha
psha
jsr _RFRegWrite
ais #2
.dbline 192
; RFRegWrite(0x29, 0x20); //写$20到寄存器FIFOLevel($29)
lda #32
psha
lda #41
psha
jsr _RFRegWrite
ais #2
.dbline 193
; data = RFRegRead(0x29); //读寄存器FIFOLevel($29),验证写入是否正确
lda #41
psha
jsr _RFRegRead
ais #1
tsx
sta *__r1
sta ,X
.dbline 194
; if (data == 0x20)
cmp #32
bne L44
.dbline 195
; return 0; //初始化成功
clra
bra L35
L44:
.dbline 197
; else
; return 1; //初始化失败
lda #1
.dbline -2
L35:
ais #2
.dbline 0 ; func end
rts
.dbsym l data 0 c
.dbsym l i 1 c
.dbend
.dbfunc e RC531_Init _RC531_Init fV
_RC531_Init::
.dbline -1
.dbline 206
; }
;
; //RC531_Init--------------------------------------------------------------*
; //功 能: 禁止中断及清除中断标志 *
; //参 数: 无 *
; //返 回: 无 *
; //------------------------------------------------------------------------*
; void RC531_Init(void)
; {
.dbline 207
; RFRegWrite(RegPage, 0x00); //线性地址模式
clra
psha
psha
jsr _RFRegWrite
ais #2
.dbline 208
; RFRegWrite(RegInterruptEn, 0x7f); //禁止所有中断
lda #127
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -