51单片机与nrf2401通信不成功,有人帮我分析一下吗?

2020-01-30 13:42发布

板子是用现成的,别人写的软件能正常通信,说明硬件没问题。
单片机型号AT89C4051
以下是我写的软件。
不知道是配置问题还是读写问题,无法通信。
;/----------------------------------------
;--RNF2401发送程序
;--单片机AT89C4051
;-------------------------------------------
PWR_UP EQU P3.3
DATA1  EQU P3.7
CLK1   EQU P3.5
DR1    EQU P1.5
CE     EQU P3.2
CS     EQU P3.4
LED    EQU P1.7

                ORG        0000H
                JMP         START0
                ORG        0100H
START0:
           MOV      P1,#0FFH
           MOV      P3,#0FFH
           SETB    PWR_UP
           CLR     CE
           CLR     CS
           LCALL   DELAY3mS  ; NRF2401完成上电,进入待机状态

           LCALL   CONFIG_TX ;调用配置NRF2401发送子程序,
LOOP:      SETB    CE
           LCALL   DELAY300US ;进入发送状态。
           MOV     A,#0F0H
           LCALL   DATA_WRITE     ;数据写入2401
           CLR     CE             ;2401开始发送
           MOV     4BH,#20H
LOOP01:    LCALL   DELAY3mS
           DJNZ    4BH,LOOP01
           CPL     LED          ;发送一次数据,LED灯闪一次
           JMP     LOOP
;/--------------------------------------------
;配置NRF2401发送子程序
;---------------------------------------------/
CONFIG_TX:
               
                CLR  CE
                SETB CS
                LCALL DELAY300US

                MOV   A,#50H               ;bit119-bit112:通道二数据长度   
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
               
                MOV   A,#50H               ;bit119-bit112:通道1数据长度   
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
               
                MOV   A,#00H               ;bit103-bit64:表示当前配置芯片通道二地址   最长可以配置为40 bit ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
                MOV   A,#00H               ;bit103-bit64:表示当前配置芯片通道二地址   最长可以配置为40 bit ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
                MOV   A,#00H               ;bit103-bit64:表示当前配置芯片通道二地址   最长可以配置为40 bit ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
                MOV   A,#00H               ;bit103-bit64:表示当前配置芯片通道二地址   最长可以配置为40 bit ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
               
                MOV   A,#00H               ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit    ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
                MOV   A,#00H               ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit    ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
                MOV   A,#00H               ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit    ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
                MOV   A,#11H               ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit    ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
               
                MOV   A,#83H               ;bit23-bit18:32地址位的长度,    (83H:地址长度32,16位CRC,允许CRC)
                                           ; bit17:CRC校验位长度选择(0:8位CRC 1:16位CRC)
                                           ; bit16:CRC校验位允许(0:禁止CRC,1:允许CRC)。
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
               
                MOV   A,#6fH              ; bit15:0:单通道接收,1:双通道接收      (4FH:单通道接收,shockburst模式,250Kbps,16MHz,0dBm)
                                          ;bit14:数据传输模式选择位,0:Direct模式1:shockBurst模式。
                                          ;bit13:传输速率选择位,0:250kbps 1:1Mbps.   选择250kbps 比1Mbps 传输距离更远。
                                          ;bit12-bit10:设置晶振频率。 (000:4MHz, 001:8MHz, 010:12MHz, 011:16MHz, 100:20MHz)
                                           ;bit9-bit8:信号发射功率设置。(00:-20dBm , 01:-10dBm, 10:-5dBm, 11:0dBm)
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
               
                MOV   A,#04H              ;bit7-bit1:通道选择及频率设置,frequency= 2400MHz + RF_CH * 1.0MHz              (04H:频段2@发送模式)
                                          ;bit0:设置传输模式,0表示发送模式,1表示接收模式。当要求nRF2401A工作在双工方式通信时,通过改变这一位来不断转换发送和接收模式。
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US

                LCALL DELAY3mS
                CLR   CS                    ;完成配置
                LCALL DELAY3mS
                RET

;/------------------------------------------------------------------------------
;数据写2401子程序
;/----------------------------------------------------------------------------/
DATA_WRITE:
WRITE:
      MOV  R2,#08
WRITE1:
       RLC A    ;ACC左移一位,最高位进入CY
       MOV DATA1,C ;将CY送到DATA引脚
       SETB CLK1  ;将时钟信号置高
       NOP         ;需要根据CPU运行速度调整NOP指令的数量
       NOP
       NOP
       NOP
       NOP
       NOP
       CLR CLK1    ;将时钟信号置低
       DJNZ R2,WRITE1
       RET

;/---------------------------------------------------
;延时子程序
;-------------------------------------------------/
DELAY10US:                 ;晶振11.0592MHz,T=0.0904uS,10uS=110T
          MOV   40H,#04H   ;MOV  direct rel 为3T(1T单片机)或12T(传统单片机)
          DJNZ  40H,$       ;DJNZ  direct rel 为5T(1T单片机)或24T(传统单片机)
          RET

DELAY300US:                 ;晶振11.0592MHz,T=0.0904uS,300uS=3300T
          MOV   40H,#8AH   ;MOV  direct rel 为3T(1T单片机)或12T(传统单片机)
          DJNZ  40H,$       ;DJNZ  direct rel 为5T(1T单片机)或24T(传统单片机)
          RET

DELAY3mS:                 ;晶振11.0592MHz,T=0.0904uS,3mS=33178T
          MOV   41H,#14H
MS01:     MOV   40H,#45H   ;MOV  direct rel 为3T(1T单片机)或12T(传统单片机)
          DJNZ  40H,$       ;DJNZ  direct rel 为5T(1T单片机)或24T(传统单片机)
          DJNZ  41H,MS01
          RET

        END





接收部分:
;/----------------------------------------
;--RNF2401接收程序
;--单片机AT89C4051
;-------------------------------------------
PWR_UP EQU P3.3
DATA1  EQU P3.7
CLK1   EQU P3.5
DR1    EQU P1.5
CE     EQU P3.2
CS     EQU P3.4
LED    EQU P1.7


                ORG        0000H
                JMP         START0
                ORG        0100H
START0:
           ;LCALL   LED_FAST
           MOV      P1,#0FFH
           MOV      P3,#0FFH
           SETB    PWR_UP
           CLR     CE
           CLR     CS
           LCALL   DELAY3mS  ; NRF2401完成上电,进入待机状态

           LCALL   CONFIG_RX ;调用配置NRF2401接收子程序,

           SETB    CE
           LCALL   DELAY300US ;进入接收状态。
           
RECEIVE1:  JB      DR1,RECEIVE2        ;Receive
           JMP     RECEIVE1
RECEIVE2:  LCALL   READ
           LCALL   LED_FAST         ;接收完数据,LED闪
           JMP     RECEIVE1         ;继续接收
;/-------------------------------------
;  LED灯闪
;----------------------------------------/
LED_FAST:

           MOV      50H, #0AH
L03:       MOV      51H, #0aH
L02:       MOV      52H, #21H
L01:        LCALL   DELAY3mS
        DJNZ    52H, L01
        DJNZ    51H,L02
        CPL     LED
        DJNZ    50H,L03
        RET
;/--------------------------------------------
;配置NRF2401接收子程序
;---------------------------------------------/
CONFIG_RX:
               
                CLR  CE
                SETB CS
                LCALL DELAY300US

                MOV   A,#50H               ;bit119-bit112:通道二数据长度   
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
               
                MOV   A,#50H               ;bit119-bit112:通道1数据长度   
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
               
                MOV   A,#00H               ;bit103-bit64:表示当前配置芯片通道二地址   最长可以配置为40 bit ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
                MOV   A,#00H               ;bit103-bit64:表示当前配置芯片通道二地址   最长可以配置为40 bit ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
                MOV   A,#00H               ;bit103-bit64:表示当前配置芯片通道二地址   最长可以配置为40 bit ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
                MOV   A,#00H               ;bit103-bit64:表示当前配置芯片通道二地址   最长可以配置为40 bit ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
               
                MOV   A,#00H               ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit    ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
                MOV   A,#00H               ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit    ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
                MOV   A,#00H               ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit    ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
                MOV   A,#11H               ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit    ,少于40BIT的部分设置为0
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
               
                MOV   A,#83H               ;bit23-bit18:32地址位的长度,    (83H:地址长度32,16位CRC,允许CRC)
                                           ; bit17:CRC校验位长度选择(0:8位CRC 1:16位CRC)
                                           ; bit16:CRC校验位允许(0:禁止CRC,1:允许CRC)。
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
               
                MOV   A,#6fH              ; bit15:0:单通道接收,1:双通道接收      (4FH:单通道接收,shockburst模式,250Kbps,16MHz,0dBm)
                                          ;bit14:数据传输模式选择位,0:Direct模式1:shockBurst模式。
                                          ;bit13:传输速率选择位,0:250kbps 1:1Mbps.   选择250kbps 比1Mbps 传输距离更远。
                                          ;bit12-bit10:设置晶振频率。 (000:4MHz, 001:8MHz, 010:12MHz, 011:16MHz, 100:20MHz)
                                           ;bit9-bit8:信号发射功率设置。(00:-20dBm , 01:-10dBm, 10:-5dBm, 11:0dBm)
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US
               
                MOV   A,#05H              ;bit7-bit1:通道选择及频率设置,frequency= 2400MHz + RF_CH * 1.0MHz              (04H:频段2@发送模式)
                                          ;bit0:设置传输模式,0表示发送模式,1表示接收模式。当要求nRF2401A工作在双工方式通信时,通过改变这一位来不断转换发送和接收模式。
                LCALL DATA_WRITE          ;发送一个字节的数据
                LCALL DELAY300US

                CLR   CS                    ;完成配置
                LCALL DELAY3mS
                RET

;/------------------------------------------------------------------------------
;数据写2401子程序
;/----------------------------------------------------------------------------/
DATA_WRITE:
WRITE:
      MOV  R2,#08
WRITE1:
       RLC A    ;ACC左移一位,最高位进入CY
       MOV DATA1,C ;将CY送到DATA引脚
       SETB CLK1  ;将时钟信号置高
       NOP         ;需要根据CPU运行速度调整NOP指令的数量
       NOP
       NOP
       NOP
       CLR CLK1    ;将时钟信号置低
       DJNZ R2,WRITE1
       RET
;/---------------------------------------------------------------
;读2401数据子程序
;/-----------------------------------------------------------------
READ:
     SETB DATA1
     MOV  R2,#08
READ1:
      SETB CLK1   ;将时钟信号置高
      NOP          ;需要根据CPU运行速度调整NOP指令的数量
      NOP
      NOP
      NOP
      RLC A        ;ACC左移一位,CY进入最低位
      MOV C,DATA1    ;将DATA脚读取一位数据到CY
      CLR CLK1       ;将时钟信号置低
      
      cpl led
      LCALL  DELAY300US
      DJNZ R2,READ1
      RET

;/---------------------------------------------------
;延时子程序
;-------------------------------------------------/
DELAY10US:                 ;晶振11.0592MHz,T=0.0904uS,10uS=110T
          MOV   40H,#04H   ;MOV  direct rel 为3T(1T单片机)或12T(传统单片机)
          DJNZ  40H,$       ;DJNZ  direct rel 为5T(1T单片机)或24T(传统单片机)
          RET

DELAY300US:                 ;晶振11.0592MHz,T=0.0904uS,300uS=3300T
          MOV   40H,#8AH   ;MOV  direct rel 为3T(1T单片机)或12T(传统单片机)
          DJNZ  40H,$       ;DJNZ  direct rel 为5T(1T单片机)或24T(传统单片机)
          RET

DELAY3mS:                 ;晶振11.0592MHz,T=0.0904uS,3mS=33178T
          MOV   41H,#14H
MS01:     MOV   40H,#45H   ;MOV  direct rel 为3T(1T单片机)或12T(传统单片机)
          DJNZ  40H,$       ;DJNZ  direct rel 为5T(1T单片机)或24T(传统单片机)
          DJNZ  41H,MS01
          RET

        END

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。