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

📄 spi.asm

📁 一款用24L01给美的电器做的2.4G无线遥控器
💻 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 + -