?? nrf24l01.asm.bak
字號:
; nRF24L01 SPI initial
;
; 1.For config these register ,we has to send data consist of
; register ADDRESS and register value.
; Ex:0F | 03H => register value | register address
;
; 2.This function only for initial nRF24L01 v1.2
; 3.Write Register Command's common start bit is 001x xxxx.
;***************************************************************
CODEz .section PAGE 'code'
nRF2401_table: ;20H=Write Register command,01~17H=Register Address,High byte=Setting register value
DW 0021H ;20H+01H,Enable Auto Ack P0
DW 0122H ;20H+02H,Enable RX Address P0 (can receive data from pipe number 1,2,3.)
DW 0323H ;20H+03H,setup address width=5 byte
DW 0024H ;20H+04H,Auto RT dalay=1000+86us,ARC=3 times
DW 0525H ;20H+05H,RF channel default value
DW 0F26H ;20H+06H,RF SETUP,2Mbps,0dbm ,defaulr value
DW 7027H ;20H+07H,status register clear IRQ
DW 0C32CH ;20H+07H,P2 Address setting
DW 0C42DH ;20H+07H,P3 Address setting
DW 0C52EH ;20H+07H,P4 Address setting
DW 0C62FH ;20H+07H,P5 Address setting
DW 2031H ;20H+11H,pipe 0 payload 32byte
DW 2032H ;20H+12H,pipe 1 payload 32byte
DW 2033H ;20H+13H,pipe 2 payload 32byte
DW 2034H ;20H+14H,pipe 3 payload 32byte
DW 2035H ;20H+15H,pipe 4 payload 32byte
DW 2036H ;20H+16H,pipe 5 payload 32byte
DW 1137H ;20H+17H,FIFO
NRF_TABLE_init:
mov A,LOW(nRF2401_table)
mov TBLP,A
mov A,HIGH(nRF2401_table)
mov TBHP,A
clr UCC.@UCC_SYSCLK ;12MHz SYSCLK
set MODE_CTRL.@MODECTRL_SIOCSEN ;SPI Chip Select Function Enable
set MODE_CTRL.@MODECTRL_SIOCPOL ;rising edge change data
clr SBCR
;---Master Mode, SCLK=fSIO
clr SBCR.@SBCR_M1
clr SBCR.@SBCR_M0
clr SBCR.@SBCR_CKS ;Fsio=Fsys/2
NRF_SPI_Table:
clr SBCR.@SBCR_TRF
set SBCR.@SBCR_MLS ;MSB shift first
set SBCR.@SBCR_SBEN ;SPI Enable
clr INTC1.@INTC1_ESII ;SPI Interrupt Disable
set SBCR.@SBCR_CSEN ;start SPI enable
TABRDC table_data
XMOV SBDR,table_data ;Low byte first MSB first
$1: ;Send operation SPI Command
SNZ SBCR.@SBCR_TRF
JMP $1
CLR SBCR.@SBCR_TRF
NOP
XMOV SBDR,TBLH ;High byte MSB first
$2: ;Send operation Write SPI Data
SNZ SBCR.@SBCR_TRF
JMP $2
CLR SBCR.@SBCR_TRF
clr SBCR.@SBCR_CSEN ;End SPI operation
clr SBCR.@SBCR_SBEN ;SPI Disable
inc TBLP
SDZ temp_num ;Table end?
jmp NRF_SPI_Table
ret
;***************************************************************
; nRF24L01 SPI 16bit
;
; 1.only for read/write register or 2-Byte operation
; 2.clr/set bFlag_End_SPI_Operation.
; If we are not have any payload to send/receiver please clr,else set.
; 3.The first 8 bit will save in COMMAND_H from SBDR
; The second 8 bit will save in COMMAND_L from SBDR
;***************************************************************
NRF_SPI_16bit:
call SPI_EN
XMOV SBDR,COMMAND_H
$3:
SNZ SBCR.@SBCR_TRF
JMP $3
CLR SBCR.@SBCR_TRF
XMOV COMMAND_H,SBDR
snz bFlag_End_SPI_Operation ; 1:16 bit mode, 0:8 bit mode
jmp $5
XMOV SBDR,COMMAND_L
$4:
SNZ SBCR.@SBCR_TRF
JMP $4
CLR SBCR.@SBCR_TRF
XMOV COMMAND_L,SBDR
$5:
clr SBCR.@SBCR_CSEN ;End SPI operation
clr SBCR.@SBCR_SBEN ;SPI Disable
ret
;***************************************************************
; nRF24L01 SPI payload (32Byte) TX Payload Only
; 1.only use in TX payload transfer.
; 2.33 byte to send. 1 byte for command ,32 byte for payload data.
;***************************************************************
NRF_SPI_TX_payload:
KMOV temp_num,Payload_Size ;For payload loop 32 times
call SPI_EN
;--Send TX command
KMOV SBDR,NRF_CMD_TX_PAYLOAD
$2:
snz SBCR.@SBCR_TRF
jmp $2
clr SBCR.@SBCR_TRF
kmov BP,001h
kmov R1,VIOP
Payload_loop_TX:
KMOV SBDR,R1
;$5:
; snz SBCR.@SBCR_TRF
; jmp $5
NOP
nop
inc MP1
CLR SBCR.@SBCR_TRF
SDZ temp_num
jmp Payload_loop_TX
clr SBCR.@SBCR_CSEN ;End SPI operation
clr SBCR.@SBCR_SBEN ;SPI Disable
clr BP
ret
;***************************************************************
; nRF24L01 SPI payload (32Byte) RX Payload Only
; 1.only use in RX payload transfer.
; 2.33 byte to send. 1 byte for command ,32 byte for payload data.
;***************************************************************
NRF_SPI_RX_payload:
KMOV temp_num,Payload_Size ;For payload loop times
inc temp_num
call SPI_EN
;--Send RX command
KMOV SBDR,NRF_CMD_RX_PAYLOAD
$3:
snz SBCR.@SBCR_TRF
jmp $3
kmov RX_FIFO_Status,SBDR
CLR SBCR.@SBCR_TRF
kmov BP,001h
jmp Payload_loop_RX1
Payload_loop_RX:
KMOV R1,SBDR
inc MP1
clr TRF
Payload_loop_RX1:
KMOV SBDR,R1
;$6:
; snz TRF
; jmp $6
;NOP
;NOP ;240us at 12MHz
;NOP
NOP
;CLR TRF
SDZ temp_num
jmp Payload_loop_RX
clr CSEN ;End SPI operation
clr SBEN ;SPI Disable
clr BP
ret
SPI_EN:
clr UCC.@UCC_SYSCLK ;12MHz SYSCLK
set SIO_CSEN ;SPI Chip Select Function Enable
set SIO_CPOL ;rising edge change data
clr SBCR
;--SCLK=fSIO
clr M1
clr M0
clr CKS ;Fsio=Fsys/2
clr TRF
set MLS ;MSB shift first
set SBEN ;SPI Enable
clr intc1.@INTC1_ESII ;SPI Interrupt Disable
set CSEN ;Chip Select Enable,Start SPI to send TX payload data
ret
;***************************************************************
; nRF24L01 SPI Config address of TX transmit and RX receive.
; 1.Config/Change TX point to RX point 0 ~ 5 Address.
; 2.Config/Change RX point Address.
; 3.Before use this function,must to check the address value.
; 4.How to use:
; a.set TX_ADDRESS_Select.BitNum
; b.call nRF_ADDR_WRITE
; c.clr TX_ADDRESS_Select.BitNum
;***************************************************************
CODE2 .section PAGE 'code'
TX_to_P0_ADDR_Table: ;TX_ADDRESS_Select.0
DC 0E1h,0E3h,0E5h,0E7h,0E9h;
TX_to_P1_ADDR_Table: ;TX_ADDRESS_Select.1
DC 0C2h,0C3h,0C4h,0C5h,0C6h;
TX_to_P2_ADDR_Table: ;TX_ADDRESS_Select.2
DC 0C2h,0C3h,0C4h,0C5h,0C7h;
TX_to_P3_ADDR_Table: ;TX_ADDRESS_Select.3
DC 0C2h,0C3h,0C4h,0C5h,0C8h;
TX_to_P4_ADDR_Table: ;TX_ADDRESS_Select.4
DC 0C2h,0C3h,0C4h,0C5h,0C9h;
TX_to_P5_ADDR_Table: ;TX_ADDRESS_Select.5
DC 0C2h,0C3h,0C4h,0C5h,0CAh;
RX_P0_ADDR_Table: ;RX_ADDRESS_Select.0
DC 0E1h,0E3h,0E5h,0E7h,0E9h;
RX_P1_ADDR_Table: ;RX_ADDRESS_Select.1
DC 0C2h,0C3h,0C4h,0C5h,0C6h;
RX_P2_ADDR_Table: ;RX_ADDRESS_Select.2
DC 0C7h;
RX_P3_ADDR_Table: ;RX_ADDRESS_Select.3
DC 0C8h;
RX_P4_ADDR_Table: ;RX_ADDRESS_Select.4
DC 0C9h;
RX_P5_ADDR_Table: ;RX_ADDRESS_Select.5
DC 0CAh;
nRF_TX_ADDR_WRITE:
mov a,TX_ADDRESS_Select
xor a,00h
sz z
ret ;not set any TX_ADDR to write
KMOV temp_num,Address_Size ;For Address loop 5 times
call SPI_EN
;=== Address define set for configuation
snz TX_ADDRESS_Select.0
jmp $1
mov a,low TX_to_P0_ADDR_Table
mov TBLP,a
mov a,high TX_to_P0_ADDR_Table
mov TBHP,a
mov a,30h
MOV SBDR,a
jmp $6
;----------------------------------
$1:
snz TX_ADDRESS_Select.1
jmp $2
mov a,low TX_to_P1_ADDR_Table
mov TBLP,a
mov a,high TX_to_P1_ADDR_Table
mov TBHP,a
mov a,30h
MOV SBDR,a
jmp $6
;----------------------------------
$2:
snz TX_ADDRESS_Select.2
jmp $3
mov a,low TX_to_P2_ADDR_Table
mov TBLP,a
mov a,high TX_to_P2_ADDR_Table
mov TBHP,a
mov a,30h
MOV SBDR,a
jmp $6
;----------------------------------
$3:
snz TX_ADDRESS_Select.3
jmp $4
mov a,low TX_to_P3_ADDR_Table
mov TBLP,a
mov a,high TX_to_P3_ADDR_Table
mov TBHP,a
mov a,30h
MOV SBDR,a
jmp $6
;----------------------------------
$4:
snz TX_ADDRESS_Select.4
jmp $6
mov a,low TX_to_P4_ADDR_Table
mov TBLP,a
mov a,high TX_to_P4_ADDR_Table
mov TBHP,a
mov a,30h
MOV SBDR,a
jmp $6
;----------------------------------
$5:
snz TX_ADDRESS_Select.5
ret
mov a,low TX_to_P5_ADDR_Table
mov TBLP,a
mov a,high TX_to_P5_ADDR_Table
mov TBHP,a
mov a,30h
MOV SBDR,a
jmp $6
;----------------------------------
;------ Write adress value --------
$6:
snz TRF
jmp $6
CLR TRF
ADDR_loop_TX:
TABRDC table_data
KMOV SBDR,table_data
$7:
snz TRF
jmp $7
inc TBLP
CLR TRF
SDZ temp_num
jmp ADDR_loop_TX
clr CSEN ;End SPI operation
clr SBEN ;SPI Disable
ret
;==========================================================
nRF_RX_ADDR_WRITE:
KMOV temp_num,Address_Size ;For P0 P1 Address loop 5 times
call SPI_EN
snz RX_ADDRESS_Select.0
jmp $1
clr RX_ADDRESS_Select.0
mov a,low RX_P0_ADDR_Table
mov TBLP,a
mov a,high RX_P0_ADDR_Table
mov TBHP,a
mov a,02Ah
MOV SBDR,a
jmp $6
;----------------------------------
$1:
snz RX_ADDRESS_Select.1
jmp $2
clr RX_ADDRESS_Select.1
mov a,low RX_P1_ADDR_Table
mov TBLP,a
mov a,high RX_P1_ADDR_Table
mov TBHP,a
mov a,02Bh
MOV SBDR,a
jmp $6
;----------------------------------
$2:
snz RX_ADDRESS_Select.2
jmp $3
clr RX_ADDRESS_Select.2
KMOV temp_num,01h
mov a,low RX_P2_ADDR_Table
mov TBLP,a
mov a,high RX_P2_ADDR_Table
mov TBHP,a
mov a,02Ch
MOV SBDR,a
jmp $6
;----------------------------------
$3:
snz RX_ADDRESS_Select.3
jmp $4
clr RX_ADDRESS_Select.3
KMOV temp_num,01h
mov a,low RX_P3_ADDR_Table
mov TBLP,a
mov a,high RX_P3_ADDR_Table
mov TBHP,a
mov a,2Dh
MOV SBDR,a
jmp $6
;----------------------------------
$4:
snz RX_ADDRESS_Select.4
jmp $5
clr RX_ADDRESS_Select.4
KMOV temp_num,01h
mov a,low RX_P4_ADDR_Table
mov TBLP,a
mov a,high RX_P4_ADDR_Table
mov TBHP,a
mov a,2Eh
MOV SBDR,a
jmp $6
;----------------------------------
$5:
snz RX_ADDRESS_Select.5
ret
clr RX_ADDRESS_Select.5
KMOV temp_num,01h
mov a,low RX_P5_ADDR_Table
mov TBLP,a
mov a,high RX_P5_ADDR_Table
mov TBHP,a
mov a,2Fh
MOV SBDR,a
jmp $6
;----------------------------------
;------ Write adress value --------
$6:
snz TRF
jmp $6
CLR TRF
ADDR_loop_RX:
TABRDC table_data
KMOV SBDR,table_data
$7:
snz TRF
jmp $7
inc TBLP
CLR TRF
SDZ temp_num
jmp ADDR_loop_RX
clr CSEN ;End SPI operation
clr SBEN ;SPI Disable
ret
;***************************************************************
; nRF24L01 TX/RX address read.
; 1.How to use:
; a.set RX_ADDRESS_Select.BitNum
; b.call nRF_RX_ADDR_READ
; c.clr RX_ADDRESS_Select.BitNum
;
;***************************************************************
nRF_RX_ADDR_READ:
kmov temp_num,Address_Size
call SPI_EN
kmov mp1,(OFFSET nRF_ADDR_value)
snz RX_ADDRESS_Select.0 ;RX_ADDR_P0(0AH)
jmp $1
clr RX_ADDRESS_Select.0
mov a,0Ah
MOV SBDR,a
jmp $7
;----------------------------------
$1:
snz RX_ADDRESS_Select.1 ;RX_ADDR_P1(0BH)
jmp $2
clr RX_ADDRESS_Select.1
mov a,0BH
MOV SBDR,a
jmp $7
;----------------------------------
$2:
snz RX_ADDRESS_Select.2 ;RX_ADDR_P2(0CH)
jmp $3
clr RX_ADDRESS_Select.2
mov a,0CH
MOV SBDR,a
kmov temp_num,01h
jmp $7
;----------------------------------
$3:
snz RX_ADDRESS_Select.3 ;RX_ADDR_P3(0DH)
jmp $4
clr RX_ADDRESS_Select.3
mov a,0DH
MOV SBDR,a
kmov temp_num,01h
jmp $7
;----------------------------------
$4:
snz RX_ADDRESS_Select.4 ;RX_ADDR_P4(0EH)
jmp $5
clr RX_ADDRESS_Select.4
mov a,0EH
MOV SBDR,a
kmov temp_num,01h
jmp $7
;----------------------------------
$5:
snz RX_ADDRESS_Select.5 ;RX_ADDR_P5(0FH)
jmp $6
clr RX_ADDRESS_Select.5
mov a,0FH
MOV SBDR,a
kmov temp_num,01h
jmp $7
;----------------------------------
$6:
snz RX_ADDRESS_Select.6 ;TX_ADDR(10H)
ret
clr RX_ADDRESS_Select.6
mov a,10H
MOV SBDR,a
jmp $7
;----------------------------------
;------ Read adress value --------
$7:
snz TRF
jmp $7
kmov RX_FIFO_Status,SBDR
CLR TRF
read_addr_loop:
KMOV SBDR,R1
$8:
snz TRF
jmp $8
KMOV R1,SBDR
inc MP1
CLR TRF
SDZ temp_num
jmp read_addr_loop
clr CSEN ;End SPI operation
clr SBEN ;SPI Disable
ret
;*****************************************************************
; switch MCU sys from 12MHz to 16MHz beside USB clock
;*****************************************************************
MCU_16M:
mov a,UCC
or a,020h
mov UCC,a
ret
Public TX_RX_Switch
Public nRF_TX_Transmit
Public nRF_RX_Receive
Public nRF_initial
Public nRF_int
Public MCU_16M
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -