nRF24L01测试程序
;****************************************IO端口定义
*************************************** LED BIT P3.7;
LED1 BIT P3.5;
LED2 BIT P3.4;
LED3 BIT P3.3;
K1 BIT P1.5;
KZ BIT P1.6;
K2 BIT P1.7;
CE BIT P1.0;数字输入,RX或TX模式选择
CSN BIT P1.1;数字输入,SPI片选
SCK BIT P1.2;数字输入,SIP时钟
MOSI BIT P1.3;数字输入,数据输入
MISO BIT P1.4;数字输出,数据输出
IRQ BIT P3.2;数字输出,可屏蔽中断
;*******************************************************************************
*********************************
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV P1,#0FFH
MOV P3,#0FFH
CLR LED
CLR KZ
;串口初始化
MOV SP,#70H
MOV PCON,#00H
MOV SCON,#01000000B
MOV TMOD,#00100000B
MOV TL1,#0FDH
MOV TH1,#0FDH
SETB TR1
SETB REN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LOOP: JNB K2,CHANGFA
JNB K1,DANFA
LJMP LOOP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DANFA: ;发射
LCALL init_NRF24L01;初始化
LCALL SetTX_Mode ;确认工作在发射模式
CLR CE ;发射模式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;串口显示已经配置的信息
MOV R0,#17H
MOV R1,#00H
XIAN_T_A:
CJNE R0,#00H,XIAN_T_B
LJMP LOOPA
XIAN_T_B:
MOV A,R1
LCALL SPI_R_Reg
MOV SBUF,A
JNB TI,$
CLR TI
DEC R0
INC R1
LJMP XIAN_T_A
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LOOPA:;写入32位数据并且发送
MOV B,#12H
LCALL SPI_Write_Buf
CLR LED1
;LCALL YAN500MS
;SETB LED1
;LCALL YAN500MS
LJMP LOOPA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CHANGFA: ;接收
LCALL init_NRF24L01;初始化
LCALL SetRX_Mode ;确认工作在接收模式
SETB CE ;接收模式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;串口显示已经配置的信息
MOV R0,#17H
MOV R1,#00H
XIAN_R_A:
CJNE R0,#00H,XIAN_R_B
LJMP LOOPB
XIAN_R_B:
MOV A,R1
LCALL SPI_R_Reg
MOV SBUF,A
JNB TI,$
CLR TI
DEC R0
INC R1
LJMP XIAN_R_A
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LOOPB:;判断有无接收数据
MOV A,#07H
LCALL SPI_R_Reg
JNB ACC.6,LOOPB
;##########################################
LCALL SPI_Read_Buf
MOV A,B
MOV SBUF,A
JNB TI,$
CLR TI
;##########################################
CLR LED3
;LCALL YAN500MS
;SETB LED3
;LCALL YAN500MS
LJMP LOOPB
;*******************************************************************************
*********************************
;**************************************************************************
; - 功能描述:延时500毫秒
; - 隶属模块:无
; - 函数属性:无
; - 参数说明:无
; - 返回说明:无
; *************************************************************************
YAN500MS:
MOV R4,#5
TXD_c3: MOV R5,#10
TXD_c2: MOV R6,#0FFH
TXD_c1: MOV R7,#0FFH
TXD_c0: DJNZ R7,TXD_c0
DJNZ R6,TXD_c1
DJNZ R5,TXD_c2
DJNZ R4,TXD_c3
RET
;##########################################################
;函数:SPI_W---SPI写1字节
;参数:A=写入数据
;返回:无
;使用:A R7
;##########################################################
SPI_W: SETB MOSI ;恢复端口状态
MOV R7,#8 ;设置需要写入8个位,1个字节 SPI_W_A:
CJNE R7,#00H,SPI_W_B ;判断是否写完数据,写完退出
RET ;数据写完退出
SPI_W_B:
RLC A ;移出最高位-输出高位
MOV MOSI,C ;输出最高位
SETB SCK ;时钟高电平
NOP
NOP
CLR SCK ;恢复时钟状态
DEC R7 ;指向下一位
LJMP SPI_W_A ;返回继续判断
;##########################################################
;函数:SPI_R---SPI读1字节
;参数:无
;返回:A=读出来的数据
;使用:A R7
;##########################################################
SPI_R: SETB MISO ;恢复端口状态
MOV R7,#8 ;设置需要写入8个位,1个字节 SPI_R_A:
CJNE R7,#00H,SPI_R_B ;判断是否写完数据,写完退出
RET ;数据写完退出
SPI_R_B:
SETB SCK ;时钟高电平
MOV C,MISO ;读输出引脚状态
RLC A ;保存输出状态
CLR SCK ;恢复时钟状态
DEC R7 ;指向下一位
LJMP SPI_R_A ;返回继续判断
;##########################################################
;函数:SPI_R_Reg---SPI读寄存器
;参数:A:指令+地址
;返回:A: A=读出来的数据
;使用:A R7
;##########################################################
SPI_R_Reg:
CLR CSN ;SPI片选择使能
LCALL SPI_W ;写入指令+地址
LCALL SPI_R ;读取数据
SETB CSN ;SPI片选择关闭
RET
;##########################################################
;函数:SPI_W_Reg---SPI写寄存器
;参数:A:指令+地址 B:需要写入的数据
;返回:无
;使用:A B R7
;##########################################################
SPI_W_Reg:
CLR CSN ;SPI片选择使能
LCALL SPI_W ;写入指令+地址
MOV A,B ;读取需要写入的数据
LCALL SPI_W ;写入数据
SETB CSN ;SPI片选择关闭
RET
;##########################################################
;函数:init_NRF24L01---初始化
;参数:无
;返回:无
;使用:A B R7
;备注: 本地发送地址:0x01,0x23,0x45,0x67,0x89 ; 端口0接收地址:0x01,0x23,0x45,0x67,0x89 ; 默认配置为:发射模式
;##########################################################
init_NRF24L01:
CLR CE ;进入待机模式1进行配置
SETB CSN ;SPI片选择关闭
CLR SCK ;恢复时钟状态
;##############################################
;设置接收发射模式与CRC校验等
CLR CSN ;SPI片选择使能
MOV A,#20H ;写配置寄存器 00+20写指令
LCALL SPI_W ;发送指令
MOV A,#0FH ;上电,发射模式=0EH 接收模式=0FH
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选择关闭
;##############################################
;打开端口0自动应答
CLR CSN ;SPI片选择使能
MOV A,#21H ;写自动应答寄存器 01+20写指令
LCALL SPI_W ;发送指令
MOV A,#00H ;打开端口0自动应答 01
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选择关闭
;##############################################
;打开端口0接收允许
CLR CSN ;SPI片选择使能
MOV A,#22H ;写数据通道允许寄存器 02+20写指令
LCALL SPI_W ;发送指令
MOV A,#01H ;打开接收数据通道0允许
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选择关闭
;##############################################
;设置地址宽度
CLR CSN ;SPI片选择使能
MOV A,#22H ;写收发地址宽度寄存器 03+20写指令
LCALL SPI_W ;发送指令
MOV A,#03H ;设置地址宽度为5个字节
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选择关闭
;##############################################
;建立自动重发
CLR CSN ;SPI片选择使能
MOV A,#24H ;写自动重发度寄存器 04+20写指令
LCALL SPI_W ;发送指令
MOV A,#00H ;重发等待500uS,重发4次 14
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选择关闭
;##############################################
;工作频率设置为2.4G
CLR CSN ;SPI片选择使能
MOV A,#25H ;写工作频率寄存器 05+20写指令
LCALL SPI_W ;发送指令
MOV A,#02H ;设置信道工作为2.4GHZ
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选择关闭
;##############################################
;设置发射速度为1M,发送功率最大0dB
CLR CSN ;SPI片选择使能
MOV A,#26H ;写发射速率寄存器 06+20写指令
LCALL SPI_W ;发送指令
MOV A,#07H ;设置速率1M,功率0dB
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选择关闭
;##############################################
;写状态寄存器
CLR CSN ;SPI片选择使能
MOV A,#27H ;写状态寄存器 07+20写指令
LCALL SPI_W ;发送指令
MOV A,#70H ;写状态寄存器
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选择关闭
;##############################################
;写端口0接收地址
CLR CSN ;SPI片选择使能
MOV A,#2AH ;写端口0接收寄存器 0A+20写指令
LCALL SPI_W ;发送指令
MOV A,#55H ;写发送地址第1位
LCALL SPI_W ;写1字节数据
MOV A,#55H ;写发送地址第2位
LCALL SPI_W ;写1字节数据
MOV A,#55H ;写发送地址第3位
LCALL SPI_W ;写1字节数据
MOV A,#55H ;写发送地址第4位
LCALL SPI_W ;写1字节数据
MOV A,#55H ;写发送地址第5位
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选择关闭
;##############################################
;写本地地址
CLR CSN ;SPI片选择使能
MOV A,#30H ;写发送地址寄存器 10+20写指令
LCALL SPI_W ;发送指令
MOV A,#55H ;写发送地址第1位
LCALL SPI_W ;写1字节数据
MOV A,#55H ;写发送地址第2位
LCALL SPI_W ;写1字节数据
MOV A,#55H ;写发送地址第3位
LCALL SPI_W ;写1字节数据
MOV A,#55H ;写发送地址第4位
LCALL SPI_W ;写1字节数据
MOV A,#55H ;写发送地址第5位
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选择关闭
;##############################################
;设置端口0接收数据长度
CLR CSN ;SPI片选择使能
MOV A,#31H ;写端口0数据长度寄存器 11+20写指令
LCALL SPI_W ;发送指令
MOV A,#1 ;设置端口0接收32字节 32
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选择关闭
;##############################################
;退出
RET
;##########################################################
;函数:SPI_Write_Buf---写1位数据
;参数:B存放需要发送的1字节数据
;返回:无
;使用:A R7
;##########################################################
SPI_Write_Buf:
CLR CE ;进入待机模式1进行配置
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;装载数据
CLR CSN ;SPI片选择使能
MOV A,#0A0H ;写待发送数据指令A0
LCALL SPI_W ;发送指令
MOV A,B ;写入需要发送的数据
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选恢复
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;发送数据
SETB CE ;启动发射
MOV R6,#150 ;等待一段时间
DJNZ R6,$ ;等待一段时间
CLR CE ;进入待机状态
JB IRQ,$ ;等待IRQ出现0电平
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;清除状态寄存器中断标志
CLR CSN ;SPI片选
MOV A,#27H ;写状态寄存器07+20写指令
LCALL SPI_W ;发送指令
MOV A,#70H ;通过写1来清楚中断标志
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选恢复
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LCALL SPI_R ;读1字节
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;清模块发送缓冲区
CLR CSN ;SPI片选
MOV A,#0E1H ;清模块发送缓冲区
LCALL SPI_W ;发送指令
SETB CSN ;SPI片选恢复
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RET
;##########################################################
;函数:SPI_Read_Buf---读1位数据
;参数:无
;返回:读出后的数据在B中
;使用:A R7 - R0 R6
;##########################################################
SPI_Read_Buf:
CLR CE ;进入待机模式
;##########################################
;读取数据
CLR CSN ;SPI片选
MOV A,#61H ;写读取接收数据指令
LCALL SPI_W ;发送指令
LCALL SPI_R ;读1字节数据
MOV B,A
SETB CSN ;SPI片选恢复
;##########################################
;清除状态寄存器中断标志
CLR CSN ;SPI片选
MOV A,#27H ;写状态寄存器07+20写指令
LCALL SPI_W ;发送指令
MOV A,#70H ;通过写1来清楚中断标志
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选恢复
;##########################################
;清模块接收缓冲区
CLR CSN ;SPI片选
MOV A,#0E2H ;
LCALL SPI_W ;发送指令
SETB CSN ;SPI片选恢复
;##########################################
SETB CE ;继续进入接收状态
RET
;##########################################################
;函数: SetTX_Mode---配置为发射模式
;参数:无
;返回:无
;使用:A R7
;########################################################## SetTX_Mode:
CLR CE ;进入待机模式
;##############################################
;设置发射模式与CRC校验等
CLR CSN ;SPI片选择使能
MOV A,#20H ;写配置寄存器 00+20写指令
LCALL SPI_W ;发送指令
MOV A,#0EH ;上电,发射模式
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选择关闭
;##############################################
RET
;########################################################## ;函数: SetRX_Mode---配置为接收模式
;参数:无
;返回:无
;使用:A R7
;########################################################## SetRX_Mode:
CLR CE ;进入待机模式
;##############################################
;设置接收模式与CRC校验等
CLR CSN ;SPI片选择使能
MOV A,#20H ;写配置寄存器 00+20写指令
LCALL SPI_W ;发送指令
MOV A,#0FH ;上电,接收模式
LCALL SPI_W ;写1字节数据
SETB CSN ;SPI片选择关闭
;##############################################
RET
;########################################################## END