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

📄 nrf24l01.asm

📁 用24L01的2.4Ghz无线控制风扇的源程序
💻 ASM
字号:
;*****************************************************************
;Function:SPI_RW
;Description:SPI read write 1 byte data
;input:spi_data
;output:spi_data
;*****************************************************************
SPI_RW:
	movmi	bit_count, #8		;loop 8 times
ReadWrite_Loop:	
	jb1	spi_data.7, MOSI_High	;MSB first
MOSI_Low:				;MSB=0
	bclr	PIN_SPI_MOSI		;MOSI output=L
	jmp	Data_Shift_Left
MOSI_High:				;MSB=1
	bset	PIN_SPI_MOSI		;MOSI output=H
Data_Shift_Left:
	rlcm	spi_data		;spi_data<<1
	bset	PIN_SPI_CLK		;generate ring edge
	jb0	PIN_SPI_MISO, MISO_Low	;read MISO pin
MISO_High:				;MISO=H
	bset	spi_data.0		;LSB=1
	jmp	CLK_Low
MISO_Low:				;MISO=L
	bclr	spi_data.0		;LSB=0
CLK_Low:
	bclr	PIN_SPI_CLK		;clk low
	decms	bit_count		;--bit_count==0?
	jmp	ReadWrite_Loop
	bclr	PIN_SPI_MOSI		;MOSI low before return
	ret

;*****************************************************************
;Function:SPI_Read_Reg
;Description:SPI read write 1 byte data from register
;input:spi_reg
;output:spi_value
;*****************************************************************
SPI_Read_Reg:
	bclr	PIN_SPI_CSN		;SPI enable
	movmm	spi_data, spi_reg_addr
	call	SPI_RW			;write register adrress 
	clr	spi_data
	call	SPI_RW			;read register value
	movmm	spi_value, spi_data
	bset	PIN_SPI_CSN		;disable SPI
	ret

;*****************************************************************
;Function:SPI_Write_Reg
;Description:SPI write 1 byte data to register
;input:spi_value,spi_reg_addr
;output:spi_status stores the value of register STATUS
;*****************************************************************
SPI_Write_Reg:
	bclr	PIN_SPI_CSN		;SPI enable
	movmm	spi_data, spi_reg_addr
	call	SPI_RW			;write register adrress
	movmm	spi_status, spi_data	;store register "Status" value
	movmm	spi_data, spi_value
	call	SPI_RW			;write register value
	bset	PIN_SPI_CSN
	ret



;*****************************************************************
;Function:SPI_Read_Buf_Any_Pipe
;Description:SPI read data from any Pipe
;input:status_temp(from "Status" register)
;output:data_buf
;*****************************************************************
SPI_Read_Buf_Any_Pipe:
	rrc	status_temp		;A<-RRC status_temp
	and	A, #07h			;get low 3 bit for Pipe Number
	add 	A, #RX_PW_P0		;get Pipe address
	mov	spi_reg_addr, A		;write the address to read from
	call	SPI_Read_Reg		;read pay load width
	movmm	pload_width, spi_value
;Rx data and store in data_buf	
	clr	Y
	movmi	Z, #data_buf		;@YZ point to data_buf
	bclr	PIN_SPI_CSN		;enable SPI
	movmi	spi_data, #RD_RX_PLOAD
	call	SPI_RW			;we are now reading Rx pay load
Receive_Loop:	
	clr	spi_data
	call	SPI_RW			;read 1 byte data
	movmm	@YZ, spi_data		;store it to data_buf
	inc	Z			;point to the next byte in data_buf
	djnz	pload_width, Receive_Loop	;data end?
	bset	PIN_SPI_CSN		;disable SPI
	ret	

	
;*****************************************************************
;Function:Tx_Mode
;Description:force the device go into Tx mode,and a CE puls trriger Tx data event
;input:none
;output:none
;*****************************************************************
Tx_Mode:
	bclr	PIN_CE_nRF24L01		;CE=0 
/*
	bclr	PIN_SPI_CSN		;Set TX address device,to Writer
	movmi	spi_data, #WRITE_REG+TX_ADDR
	call	SPI_RW
	movmi	spi_data, #TX_ADDR0_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR1_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR2_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR3_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR4_DEF
	call	SPI_RW
	bset	PIN_SPI_CSN

	nop
	nop

	bclr	PIN_SPI_CSN		;Use the same address on the RX device as the TX device
	movmi	spi_data, #WRITE_REG+RX_ADDR_P0
	call	SPI_RW
	movmi	spi_data, #TX_ADDR0_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR1_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR2_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR3_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR4_DEF
	call	SPI_RW
	bset	PIN_SPI_CSN

	nop
	nop

	movmi	spi_reg_addr, #WRITE_REG+EN_AA 
	movmi	spi_value, #0x01  	;Enable Auto.Ack:Pipe0
	call	SPI_Write_Reg
	
	movmi	spi_reg_addr, #WRITE_REG+EN_RXADDR
	movmi	spi_value, #0x01	;Enable Pipe0
	call	SPI_Write_Reg

	movmi	spi_reg_addr, #WRITE_REG+SETUP_RETR	;Tx configuration
	movmi	spi_value, #0x1a	;500us+ 86us, 10 retrans...
	call	SPI_Write_Reg

	movmi	spi_reg_addr, #WRITE_REG+RF_CH
	;movmi	spi_value, #TX_CH_DEF	;Select default RF channel 
	movmm	spi_value, channel	;select RF channel
	call	SPI_Write_Reg
	
	movmi	spi_reg_addr, #WRITE_REG+RF_SETUP
	movmi	spi_value, #0x0f	;TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
	call	SPI_Write_Reg
*/
	movmi	spi_reg_addr, #WRITE_REG+CONFIG
	movmi	spi_value, #0x0e	;Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. RX_DR enabled..
	call	SPI_Write_Reg
	ret
;**********************************************************
Write_Tx_Pload:
	bclr	PIN_SPI_CSN		;Writes data to TX payload
	movmi	spi_data, #WR_TX_PLOAD
	call	SPI_RW
	movmm	spi_data, command
	call	SPI_RW
	movmm	spi_data, local_access_code0
	call	SPI_RW
	movmm	spi_data, local_access_code1
	call	SPI_RW
	movmm	spi_data, local_access_code2
	call	SPI_RW	
	bset	PIN_SPI_CSN
	ret
;*****************************************************************
;Function:Rx_Mode
;Description:force the device go into Tx mode.
;input:none
;output:none
;*****************************************************************
nRF24L01_Configure:
	bclr	PIN_SPI_CSN		;Set TX address device,to Writer
	movmi	spi_data, #WRITE_REG+TX_ADDR
	call	SPI_RW
	movmi	spi_data, #TX_ADDR0_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR1_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR2_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR3_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR4_DEF
	call	SPI_RW
	bset	PIN_SPI_CSN

	nop
	nop

	bclr	PIN_SPI_CSN		;Use the same address as Writer
	movmi	spi_data, #WRITE_REG+RX_ADDR_P0
	call	SPI_RW
	movmi	spi_data, #TX_ADDR0_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR1_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR2_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR3_DEF
	call	SPI_RW
	movmi	spi_data, #TX_ADDR4_DEF
	call	SPI_RW
	bset	PIN_SPI_CSN

	nop
	nop

	bclr	PIN_SPI_CSN		;Use the same address on the RX device as the TX device
	movmi	spi_data, #WRITE_REG+RX_ADDR_P1
	call	SPI_RW
	movmm	spi_data, local_access_code0
	call	SPI_RW
	movmm	spi_data, local_access_code1
	call	SPI_RW
	movmm	spi_data, local_access_code2
	call	SPI_RW
	movmi	spi_data, #RX_ADDR3_DEF
	call	SPI_RW
	movmi	spi_data, #RX_ADDR4_DEF
	call	SPI_RW
	bset	PIN_SPI_CSN

	movmi	spi_reg_addr, #WRITE_REG+EN_AA 
	movmi	spi_value, #0x03  	;Enable Auto.Ack:Pipe0,Pipe1
	call	SPI_Write_Reg
	
	movmi	spi_reg_addr, #WRITE_REG+EN_RXADDR
	movmi	spi_value, #0x03	;Enable Pipe0,Pipe1
	call	SPI_Write_Reg	

	movmi	spi_reg_addr, #WRITE_REG+RF_CH
	;movmi	spi_value, #TX_CH_DEF	;Select default RF channel 
	movmm	spi_value, channel	;select RF channel
	call	SPI_Write_Reg

	movmi	spi_reg_addr, #0x20+0x11	;WRITE_REG+RX_PW_P0
	movmi	spi_value, #TX_PLOAD_WIDTH	;RX payload width 4
	call	SPI_Write_Reg

	movmi	spi_reg_addr, #WRITE_REG+RX_PW_P1
	movmi	spi_value, #RX_PLOAD_WIDTH	;RX payload width 1
	call	SPI_Write_Reg

	movmi	spi_reg_addr, #WRITE_REG+RF_SETUP
	movmi	spi_value, #0x0f	;TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
	call	SPI_Write_Reg
Rx_Mode:
	movmi	spi_reg_addr, #WRITE_REG+CONFIG
	movmi	spi_value, #0x0f	;Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX. RX_DR enabled..
	call	SPI_Write_Reg

	bset	PIN_CE_nRF24L01		;CE=1 to enable Rx
	ret

;*************************************************************
Set_New_RX_Addr:
	bclr	PIN_CE_nRF24L01
	
	bclr	PIN_SPI_CSN		;Use the same address on the RX device as the TX device
	movmi	spi_data, #WRITE_REG+RX_ADDR_P1
	call	SPI_RW
	movmm	spi_data, local_access_code0
	call	SPI_RW
	movmm	spi_data, local_access_code1
	call	SPI_RW
	movmm	spi_data, local_access_code2
	call	SPI_RW
	movmi	spi_data, #RX_ADDR3_DEF
	call	SPI_RW
	movmi	spi_data, #RX_ADDR4_DEF
	call	SPI_RW
	bset	PIN_SPI_CSN

	bset	PIN_CE_nRF24L01		;CE=1 to enable Rx
	ret

Flush_Rx_FIFO:
	bclr	PIN_SPI_CSN
	movmi	spi_data, #FLUSH_RX	;flush Rx FIFO
	call	SPI_RW
	bset	PIN_SPI_CSN
	ret
;*****************************************************************
;Function:Check_CD
;Description:Check that if carrier is detected,if so,change to the next channel
;input:none
;output:none
;*****************************************************************
Check_CD:
	jb0	F_CHECK_CD, Check_CD_Out	;not the time to do CD yet
	bclr	F_CHECK_CD
	B0BCLR	FP01IEN			;disable INT from nRF24L01
	movmi	spi_reg_addr, #CD
	call	SPI_Read_Reg	
	jb0	spi_value.0, Check_CD_End
	;call	Delay_10ms		;delay for real data to come in
	call	Ptr_Table_Inc		;Carrier detected,change to next channel
	call	Get_Channel
	bclr	PIN_CE_nRF24L01		;disable Rx when changing channel
	movmi	spi_reg_addr, #WRITE_REG+RF_CH
	movmm	spi_value, channel	;select RF channel
	call	SPI_Write_Reg
	bset	PIN_CE_nRF24L01		;enable Rx
Check_CD_End:	
	B0BSET	FP01IEN			;enable INT from nRF24L01
Check_CD_Out:	
	ret
	

⌨️ 快捷键说明

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