📄 发送nrf905_test汇编.asm
字号:
;无线遥控,NRF905,STC2052AD,12M,20071121
;AT89C2051
;发送模块 ; ;
;定义相应管脚
CSN EQU P3.4 ; ;SPI使能
SCK EQU P3.5
MOSI EQU P3.7
MISO EQU P1.0
PWR EQU P1.5
TRX_CE EQU P1.6
TX_EN EQU P1.7
DR EQU P1.1
AM EQU P1.2
CD EQU P1.3
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV SP,#70H
SETB PWR
SETB AM
SETB DR
SETB CD
SETB CSN
CLR SCK
CLR TX_EN
CLR TRX_CE
LCALL PZRE ;调用配置
LOOP: SETB TRX_CE
CLR TX_EN
JNB DR,$ ;等待接收
MOV R0,#60H ;读2个字节存入60H-61H
MOV R1,#24H ;读接收数据命令
CLR TRX_CE
SETB CSN
NOP
CLR CSN
ACALL SPIW
CCRD: ACALL SPIR
MOV @R0,A
INC R0
CJNE R0,#62H,CCRD
INC 60H ;要发送的数据(2字节)
INC 61H
SETB CSN
MOV R5,#200
DJNZ R5,$
LCALL SEND_D ;调用发射
JNB DR,$
SJMP LOOP
;*******************************
;NRF905
PZRE: ; ;RF配置寄存器为固定的10字节 ; ;
SETB CSN
NOP
CLR CSN ; ; ;使能置底开始写状态字
MOV R1,#00H ; ; ;写RF配置寄存器的指令00H
LCALL SPIW
; ; ;0 ;
MOV R1,#4CH ;CH_NO ; ; 频偏地址,默认为(这个0在下面的CHNO[BIT8]) 0110_1100(即433.2MHZ)
LCALL SPIW ; ; ;默认为6CH ; ;
; ; ;计算在什么频段自己去算,有公式 ; ;
; ; ;不算也可以,两个或(更多的)NRF905配置成一样,就行了。哈。。。 ; ; ;1 ; ;
MOV R1,#0CH ; ;+6DB ;BIT7,6 ;NOP ; ;BIT5 ;AUTO RETRAN ;0不重发 ;1重发
LCALL SPIW ; ; ;BIT4 ;RX RED_PWR ;0=正常模式1=低功耗模式至(1.6MA)
; ; ;BIT3,2 ; ;PA_PWR ; ;00为-10DBM ; ;01=-2DBM ; ;10=+6DBM ;11=+10DBM
; ; ;BIT1 ; ;HEREQ_PLL ;=0/433MHZ ;=1/868/915MHZ ; ;
; ; ;BIT0 ; ;CHNO[BIT8]((上面的1位在这)因为它CH_NO为9位。
; ; ;由参考表得来,若900MHZ以上则此位为1,900MHZ以下此为0
; ; ;例 ; ; ;0CH[0000_1100] ; ;正常模式,功率+10DBM,频点433MHZ
; ; ;00H[0000_0000] ; ;正常模式,功率-10DBM,频点433MHZ
; ; ;..自已喜欢看着组合 ; ;
; ; ;2 ;地址字节数
MOV R1,#44H ; ; ;BIT7 ;NOP ; ;6,5,4 ;TX_AFW ; ;3 ;NOP ; ;2,1,0 ;RX_AFW
LCALL SPIW ;
; ; ;TX_AFW ;001 ;1字节 ;100 ; 4字节 ; ;
; ; ;RX_AFW ;001 ;1字节 ;100 ; 4字节 ; ;
; ; ;44为TX地址宽度4字节,RX地址宽度4字节 ; ;00000000-FFFFFFFF ;(4294967295)台机子。
; ; ;11为TX地址宽度1字节,RX地址宽度1字节 ; ;00-FF(256)台机子 ;
; ; ;例 ; ; ;44H ; ;[#100_0100] ; ;发射4字节,接收4字节 ; ;
; ; ;11H ; ;[#001_0001] ; ;发射1字节,接收1字节 ; ;
; ; ;3 ;要接收的字节数
MOV R1,#02H ; ;JIE2ZIJIE ;BIT7,6 ; NOP ; ;BIT5,4,3,2,1,0 ; RX_PWR
LCALL SPIW ; ;00001 ; ;1字节接收有效 ; ;00010 ; ;2字节接收有效 ; ;10000 ; ;32字节接收有效 ; ;
; ; ;例 ;[##10_0000]=20H ;即32字节接收有效
; ; ;[##00_0010]=02H ; ;即2字节接收有效
; ;******* ;4 ;要发射的字节数
MOV R1,#02H ; ;BIT7,6 ,NOP ;BIT5,4,3,2,1,0 ; TX_PWR
LCALL SPIW ; ; ; ;00001 ; ;1字节发射有效 ; ;00010 ; ;2字节发射有效 ; ;10000 ; ;32字节发射有效 ; ;
; ; ;例 ; ; ;[##10_0000]=20H ;即32字节发射有效
; ; ;{##00_0010]=02H ;即2字节发射有效
; ;5,6,7,8 ; ;这个为此NRF905的地址每个都不同 ; ;每当收到一个TX的地址比较是否是自己的。????
; ; ;5 ;地址的第一个字节
MOV R1,#02H ; ; ;RX地址0 ; 默认0E7H
LCALL SPIW ; ;例 ; 也说是说可以为每个模块写入自己特定的编号
; ; ;在群发系统中有多个子模块,为防发生数据碰撞,
; ; ;模块接收到的地址与自己的地址比较 ; ;正确后方做应答,否则不应答
; ; ;例
; ; ;5,6,7,8小项中写入01 00 00 00 则此模块为01号
; ; ;只有在主机发送地址中包含了01 00 00 00的数据方做此模块方做应答.
; ; ;6 ; ;地址的第2个字节
MOV R1,#00H ; ;RX地址1,默认0E7H
LCALL SPIW ;
; ; ;7 ;地址的第3个字节
MOV R1,#00H ; ;RX地址2,默认0E7H
LCALL SPIW ;
; ; ;8 ; ;地址的第4个字节
MOV R1,#00H ;
LCALL SPIW ; ;RX地址3,默认0E7H
; ;9 ;校验设置
MOV R1,#58H ; ;BIT7 ; CRC_MODE模式 ;=0八位CRC校验 /=1十六位CRC校验 ;(默认=1)
LCALL SPIW ; ;BIT6 ; CRC校验允计 ;=0不允许校验 /=1充许校验 ;(默认=1)
; ;BIT5,4,3 ; XOF[2 ; 0] ;000=4MHZ ;001=8MHZ ; ;010=12MHZ ; ;011=16MHZ ; ;111=20MHZ
; ; ;晶体振荡器,必须与外部晶振来设计 ; ;
; ; ;BIT2 ; UP_CLK_EN ; ;=0没有外部时钟 /=1外部时钟信号使能 ;
; ; ;输出时钟使能
; ;BIT1,0 ; UP_CLK_FREQ[1 ; 0] ; ;00=4MHZ ; ;01=2MHZ ; ;10=1MHZ ; ;11=500KHZ ;
; ; ;输出时钟频率
; ; ;
; ; ;
; ; ;例 ; ; ;[0101_1000]=58H ; ;8位CRC校验,CRC校验允许,板上的NRF905用的晶振16MHZ,
; ; ;没有外部时钟(即用的是自己的晶振)。输出频率为4MHZ。
SETB CSN
RET
;****************************
; ;NRF905_SPI指令
;1 ;写配置寄存器 ; 00H
; ;格式0000_AAAA ; ;其中AAAA指的是0-9的寄存器
; ;例 ; 你可以专门改定寄存中的某一项,如改变功率
; ;在此前的功率为-10DBM
; ;命令 ; MOV R1,#01H ;ACALL SPIW ; ;指向配置寄存器的01地址
; ;紧接数据 ; MOV R1,#0CH ;ACALL SPIW ; ;把0CH的数据写入01地址中
; ; ; ;此时RF_REGIT中的发射功率由-10DBM改到+10DBM
;2 ;读配置寄存器 ; 01H
;3 ;写发射数据命令 ; 20H
;4 ;读发射数据命令 ; 21H
;5 ;写发射地址命令 ; 22H ; ;默认为E7,E7,E7,E7 ; ;
;6 ;读发射地址命令 ; 23H
;7 ;读接收数据命令 ; 24H
; ;这个个快速配置寄存器,会让人误解?
; ;我个人觉得应写成
; ;<<中心频率频偏设置寄存器>>,更好理解。
;8 ;快速配置寄存器 ; 1000_PPHC ; ;也就是说这个指令为16BIT字长 ; ;不能单独的写一个8BIT就算完事???.
; ;PP指的是PA_PWR ; ;00,01,10,11 ;-10DBM/-2DBM/+6DBM/+10DBM
; ;H指的是 HFREQ_PLL ; ;0=通道频差100KHZ ; ;=1通道频差200KHZ
; ;C指的是CH_NO CCCCCCCCC(9BIT)
; ;例1 ; ; ;它的指令为80H,4CH ; ;工作在433.0MHZ,频差100KHZ,
; ;MOV R1,#80H
; ;ACALL SPIW
; ;MOV R1,#4CH
; ;ACALL SPIW
; ;例2 ; 它的指令为80H,7BH ; ;在工作在433.7MHZ,频差100KHZ
; ;MOV R1,#80H
; ;ACALL SPIW
; ;MOV R1,#7BH
; ;ACALL SPIW
;9 ; ;
; ;1)状态 寄存器 ; ;(内部地址)不知道???供查询用。
;7 ; AM ; ;BIT6 ; NOP ; ;BIT5 ; DR ; ;BIT4-0 ; NOP
; ;初始不定
; ;2)RF配置 寄存器
; ;3)发送地址 寄存器
; ;4)发送有效数据寄存器
; ;5)接收有效数据寄存器
;************************
SEND_D: CLR CSN
MOV R1,#22H ;写入四个发射地址 ;3456
ACALL SPIW
MOV R1,#03H
ACALL SPIW
MOV R1,#04H
ACALL SPIW
MOV R1,#05H
ACALL SPIW
MOV R1,#06H
ACALL SPIW
SETB CSN
NOP
NOP
CLR CSN
;写入2个要发送的数据
MOV R1,#20H
ACALL SPIW ; ;
MOV R1,60H
ACALL SPIW
MOV R1,61H
ACALL SPIW
SETB CSN
SETB TX_EN
SETB TRX_CE ;充许发送,芯片开始调制载波并发送 ; ;
RET
;*****************
SPIW: ;写操作
MOV A,R1
MOV R5,#08H
SPIW2: RLC A
MOV MOSI,C
SETB SCK
NOP
NOP
CLR SCK
DJNZ R5,SPIW2
RET
;*************
SPIR: ; ;读操作
MOV R5,#08H
SPIR2: SETB SCK
MOV C,MISO
RLC A
NOP
NOP
CLR SCK
DJNZ R5,SPIR2
RET
;************************
DELAY: MOV R7,#200
D: MOV R2,#200
DJNZ R2,$
DJNZ R7,D
RET
;*****************
T500US: MOV 2BH,#10
TF1: MOV 2CH,#50
DJNZ 2CH,$
DJNZ 2BH,TF1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -