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

📄 24l01.asm

📁 以TI5000系统DSP为主控器件
💻 ASM
字号:
        .title "nRF24L01"
        .mmregs
SPCR1   .set 01900008H
RCR1	.set 0190000CH
XCR1	.set 01900010H
SRGR1	.set 01900014H	
PCR1	.set 01900024H
DRR1	.set 01900000H
DXR1	.set 01900004H

GPEN	.set 01B00000H
GPDIR	.set 01B00004H
GPVAL   .set 01B00008H
TX_ADR_WIDTH .set 5
TX_PAYLOAD_WIDTH .set 1

CONFIG  	.set 00H					;SPI registers(address)
EN_AA		.set 01H
EN_RXADDR 	.set 02H
SETUP_RETR	.set 04H
RF_CH 		.set 05H
RF_SETUP	.set 06H
STATUS 		.set 07H
RX_ADDR_P0	.set 0AH
TX_ADDR		.set 10H
RX_PW_P0	.set 11H
FIFO_STATUS	.set 17H

W_TX_PAYLOAD .set A0H                 ;SPI commands

        .data 
addr_tbl:	.byte 34H,43H,10H,10H,01H
SPI_RW:							   	  ;入口参数: A1, store one byte to write to nRF24L01
		MVK        DXR1 , A6
		STB .D1    A1, *A6            ;Transmit one byte, produce FSX to enable nRF24L01
		MVK 	   SPCR1 ,A7
		LDB 	   *A7 , A8 		  ;read SPCR1 to A8
WAIT0:	AND        00000002H , A8 , A9;test RRDY,if RRDY=1 ,then transmit is finished, if A9=0 ,then still wait
  [!A9]  B 	.S1    WAIT0
		MVK        DRR1 , A6
		LDB        *A6, A0            ;出口参数:save and return status to A0
        RET
SPI_W_REGISTER: 
		ADD .L1  20H, A1,A1           ;入口参数:A1中存待写nRF24L01寄存器地址,A2存待写数据
		CALL     SPI_RW				  ;Transmit register address, select which register to wirte to ,and produce FSX to enable nRF24L01
		MV       A2,   A1
		CALL     SPI_RW               ;Transmit data
		RET
SPI_R_REGISTER:
		ADD .L1    00H, A1,A1           ;入口参数:A1中存待读nRF24L01寄存器地址,A0返回该寄存器的值
		CALL 	   SPI_RW				  ;Transmit register address, select which register to read from ,and produce FSX to enable nRF24L01
		MVK        DRR1 , A6
		MVK 	   SPCR1 ,A7
		LDB 	   *A7 , A8 		  ;read SPCR1 to A8
WAIT1:	AND        00000002H , A8 , A9;test RRDY,if RRDY=1 ,then transmit is finished, if A9=0 ,then still wait
[!A9]   B 	.S1    WAIT1
		LDB        *A6, A0			  ;出口参数:save and return register value to A0
		RET
START: 
		CALL  McBSP_Init
		
TX_Mode:
		MVK      GPVAL , A6
		MVK .L1  00000000H, A3   
		STW .D1  A3 , *A6             ;disable nRF24L01 TX or RX (CE=0)
		MVK		 TX_ADDR , A1
		ADD		 20H , A1 , A1
		MVK      addr_tbl  ,A4		  ;传地址数据的首地址
		MVK		 TX_ADR_WIDTH , A10
		CALL	 SPI_Write_Buf		  ;Writes TX_Address to nRF24L01
		MVK		 RX_ADDR_P0 , A1
		ADD		 20H , A1 , A1
		MVK      addr_tbl  ,A4		  ;传地址数据的首地址
		MVK		 TX_ADR_WIDTH , A10
		CALL	 SPI_Write_Buf		  ;RX_Addr0 same as TX_Adr for Auto.Ack
		MVK		 W_TX_PAYLOAD , A0
		MVK      tx_buf  ,A4		  ;传地址数据的首地址
		MVK		 TX_PAYLOAD_WIDTH , A10
		CALL	 SPI_Write_Buf		  ;Write data to TX payload
		MVK		 EN_AA   ,A1
		MVK		 01H	 ,A2
		CALL	 SPI_W_REGISTER		  ;Enalbe Auto.Ack: Pipe0
		MVK		 EN_RXADDR   ,A1
		MVK		 01H	 ,A2
		CALL	 SPI_W_REGISTER		  ;Enalbe Pipe0 address
		MVK		 SETUP_RETR   ,A1
		MVK		 1AH	 ,A2		  ;500+86us, 10 retransmit
		CALL	 SPI_W_REGISTER
		MVK		 RF_CH   ,A1
		MVK		 08H	 ,A2		  ;Select RF channel 8(第8频段)
		CALL	 SPI_W_REGISTER
		MVK		 RF_SETUP   ,A1
		MVK		 0FH	 ,A2
		CALL	 SPI_W_REGISTER		  ;输出功率0dBm, Datarate:2Mbps
		MVK		 CONFIG   ,A1
		MVK		 4EH	 ,A2
		CALL	 SPI_W_REGISTER
		MVK .L1  00000001H, A3 	
		STW      A3,  *A6             ;enable nRF24L01 TX (CE=1),进入发送状态
		RET
RX_Mode:
		MVK      GPVAL , A6
		MVK .L1  00000000H, A3   
		STW .D1  A3 , *A6             ;disable nRF24L01 TX or RX (CE=0)
		MVK		 RX_ADDR_P0 , A1
		ADD		 20H , A1 , A1
		MVK      addr_tbl  ,A4		  ;传地址数据的首地址
		MVK		 TX_ADR_WIDTH , A10
		CALL	 SPI_Write_Buf		  ;Use the same address on the RX device as the TX device
		MVK		 EN_AA   ,A1
		MVK		 01H	 ,A2
		CALL	 SPI_W_REGISTER		  ;Enalbe Auto.Ack: Pipe0
		MVK		 EN_RXADDR   ,A1
		MVK		 01H	 ,A2
		CALL	 SPI_W_REGISTER		  ;Enalbe Pipe0 address
		MVK		 RF_CH   ,A1
		MVK		 08H	 ,A2		  ;Select RF channel 8(第8频段)
		CALL	 SPI_W_REGISTER
		MVK		 RX_PW_P0   , A1
		MVK		 TX_PAYLOAD_WIDTH ,A2
		CALL	 SPI_W_REGISTER		  ;Select same RX payload width as TX Payload width
		MVK		 RF_SETUP   ,A1
		MVK		 0FH	 ,A2
		CALL	 SPI_W_REGISTER		  ;输出功率0dBm, Datarate:2Mbps
		MVK		 CONFIG   ,A1
		MVK		 4EH	 ,A2
		CALL	 SPI_W_REGISTER
		MVK .L1  00000001H, A3 	
		STW      A3,  *A6             ;enable nRF24L01 TX (CE=1),进入接收状态
		RET

SPI_Write_Buf:					;入口参数:A1中存nRF24L01寄存器地址,A4存发送数据块的首地址,A10存数据块大小
		CALL SPI_RW  			;先写入命令字或寄存器地址
LP0:	LDB      *A4++ , A1     ;参数(待发送数据)传至A1中,准备调用SPI_RW
	    CALL     SPI_RW
		SUB      A10 , 1 , A10
[A10]   B   .S1  LP0	
		RET

SPI_Read_Buf:					;入口参数:A1中存nRF24L01寄存器地址,A5存接收数据块的首地址,A10存数据块大小
		CALL SPI_RW				;先写入命令字或寄存器地址
 		MVK        DRR1 , A6
LP1:	LDB		   *A6  , A0
		STB		   A0 , *A5++
		SUB        A10 , 1 , A10
		MVK 	   SPCR1 ,A7
		LDB 	   *A7 , A8 		  ;read SPCR1 to A8
WAIT2:	AND        00000002H , A8 , A9;test RRDY,if RRDY=1 ,then transmit is finished, if A9=0 ,then still wait
[!A9]   B 	.S1    WAIT2
[A10]   B 	.S1    LP1			;按新收数据长度,重复接收。
		RET


McBSP_Init:
        STM #00000000H, SPCR1   ;reset McBSP
        STM #00001800H, SPCR1   ;CLKSTP=11b
		STM #00000A02H, PCR1    ;FSXM=1,CLKXM=1,CLKXP=1
		STM #2000004AH, SRGR1   ;FSGM=1, 600MHz/(CLKGDV+1)=600/75=8MHz
		STM #00010000H, RCR1   	;RDATDLY=01b
		STM #00010000H, XCR1   	;XDATDLY=01b
		STM #04001800H, SPCR1   ;GRST=1,enable sample rate generator
		
		NOP			
		STM #04011801H, SPCR1   ;CLKSTP=11b, XRST=1,RRST=1(enable McBSP1)
		
		NOP
		STM #00000001H, GPEN    ;enable GP0
		STM #00000001H, GPDIR   ;use GP0 as OUT
		RET		

⌨️ 快捷键说明

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