📄 spi.asm
字号:
;=============================================
; SPI control subroutines
;Function: Read from or write to SPI
;note:读写SPI及对nRF24L01的初始化配置是参照给出的参考firmware写的
;=============================================
.include "SPI.inc"
.include "inc.inc"
;-------------Constants------------------------
c_fetch_MISO = 0x01
;c_ADDR_Length = 0x05
c_tx_payload_width == 0x04
c_tx_fan_addr3 = 0x07
c_tx_fan_addr4 = 0x08
c_tx_writer_addr0 = 0x40
c_tx_writer_addr1 = 0x50
c_tx_writer_addr2 = 0x60
c_tx_writer_addr3 = 0x70
c_tx_writer_addr4 = 0x80
c_RF_0db = 0x0f
c_RF_18db = 0x09
;-------------Variables------------------------
.area SPI_Data(data)
byte:: .ds 1
bit_ctrl: .ds 1
;status .ds 1 ;store status register content in nRF24L01
;byte_ctrl: .ds 1
;reg .ds 1 ;the nRF24L01 register to be write to or read from (share)
reg_name:: .ds 1
reg_value:: .ds 1
;RF_channel:: .ds 1
;-------------Code-----------------------------
.area SPI_Code(code)
;****************************************
; Function: nRF24L01_Configuration
; Description:
; This function initializes one nRF24L01 device set TX address,
;set RX address for auto.ack,fill TX payload, select RF channel, datarate & TX pwr.
;
;
; ToDo: set PWR_UP, CRC(2 bytes) is enabled, & PRIM:TX. One high pulse(>10us) on CE will now send this
; packet and expect an acknowledgment from the RX device.
;****************************************
nRF24L01_Configuration::
call Write_tx_addr_Fan
lda #WRITE_REG+#EN_AA ; Enable Auto.Ack:Pipe0
sta reg_name
lda #0x01
sta reg_value
call SPI_RW_Reg
call Delay_5us
lda #WRITE_REG+#EN_RXADDR ;Enable Data Pipe0
sta reg_name
lda #0x01
sta reg_value
call SPI_RW_Reg
call Delay_5us
lda #WRITE_REG+#SETUP_RETR ; 500us + 86us, 10 retransmit
sta reg_name
lda #0x1a
sta reg_value
call SPI_RW_Reg
call Delay_5us
lda #0
sta channel_count
call Look_up_Freq_table
sta reg_value
call Select_RF_Channel
call Delay_5us
lda #WRITE_REG+#RX_PW_P0
sta reg_name
lda #c_tx_payload_width
sta reg_value
call SPI_RW_Reg
call Delay_5us
lda #WRITE_REG+#RF_SETUP ;TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
sta reg_name
lda #c_RF_0db
sta reg_value
call SPI_RW_Reg
call Delay_5us
lda #WRITE_REG+#STATUS
sta reg_name
lda #0x70
sta reg_value
call SPI_RW_Reg ;clear IRQ flags(nRF24L01)
ret
;**********************************************
; Description: set nRF24L01 power up or power down
;**********************************************
Power_UP_Tx::
lda #WRITE_REG+#CONFIG ;Set PWR_UP bit, enable CRC(2 bytes)
sta reg_name ; & Prim:TX. MAX_RT & TX_DS enabled
lda #0x0e
sta reg_value
call SPI_RW_Reg
; call Delay_5us
ret
Power_UP_Rx::
;lda #WRITE_REG+#RX_PW_P0 ;Select RX payload width
;sta reg_name
;lda #c_tx_payload_width
;sta reg_value
;call SPI_RW_Reg
;call Delay_5us
lda #WRITE_REG+#CONFIG ;Set PWR_UP bit, enable CRC(2 bytes)
sta reg_name ;& Prim:RX. RX_DR enabled
lda #0x0f
sta reg_value
call SPI_RW_Reg
call Delay_5us
call Delay_5us
ret
Power_Down::
lda #WRITE_REG+#CONFIG
sta reg_name
lda #0x0c
sta reg_value
call SPI_RW_Reg
call Delay_5us
ret
;*************************************
; Function: Write_Tx_Payload
;
; Description: Writes data'tx_payload' to TX payload
;
; In/Out parameters:
; In: commamd,access code0,1,2
; Out: Non
;*************************************
Write_TX_Payload::
clearbit(plata,CSN) ;Writes data to nRF24L01 TX payload
lda #WR_TX_PLOAD
sta byte
call SPI_RW
;lda #c_tx_payload_width
;sta byte_ctrl
lda command
sta byte
call SPI_RW
lda access_code
sta byte
call SPI_RW
lda access_code+1
sta byte
call SPI_RW
lda access_code+2
sta byte
call SPI_RW
setbit(plata,CSN)
ret
;---------------------------
Write_Command::
clearbit(plata,CSN) ;Writes data to nRF24L01 TX payload
lda #WR_TX_PLOAD
sta byte
call SPI_RW
lda command
sta byte
call SPI_RW
setbit(plata,CSN)
ret
;**************************************
;Write tx and rx address to communicate with writer
;*************************************
Write_tx_addr_writer::
clearbit(plata,CSN) ; Set CSN low, init SPI tranaction
lda #WRITE_REG+#TX_ADDR ;Writes TX_Address to nRF24L01
sta byte
call SPI_RW ;Select'TX_ADDR' register to write to
lda #c_tx_writer_addr0
sta byte
call SPI_RW
lda #c_tx_writer_addr1
sta byte
call SPI_RW
lda #c_tx_writer_addr2
sta byte
call SPI_RW
lda #c_tx_writer_addr3
sta byte
call SPI_RW
lda #c_tx_writer_addr4
sta byte
call SPI_RW
setbit(plata,CSN)
call Delay_5us
clearbit(plata,CSN)
lda #WRITE_REG+#RX_ADDR_P0 ;RX_Addr0 same as TX_Addr for Auto.Ack
sta byte
call SPI_RW
lda #c_tx_writer_addr0
sta byte
call SPI_RW
lda #c_tx_writer_addr1
sta byte
call SPI_RW
lda #c_tx_writer_addr2
sta byte
call SPI_RW
lda #c_tx_writer_addr3
sta byte
call SPI_RW
lda #c_tx_writer_addr4
sta byte
call SPI_RW
setbit(plata,CSN)
call Delay_5us
lda #WRITE_REG+#RF_SETUP ;TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
sta reg_name
lda #c_RF_18db
sta reg_value
call SPI_RW_Reg
call Delay_5us
ret
;-------------------------------------
Write_tx_addr_Fan::
clearbit(plata,CSN) ; Set CSN low, init SPI tranaction
lda #WRITE_REG+#TX_ADDR ;Writes TX_Address to nRF24L01
sta byte
call SPI_RW ;Select'TX_ADDR' register to write to
lda access_code
sta byte
call SPI_RW
lda access_code+1
sta byte
call SPI_RW
lda access_code+2
sta byte
call SPI_RW
lda #c_tx_fan_addr3
sta byte
call SPI_RW
lda #c_tx_fan_addr4
sta byte
call SPI_RW
setbit(plata,CSN)
call Delay_5us
clearbit(plata,CSN)
lda #WRITE_REG+#RX_ADDR_P0 ;RX_Addr0 same as TX_Addr for Auto.Ack
sta byte
call SPI_RW
lda access_code
sta byte
call SPI_RW
lda access_code+1
sta byte
call SPI_RW
lda access_code+2
sta byte
call SPI_RW
lda #c_tx_fan_addr3
sta byte
call SPI_RW
lda #c_tx_fan_addr4
sta byte
call SPI_RW
setbit(plata,CSN)
call Delay_5us
lda #WRITE_REG+#RF_SETUP ;TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
sta reg_name
lda #c_RF_0db
sta reg_value
call SPI_RW_Reg
call Delay_5us
ret
;**************************************
;Function: Select_RF_channel
;
; In/out parameters:
; In:RF_channel value in 'reg_value'
; Out:non
;*************************************
Select_RF_Channel::
lda #WRITE_REG+#RF_CH
sta reg_name
;lda RF_Channel
;sta reg_value
call SPI_RW_Reg
call delay_5us
ret
;***************************************
;Function: SPI_RW_Reg
;
; Description:
; Writes value 'reg_value' to register 'reg_name'
;
; In/Out parameters:
; In: 'reg_name' register to write value 'reg_value' to.
; Out: non
;****************************************
SPI_RW_Reg::
clearbit(plata,CSN)
lda reg_name
sta byte
call SPI_RW
lda reg_value
sta byte
call SPI_RW
setbit(plata,CSN)
ret
;*************************************
;Function: SPI_Read_Reg
;
; Description:
; Read value in'reg_name' and store the value in'reg_value'
;
; In/Out parameters:
; In:'reg_name'register to read value from
; Out:'reg_value'
;**************************************
SPI_Read_Reg::
clearbit(plata,CSN)
lda reg_name
sta byte
call SPI_RW
lda #0
sta byte
call SPI_RW
lda byte
sta reg_value
setbit(plata,CSN)
ret
;****************************************
;Function:SPI_RW subroutine
;Description:
; Writes one byte to nRF24L01, and return the byte read
; from nRF24L01 during write, according to SPI protocol
;
; In/Out parameters:
; In: 'byte', current byte to be written
; Out: 'byte' SW SPI mode
;*****************************************
SPI_RW::
lda #8
sta bit_ctrl
SPI_RW_Loop:
lda byte
anda #0x80
cmpe #0
brz Clear_MOSI
setbit(plata,MOSI)
br Next
Clear_MOSI:
clearbit(plata,MOSI)
Next:
adda #0 ;clear'C'flag
lda byte
ROLC
sta byte
setbit(plata,SCK)
lda porta
anda #c_fetch_MISO
ora byte
sta byte
clearbit(plata,SCK)
lda bit_ctrl
suba #1
sta bit_ctrl
cmpe #0
brnz SPI_RW_Loop
SPI_RW_End:
clearbit(plata,MOSI)
ret
;***************************************
CE_Pulse::
setbit(plata,CE) ;A high pluse(>10us)on CE begin
call Delay_10us ;sending the packet
call Delay_10us
clearbit(plata,CE)
ret
;***************************************
;TX_ADDRESS_Table:
; db 0x40,0x50,0x60,0x70,0x80
;----------------------------------------
Flush_Tx_FIFO::
clearbit(plata,CSN)
lda #FLUSH_TX ;清nRF24L01FIFO发送缓冲区,以免上次发送残留的数据重发
sta byte
call SPI_RW
setbit(plata,CSN)
ret
;------------------------------------------
Read_Rx_Pload::
clearbit(plata,CSN)
lda #RD_RX_PLOAD
sta byte
call SPI_RW
lda #0
sta byte
call SPI_RW
lda byte
sta command
lda #0
sta byte
call SPI_RW
lda byte
sta access_code
lda #0
sta byte
call SPI_RW
lda byte
sta access_code+1
lda #0
sta byte
call SPI_RW
lda byte
sta access_code+2
setbit(plata,CSN)
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -