⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nrf24l01.asm

📁 Holtek audio decoder , headset 参考范例
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*********************************************************************
;	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		
		call	TX_mode_set
		call	nRF_TX_Transmit
$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

;***************************************************************
;		nRF24L01 SPI initial 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -