?? 接收 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 ;調用配置
SETB CSN
SETB PWR ; 接收命令
SETB TRX_CE
CLR TX_EN
LCALL T500US
CLR PWR ; 轉入待機模式,以便SPI操作
SETB DR
CLR TX_EN
SETB TRX_CE
SETB PWR
LCALL T500US
JNB DR,$
CLR TRX_CE
MOV R1,#24H
SETB CSN
NOP
CLR CSN
ACALL SPIW
SETB CSN
JNB DR,$
MOV R0,#60H ;數據存入60H,61H
CCRD: ACALL SPIR
MOV @R0,A
INC R0
CJNE R0,#62H,CCRD
SETB CSN
DISPLAY: PUSH A
MOV R0, #60H ;顯示緩沖區地址放入R0
MOV R2, #0f7H ;位選碼指向
DISPLAY1:MOV A, @R0 ;取出要顯示的數
MOV DPTR,#TAB ;指向換碼表首址
MOVC A, @A+DPTR
MOV P0, A ;輸出顯示
MOV A, R2 ;取出位邊碼
MOV P2, A
LCALL D1MS ;延時20MS
JB ACC.0,DISPY2 ;四位是否顯示完?未完,則繼續顯示
POP A
SJMP DISPLAY ;顯示完,從新顯示
DISPY2: inc R0 ;求下一位要顯示的數的地址
MOV A, R2 ;求下一個位選碼
Rr A
MOV R2, A
SJMP DISPLAY1
;延時20MS
D20MS: MOV R3,#27H
D20: MOV R2,#00H
DJNZ R2,$
DJNZ R3,D20
RET
;延時1MS
D1MS: MOV R3, #0f9H
D1: NOP
NOP
DJNZ R3, D1
RET
TAB: DB 3FH,6H,5BH,4FH,66H,6DH,7DH,27H,7FH,6FH,00H,54H,73H,79H,37H,3EH,07H,31H
;0, 1, 2, 3, 4, 5, 6, 7, 8, 9,NUL,n , P, E, N,(F)U, T
;*******************************
;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
;CALL 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
TF: MOV 2CH,#50
DJNZ 2CH,$
DJNZ 2BH,TF
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -