zzzcccj4649 发表于 2013-4-19 11:07:36

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

板子是用现成的,别人写的软件能正常通信,说明硬件没问题。
单片机型号AT89C4051
以下是我写的软件。
不知道是配置问题还是读写问题,无法通信。
;/----------------------------------------
;--RNF2401发送程序
;--单片机AT89C4051
;-------------------------------------------
PWR_UP EQU P3.3
DATA1EQU 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:
               
                CLRCE
                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:
      MOVR2,#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   ;MOVdirect rel 为3T(1T单片机)或12T(传统单片机)
          DJNZ40H,$       ;DJNZdirect rel 为5T(1T单片机)或24T(传统单片机)
          RET

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

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

      END





接收部分:
;/----------------------------------------
;--RNF2401接收程序
;--单片机AT89C4051
;-------------------------------------------
PWR_UP EQU P3.3
DATA1EQU 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:
               
                CLRCE
                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:
      MOVR2,#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
   MOVR2,#08
READ1:
      SETB CLK1   ;将时钟信号置高
      NOP          ;需要根据CPU运行速度调整NOP指令的数量
      NOP
      NOP
      NOP
      RLC A      ;ACC左移一位,CY进入最低位
      MOV C,DATA1    ;将DATA脚读取一位数据到CY
      CLR CLK1       ;将时钟信号置低
      
      cpl led
      LCALLDELAY300US
      DJNZ R2,READ1
      RET

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

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

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

      END

zzzcccj4649 发表于 2013-4-19 15:23:23

  
   求助      。

goodlizzy 发表于 2013-4-23 18:48:07

汇编一般不喜欢看,换C,还可能有人看
页: [1]
查看完整版本: 51单片机与nrf2401通信不成功,有人帮我分析一下吗?