📄 24l01.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 + -