?? nrf24l01.asm.bak
字號:
;*********************************************************************
; nRF Library
; Author : hongyuan lai
; EMail : yuan_lai@holtek.com.tw
; Date : 2006/09/26
;*********************************************************************
#include ht82a850r.inc
#include const.inc
#include nRF24L01.inc
#include macro.asm
;=====================================================================
; nRF24L01 function for ht82a850r
;=====================================================================
;
;
;
;
;
extern IRQ_counter:byte
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 TX_key_code:byte
extern channel_1:byte
extern channel_2:byte
extern bFlag_IRQ_Flag:bit
extern bFlag_IRQ_Flag2:bit
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_ok:bit
extern bFlag_8k_fast: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 850R
;***************************************************************
nRF_initial:
;--pin assignmant
clr pbc
clr PCC.1
clr PCC.0
clr PCC.3 ;MCU CE pin O/P
set PCC.2 ;MCU IRQ pin I/P
kmov PC,0FFH
clr NRF_CE ;At configuration Mode CE muse be low
call DAC_init
kmov PGA_CTRL,080h
call MCU_16M
;--set PWR_UP and delay for 1.5ms into standby mode after into RX mode
kmov COMMAND_H,20H
kmov COMMAND_L,3BH
set bFlag_End_SPI_Operation ;set 2 SPI operation (16 bit)
call NRF_SPI_16bit ;send SPI Command
call Delay_1500us ;delay 1.518ms for power down -> standby
call Delay_1500us ;delay 1.518ms
;--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 TX/RX common option
;--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 ; initial value 2006.08.28
kmov DAC_FIFO_COUNTER,02h
clr bFlag_RX_FIFO_Select ; initial RX SPI offset
set bFlag_RX_FIFO_Select1 ; initial play offset
set bFlag_TX_FIFO_Select ; initial TX SPI offset
clr bFlag_TX_FIFO_Select1 ; initial rec offset
set bFlag_8k_fast
kmov IRQ_counter,055h
kmov channel_1,15h
kmov channel_2,1fh
kmov RF_number,channel_1
call RF_Channel_set
set NRF_CE
call Delay_1500us ;delay 1.518ms
call Delay_1500us ;delay 1.518ms
ret
;***************************************************************
; nRF24L01 TX Examine
;***************************************************************
nRF_TX_Transmit:
snz bFlag_TX_FIFO_Select ; swapping TA_RAM
jmp TX_DATA_CONFIG1 ; 1 to TX_RAM 1
jmp TX_DATA_CONFIG2 ; 0 to TX_RAM 2
TX_DATA_CONFIG1:
sz bFlag_TX_FIFO_Select1
jmp TX_DATA_CONFIG2
kmov MP1,TX_FIFO_ADDR
call TX_Payload
set bFlag_TX_FIFO_Select ; switch to TX_RAM 2
jmp TX_DATA_CONFIG3
TX_DATA_CONFIG2:
snz bFlag_TX_FIFO_Select1
jmp TX_DATA_CONFIG1
kmov MP1,TX_FIFO_ADDR1
call TX_Payload
clr bFlag_TX_FIFO_Select ; switch to TX_RAM 1
TX_DATA_CONFIG3:
call Pluse_CE_to_send
;call Clear_NRF_TX_IRQ
ret
;***************************************************************
; nRF24L01 RX Examine
;***************************************************************
nRF_RX_Receive_IRQ:
mov a,RF_number
xor a,channel_1
snz z
jmp $1
;set pa.0
clr IRQ_counter
set bFlag_IRQ_Flag
call Clear_NRF_RX_IRQ
$1:
mov a,RF_number
xor a,channel_2
snz z
ret
kmov IRQ_counter,08h
call Clear_NRF_RX_IRQ
call Delay_30us ;for early get second IRQ
set bFlag_IRQ_Flag2 ;read second payload
ret
nRF_RX_Receive:
sz bFlag_IRQ_Flag
jmp RX_FATA_CONFIG
;sz NRF_IRQ
snz bFlag_IRQ_Flag2
ret
RX_FATA_CONFIG:
set pb2
clr bFlag_IRQ_Flag2
snz 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
set 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
clr bFlag_RX_FIFO_Select ;switch to RAM1
RX_DATA_CONFIG3:
clr pb2
;call Clear_NRF_RX_IRQ
ret
;***************************************************************
; nRF24L01 TX/RX mode switch Examine
;***************************************************************
TX_RX_Switch:
sz bFlag_TX_Mode
jmp $2
sz bFlag_RX_Mode
jmp $1
jmp $3
$1:
set NRF_CE
call RX_MODE
clr bFlag_RX_Mode
jmp $3
$2:
clr NRF_CE
call TX_MODE
clr bFlag_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
clr pa.0
;-------- 8K int fast than IRQ
mov a,DAC_FIFO_COUNTER
xor a,020h
snz z
jmp $10
sz bFlag_RX_FIFO_Select1
jmp $1
$2:
snz bFlag_RX_FIFO_Select
jmp $8
xmov RX_FIFO_ADDR_temp,RX_FIFO_ADDR
set bFlag_RX_FIFO_Select1
xmov DAC_FIFO_COUNTER,02h
kmov TX_FIFO_ADDR_temp,TX_FIFO_ADDR
set bFlag_TX_FIFO_Select1
xmov ADC_FIFO_COUNTER,02h
set pb6
jmp $10
$1:
sz bFlag_RX_FIFO_Select
jmp $8
xmov RX_FIFO_ADDR_temp,RX_FIFO_ADDR1
clr bFlag_RX_FIFO_Select1
xmov DAC_FIFO_COUNTER,02h
kmov TX_FIFO_ADDR_temp,TX_FIFO_ADDR1
clr bFlag_TX_FIFO_Select1
xmov ADC_FIFO_COUNTER,02h
clr pb6
jmp $10
$8:
xmov DAC_FIFO_COUNTER,01eh
xmov ADC_FIFO_COUNTER,01eh
jmp $10
$10:
;------- RAM to DAC (play)
xmov FIFO_TEMP,WDTS ;save WDT
xmov WDTS,01010000b ;dac write mode
mov A,RX_FIFO_ADDR_temp ;RX ADDRESS start
ADD A,DAC_FIFO_COUNTER
mov MP1,A
kmov DAC_LIMIT_L,R1
inc MP1
kmov DAC_LIMIT_H,R1
inc DAC_FIFO_COUNTER
inc DAC_FIFO_COUNTER
;------- write DAC trigger
set DAC_WR.3
nop
clr DAC_WR.3
nop
xmov WDTS,FIFO_TEMP
;------- ADC to RAM (rec)
mov a,TX_FIFO_ADDR_temp
add a,ADC_FIFO_COUNTER
mov mp1,a
kmov R1,RECORD_DATA_L
inc mp1
kmov R1,RECORD_DATA_H
inc ADC_FIFO_COUNTER
inc ADC_FIFO_COUNTER
;--------- IRQ check
snz NRF_IRQ
call nRF_RX_Receive_IRQ
;--------- TX/RX mode flag
mov a,IRQ_counter
xor a,000h
snz z
jmp $17
set pa.0
call TX_mode_set
call nRF_TX_Transmit
clr pa.0
$17:
;------- RX read
mov a,IRQ_counter
xor a,001h
sz z
call nRF_RX_Receive
;------- RX mode switch
mov a,IRQ_counter
xor a,03h
snz z
jmp $19
call Delay_30us
kmov RF_number,channel_2
call RF_Channel_set
call RX_mode_set
$19:
;------- Second transmission at channel 0Bh
mov a,IRQ_counter
xor a,08h
snz z
jmp $18
call TX_mode_set
call TX_reuse_pl
call Pluse_CE_to_send
$18:
;------- RX read
mov a,IRQ_counter
xor a,009h
snz z
jmp $22
snz bFlag_IRQ_Flag
call nRF_RX_Receive
sz bFlag_IRQ_Flag
call FlushRXFIFO
$22:
;------- RX mode switch
mov a,IRQ_counter
xor a,0Bh
snz z
jmp $20
kmov RF_number,channel_1
call RF_Channel_set
call RX_mode_set
clr bFlag_IRQ_Flag
$20:
;-------auto handshake for loss channel1 IRQ
mov a,IRQ_counter
xor a,014h
snz z
jmp $21
set pb4
kmov RF_number,channel_2
call RF_Channel_set
call RX_mode_set
clr pb4
$21:
inc IRQ_counter
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 ;get status register
call NRF_SPI_TX_payload
ret
RX_Payload:
KMOV COMMAND_H,NRF_CMD_RX_PAYLOAD ;get status register
call NRF_SPI_RX_payload
ret
DAC_init:
set USVC.7
mov a,WDTS
mov FIFO_TEMP,a
mov a,01010000b
mov WDTS,a
clr [02DH]
mov a,80h
mov [02EH],a
nop
Set [02FH].3
nop
clr [02FH].3
clr DA_L_ENB ;DA Left Channel Enable
nop
clr DA_R_ENB ;DA Right Channel Enable
nop
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,02AH
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 Pulse 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,0DH
delay_ce:
SDZ temp_num
jmp delay_ce
clr NRF_CE
ret
;***************************************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -