📄 nrf24l01.asm.bak
字号:
;*********************************************************************
; nRF Library
; Author : hongyuan lai
; EMail : yuan_lai@holtek.com.tw
; Date : 2006/09/26
;*********************************************************************
#include ht82a851r.inc
#include const.inc
#include nRF24L01.inc
#include macro.asm
;=====================================================================
; nRF24L01 function for ht82a851r
;=====================================================================
;
;
;
;
;
extern TX_FIFO_STACK:byte
extern RX_FIFO_STACK:byte
extern TX_FIFO_ADDR:byte
extern TX_FIFO_ADDR1:byte
extern RX_FIFO_ADDR:byte
extern RX_FIFO_ADDR1:byte
extern ADC_FIFO_COUNTER:byte
extern DAC_FIFO_COUNTER:byte
extern TX_FIFO_ADDR_temp:byte
extern RX_FIFO_ADDR_temp:byte
extern RX_FIFO_Status:byte
extern RX_key_code:byte
extern channel_1:byte
extern channel_2:byte
extern bFlag_TX_FIFO:bit
extern bFlag_TX_FIFO_Select:bit
extern bFlag_TX_FIFO_Select1:bit
extern bFlag_RX_FIFO_Select:bit
extern bFlag_RX_FIFO_Select1:bit
extern bFlag_TX_Mode:bit
extern bFlag_RX_Mode:bit
extern bFlag_RX_SPI:bit
extern bFlag_End_SPI_Operation:bit
extern temp_num:byte
extern table_data:byte
extern COMMAND_L:byte
extern COMMAND_H:byte
extern FIFO_TEMP:byte
extern RF_number:byte
extern TX_ADDRESS_Select:byte
extern RX_ADDRESS_Select:byte
extern nRF_ADDR_value:byte
extern Delay_1:byte
extern Delay_2:byte
extern Delay_3:byte
;;***************************************************************
; nRF24L01 initialize nRF24L01 program Start!!
; This program is initialized in 851R
;***************************************************************
nRF_initial:
;--pin assignmant
clr pac.5
clr pac.6
clr pac.7
clr PCC.0
clr PCC.1
clr PCC.3 ;MCU CE pin O/P
set PCC.2 ;MCU IRQ pin I/P
clr NRF_CE ;At configuration Mode CE muse be low
kmov PGA_CTRL,080h
call MCU_16M
;--set PWR_UP and delay for 1.5ms into standby mode after into TX mode
kmov COMMAND_H,20H
kmov COMMAND_L,7AH
set bFlag_End_SPI_Operation ;set 2 SPI operation
call NRF_SPI_16bit ;send SPI Command
call Delay_1500us ;delay 1.5ms for power down -> standby
call Delay_1500us
;--for clean data in fifo
ClearFIFO:
call FlushTXFIFO ;clear TX FIFO
call FlushRXFIFO ;clear RX FIFO
call Clear_NRF_IRQ ;clear IRQ
SNZ NRF_IRQ
jmp ClearFIFO
call Delay_1500us ;delay 1.518ms
;--initial register identity
kmov temp_num,12H ;initial 18 data (1 table)
call NRF_TABLE_init ;initial nRF24L01
;--initial TX/RX ADDR
set TX_ADDRESS_Select.0 ;Write TX P0: E0 E0 E0 E0 E0 H
call nRF_TX_ADDR_WRITE
clr TX_ADDRESS_Select.0
kmov RX_ADDRESS_Select,03Fh
$1:
call nRF_RX_ADDR_WRITE
mov a,RX_ADDRESS_Select
xor a,00h
snz z
jmp $1
kmov RX_ADDRESS_Select,07Fh
$2:
call nRF_RX_ADDR_READ
mov a,RX_ADDRESS_Select
xor a,00h
snz z
jmp $2
;--variable define
kmov TX_FIFO_ADDR,(OFFSET TX_FIFO_STACK)
mov A,TX_FIFO_ADDR
mov TX_FIFO_ADDR_temp,A
add A,20H
mov TX_FIFO_ADDR1,A
kmov RX_FIFO_ADDR,(OFFSET RX_FIFO_STACK)
mov A,RX_FIFO_ADDR
mov RX_FIFO_ADDR_temp,A
ADD A,20H
mov RX_FIFO_ADDR1,A
kmov ADC_FIFO_COUNTER,02h
kmov DAC_FIFO_COUNTER,02h
clr bFlag_TX_FIFO_Select
clr bFlag_TX_FIFO_Select1
clr bFlag_RX_FIFO_Select
set bFlag_RX_FIFO_Select1
clr bFlag_RX_SPI
kmov channel_1,15h
kmov channel_2,1fh
kmov RF_number,channel_1
call RF_Channel_set
call Delay_1500us
call Delay_1500us ;delay 1.518ms
ret
;***************************************************************
; nRF24L01 TX program
;***************************************************************
nRF_TX_Transmit:
sz bFlag_TX_FIFO_Select
jmp TX_DATA_CONFIG1
jmp TX_DATA_CONFIG2
TX_DATA_CONFIG1:
sz bFlag_TX_FIFO_Select1
jmp TX_DATA_CONFIG2
kmov MP1,TX_FIFO_ADDR
call TX_Payload
clr bFlag_TX_FIFO_Select ;switch to RAM2
jmp TX_DATA_CONFIG3
TX_DATA_CONFIG2:
snz bFlag_TX_FIFO_Select1
jmp TX_DATA_CONFIG1
kmov MP1,TX_FIFO_ADDR1
call TX_Payload
set bFlag_TX_FIFO_Select ;switch to RAM1
TX_DATA_CONFIG3:
;call TX_reuse_pl
;call Pluse_CE_to_send
;call Clear_NRF_TX_IRQ
ret
;***************************************************************
; nRF24L01 RX program
;***************************************************************
nRF_RX_Receive_IRQ:
sz NRF_IRQ ;data receive by IRQ=low
jmp $1 ;data loss by IRQ=high
sz bFlag_RX_SPI ;
jmp $1
set bFlag_RX_SPI
ret
$1:
clr bFlag_RX_SPI
ret
nRF_RX_Receive:
;SZ NRF_IRQ ;IRQ = low active
;ret
snz bFlag_RX_SPI
jmp RX_DATA_CONFIG5
set pa5
sz bFlag_RX_FIFO_Select
jmp RX_DATA_CONFIG1
jmp RX_DATA_CONFIG2
;------------- FIFO Stack 1 ----------------
RX_DATA_CONFIG1:
sz bFlag_RX_FIFO_Select1
jmp RX_DATA_CONFIG2
mov A,RX_FIFO_ADDR
mov MP1,A
call RX_Payload
clr bFlag_RX_FIFO_Select ;switch to RAM2
jmp RX_DATA_CONFIG3
;------------- FIFO Stack 0 ----------------
RX_DATA_CONFIG2:
snz bFlag_RX_FIFO_Select1
jmp RX_DATA_CONFIG1
mov A,RX_FIFO_ADDR1
mov MP1,A
call RX_Payload
set bFlag_RX_FIFO_Select ;switch to RAM1
RX_DATA_CONFIG3:
call Clear_NRF_RX_IRQ
clr pa5
ret
RX_DATA_CONFIG5:
set pa6
call FlushRXFIFO
call Clear_NRF_RX_IRQ
clr pa6
ret
;***************************************************************
; nRF24L01 TX/RX mode switch program
;***************************************************************
TX_RX_Switch:
sz bFlag_TX_Mode
jmp $2
sz bFlag_RX_Mode
jmp $1
jmp $3
$1:
set NRF_CE
clr bFlag_RX_Mode
call RX_MODE
jmp $3
$2:
clr NRF_CE
clr bFlag_TX_Mode
call TX_MODE
$3:
ret
TX_mode_set:
clr NRF_CE
call TX_MODE
ret
RX_mode_set:
call RX_MODE
set NRF_CE
ret
;***************************************************************
; nRF24L01 play/rec int function
;***************************************************************
nRF_int:
kmov BP,001h ;switch to RAM Bank1
;------- RAM to USB (rec)
mov a,RX_FIFO_ADDR_temp
add a,ADC_FIFO_COUNTER
mov mp1,a
kmov RECORD_IN_L,R1
inc mp1
kmov RECORD_IN_H,R1
inc ADC_FIFO_COUNTER
inc ADC_FIFO_COUNTER
;------- USB to RAM (play)
mov A,TX_FIFO_ADDR_temp
ADD A,DAC_FIFO_COUNTER
mov MP1,A
kmov R1,PLAY_DATAL_L
inc MP1
inc DAC_FIFO_COUNTER
kmov R1,PLAY_DATAL_H
inc MP1
inc DAC_FIFO_COUNTER
;------- RAM0/RAM1 switch
mov a,ADC_FIFO_COUNTER
xor a,020h
sz z
mov a,02h
sz z
mov ADC_FIFO_COUNTER,a
snz z
jmp $3
sz bFlag_RX_FIFO_Select1
jmp $2
jmp $1
$1:
kmov RX_FIFO_ADDR_temp,RX_FIFO_ADDR
set bFlag_RX_FIFO_Select1
jmp $3
$2:
kmov RX_FIFO_ADDR_temp,RX_FIFO_ADDR1
clr bFlag_RX_FIFO_Select1
$3:
mov a,DAC_FIFO_COUNTER
xor a,020h
sz z
mov a,02h
sz z
mov DAC_FIFO_COUNTER,a
snz z
jmp $6
sz bFlag_TX_FIFO_Select1
jmp $4
jmp $5
$5:
kmov TX_FIFO_ADDR_temp,TX_FIFO_ADDR
set bFlag_TX_FIFO_Select1
jmp $6
$4:
kmov TX_FIFO_ADDR_temp,TX_FIFO_ADDR1
clr bFlag_TX_FIFO_Select1
$6:
;------- First transmission at channel 05h
mov a,DAC_FIFO_COUNTER
xor a,01eh
snz z
jmp $7
call Delay_30us
call nRF_RX_Receive_IRQ
kmov RF_number,channel_1
call RF_Channel_set
call TX_mode_set
$7:
mov a,DAC_FIFO_COUNTER
xor a,002h
sz z
call Pluse_CE_to_send
mov a,DAC_FIFO_COUNTER
xor a,01Ah ;also be 01Ch
sz z
call nRF_TX_Transmit
;------- RX mode switch
mov a,DAC_FIFO_COUNTER
xor a,008h
snz z
jmp $9
call RX_mode_set
$9:
;------- Fisrt received at channel 05h
mov a,DAC_FIFO_COUNTER
xor a,004h
snz z
jmp $10
call nRF_RX_Receive
clr bFlag_RX_SPI
$10:
;------- Second transmission at channel 0Bh
mov a,DAC_FIFO_COUNTER
xor a,010h
snz z
jmp $8
call nRF_RX_Receive_IRQ
kmov RF_number,channel_2
call RF_channel_set
call TX_mode_set
call TX_reuse_pl
call Pluse_CE_to_send
$8:
;------- RX mode switch
mov a,DAC_FIFO_COUNTER
xor a,016h
sz z
call RX_mode_set
;------- Second received at channel 0Bh
mov a,DAC_FIFO_COUNTER
xor a,012h
sz z
call nRF_RX_Receive
ret
;***************************************************************
; nRF24L01 TX/RX Mode toogle
; 1.This function is for device toogle PTX/PRX
; 2.only toogle Chip's TX/RX mode.
; 3.COMMAND_H: first send Address
; COMMADD_L: second send Register data setting
; 4.TX/RX payload
;***************************************************************
RF_Channel_set:
kmov COMMAND_H,25H
kmov COMMAND_L,RF_number
set bFlag_End_SPI_Operation
call NRF_SPI_16bit
ret
TX_MODE:
;20H + 00H = Write register command+ Register address
kmov COMMAND_H,20H ;Send SPI Command of Write Register and address is 00H
kmov COMMAND_L,7AH ;Setup config register PTX (TX Mode) bit 0=0:PTX
set bFlag_End_SPI_Operation
call NRF_SPI_16bit
ret
RX_MODE:
;20H + 00H = Write register command + Register address
kmov COMMAND_H,20H ;Send SPI Command of Write Register
kmov COMMAND_L,3BH ;Setup config register PRX (RX Mode) bit 0=1:PRX
set bFlag_End_SPI_Operation
call NRF_SPI_16bit
ret
TX_reuse_pl:
kmov COMMAND_H,11100011b
clr bFlag_End_SPI_Operation
call NRF_SPI_16bit
ret
TX_Payload:
KMOV COMMAND_H,NRF_CMD_TX_PAYLOAD
call NRF_SPI_TX_payload
ret
RX_Payload:
KMOV COMMAND_H,NRF_CMD_RX_PAYLOAD
call NRF_SPI_RX_payload
ret
Delay_1500us:
mov a,06H
mov Delay_1,a
mov a,0F0H
mov Delay_2,a
Delay_1500us_Wait:
SDZ Delay_2
JMP Delay_1500us_Wait
SDZ Delay_1
JMP Delay_1500us_Wait
RET
Delay_30us:
mov a,02CH
mov Delay_1,a
Delay_30us_Wait:
SDZ Delay_1
JMP Delay_30us_Wait
RET
;***************************************************************
; nRF24L01
; 1.Clear TX FIFO / RX FIFO / IRQ
; 2.REUSE_TX_PL
; 3.NOP Command
;***************************************************************
Clear_NRF_TX_IRQ:
kmov COMMAND_H,27H
kmov COMMAND_L,20H
set bFlag_End_SPI_Operation
call NRF_SPI_16bit ;send SPI Command
ret
Clear_NRF_RX_IRQ:
kmov COMMAND_H,27H
kmov COMMAND_L,40H
set bFlag_End_SPI_Operation
call NRF_SPI_16bit ;send SPI Command
ret
Clear_NRF_IRQ:
kmov COMMAND_H,27H
kmov COMMAND_L,70H
set bFlag_End_SPI_Operation
call NRF_SPI_16bit ;send SPI Command
ret
FlushTXFIFO:
kmov COMMAND_H,NRF_CMD_FLUSH_TX
clr bFlag_End_SPI_Operation
call NRF_SPI_16bit ;send SPI Command
call Clear_NRF_IRQ
ret
FlushRXFIFO:
kmov COMMAND_H,NRF_CMD_FLUSH_RX
clr bFlag_End_SPI_Operation
call NRF_SPI_16bit ;send SPI Command
call Clear_NRF_IRQ
ret
REUSETXPL:
kmov COMMAND_H,NRF_CMD_REUSE_TX_PL
clr bFlag_End_SPI_Operation
call NRF_SPI_16bit ;send SPI Command
ret
NOPCommand:
kmov COMMAND_H,NRF_CMD_NOP
clr bFlag_End_SPI_Operation
call NRF_SPI_16bit ;send SPI Command
ret
;***************************************************************
; nRF24L01 Pluse CE high to send at least 10u Second
; 1. 1 instruction 4 clocks
; 2. 12MHz OSC => 12/4=3MHz => 1/3 = 0.33uS (1 machine cycle)
; 3. 10uS = 0.333us x 33(ins) = 10.3..
;***************************************************************
Pluse_CE_to_send:
set NRF_CE
kmov temp_num,010H
delay_ce:
SDZ temp_num
jmp delay_ce
clr NRF_CE
ret
;***************************************************************
; 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -