📄 nrf24l01.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 + -