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

📄 nrf24l01.asm.bak

📁 Holtek audio decoder , Dongle 参考范例
💻 BAK
📖 第 1 页 / 共 2 页
字号:
;*********************************************************************
;	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 + -