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

📄 935-cc1100接收数据包程序(单个字节)07.6.27

📁 cc1000收发程序,实现无线通信,不过用汇编编写的
💻 27
字号:
;程序名称:
;功能:接收一个字节的数据包



                        ORG 0000H
                        SPIF EQU 07H               ;935的SPI传输标志位
                        rxBuffer EQU 08H           ;接收数据包内容和附加字节的变量

                START:  AJMP MAIN
                        ORG 0013H
                        AJMP   WAITTING            ;转外部中断1中断入口
;-------------------------------------------------------------------
;函数名称:MAIN
;函数功能:接收一个字节的数据
;-------------------------------------------------------------------
                 MAIN:  MOV P1M1,  #00H            ;P1口标准I/O
                        MOV P1M2,  #00H
                        MOV P2M1,  #00H            ;P2口标准I/O
                        MOV P2M2,  #00H
                        MOV SPCTL, #0DCH           ;935的SPI控制寄存器,SPI使能数据字的高字节最先发送,SPICLK空闲时为高电平,SPICLK的前时钟沿为下降沿而后沿为上升沿,
                                                   ;数据在SPICLK的前时钟沿驱动后时钟沿采样
                        MOV A,WDCON
                        CLR ACC.2                  ;关闭看门狗
                        MOV WDCON,A
                        CLR  P2.4

                        CALL   POWER_UP_RESET_CC1100
                        CALL   SPIwritereg
                        CLR  P2.4
                        MOV SPDAT, #31H            ;开启和校准频率合成器
                        MOV  R6,#02FH
                        ACALL   WAIT
                        CLR  P2.4
                        MOV SPDAT,#34H             ;发送CC1100的SRX命令滤波,启动RX模式
                        SETB EX1                   ;外部中断1允许
                        SETB PX1                   ;外部中断1最高优先级
                        CLR IT1                    ;外部中断1的触发方式为电平触发
                        SETB EA                    ;开总中断
                     ;   call SPIreadreg
                DELAY:  AJMP   DELAY               ;暂停等待中断
             WAITTING:  JNB P1.4, WAITTING         ;等待GDO0脚变高,即数据包接收完毕
                        CALL   RFReceivePacket
                        SJMP $
;-------------------------------------------------------------------
;函数名称:POWER_UP_RESET_CC1100
;函数功能:启动CC1100
;-------------------------------------------------------------------
POWER_UP_RESET_CC1100:  SETB P2.4
                        NOP
                        CLR P2.4
                        NOP
                        SETB P2.4
                        MOV R1,#05H                ;CSn保持高电平至少40us
                LOOP1:  NOP
                        NOP
                        DJNZ R1,LOOP1
                        CALL RESET_CC1100
                        MOV  R4,#0FFH
                 TIME:  DJNZ  R4,TIME
                        RET
;-------------------------------------------------------------------
;函数名称:SPIwritereg
;函数功能:写CC1100的寄存器
;-------------------------------------------------------------------
          SPIwritereg:  CLR P2.4
                        MOV  R5,#24H
                        ACALL   WAIT
                        MOV DPTR,  #Addres         ;寄存器地址模块首地址
                LOOP8:  ACALL  LOOP2               ;SO脚输出低电平等待
                        MOV R6,#01H
                        ACALL   WAIT
                        CLR A
                        MOVC A,@A+DPTR
                        MOV SPDAT,A                ;写寄存器地址
                        MOV  R6,#01H
                        ACALL   WAIT               ;延时
                        MOV A,#24H                 ;寄存器地址模块与寄存器值模块之间的地址间隔为35个字节
                        MOVC A,@A+DPTR
                        MOV SPDAT  , A             ;写寄存器值
                        MOV R6,#01H
                        ACALL   WAIT               ;延时
                        INC DPTR
                        MOV R6,#01H
                        ACALL   WAIT
                        DJNZ R5,LOOP8
                        RET
;-------------------------------------------------------------------
;函数名称:SPIredareg
;函数功能:读CC1100的寄存器
;-------------------------------------------------------------------
           SPIreadreg:  CLR P2.4
                        MOV R6,#02FH
                        ACALL   WAIT
                        ACALL  LOOP2
                        MOV R6,#02FH
                        ACALL   WAIT
                        MOV SPDAT, #0f5H            ;写要读的寄存器地址
                        NOP
                        MOV  R6, #02FH
                        ACALL   WAIT               ;延时
                        MOV SPDAT, #00H            ;触发脉冲
                        MOV  R6, #02FH
                        ACALL   WAIT                ;延时
                        MOV A, SPDAT
                        MOV R6, #02FH
                        ACALL   WAIT
                        SETB P2.4
                        RET
;-------------------------------------------------------------------
;函数名称:RESET_CC1100
;函数功能:重启CC1100
;-------------------------------------------------------------------
         RESET_CC1100:  CLR P2.4
                        ACALL  LOOP2               ;等待SO变低
                        MOV SPDAT,#030H            ;发送CC1100的SRES滤波
                        ACALL   WAIT               ;延时
                        ACALL  LOOP2
                        SETB P2.4
                        RET
;-------------------------------------------------------------------
;函数名称:SPIStrobe
;函数功能:写CC1100的命令滤波
;-------------------------------------------------------------------
            SPIStrobe:  CLR P2.4
                        ACALL  LOOP2               ;等待SO变低
                        MOV SPDAT,A                ;A的内容为命令滤波的地址
                        ACALL   WAIT               ;延时
                        SETB P2.4
                        RET

;-------------------------------------------------------------------
;函数名称:LOOP2
;函数功能:SO脚输出低电平等待
;-------------------------------------------------------------------
                LOOP2:  MOV A, SPDAT
                        JB  ACC.7,LOOP2
                        RET
;-------------------------------------------------------------------
;函数名称:WAIT
;函数功能:产生延时
;-------------------------------------------------------------------
                 WAIT:  MOV     R0,#0FH
                 LOOP:  NOP
                        NOP
                        DJNZ    R0,LOOP
                        DJNZ    R6,WAIT
                        RET
;-------------------------------------------------------------------
;寄存器地址模块Addres和寄存器值模块Data1
;-------------------------------------------------------------------
               Addres:  DB  000H,002H,006H,007H    ; 寄存器地址
                        DB  008H,009H,00AH,00BH
                        DB  00CH,00DH,00EH,00FH
                        DB  010H,011H,012H,013H
                        DB  014H,015H,017H,018H
                        DB  019H,01AH,01BH,01CH
                        DB  01DH,021H,022H,023H
                        DB  024H,025H,026H,029H
                        DB  02CH,02DH,02EH,03EH
                Data1:  DB  00BH,006H,001H,004H    ; 寄存器值
                        DB  004H,000H,000H,00BH
                        DB  000H,010H,0A7H,062H
                        DB  02DH,03BH,073H,022H
                        DB  0F8H,000H,030H,018H
                        DB  01DH,01CH,0C7H,000H
                        DB  0B2H,0B6H,000H,0EAH
                        DB  02AH,000H,011H,059H
                        DB  088H,031H,00BH,051H

                        DB  088H,031H,00BH,051H
;-------------------------------------------------------------------
;
;-------------------------------------------------------------------
         TXFIFOAddres:  DB  03FH                   ;突发写访问TXFIFO地址
             txBuffer:  DB  002H                   ;要发送的数据包的内容
         RXFIFOAddres:  DB  0FFH                   ;突发读访问RXFIFO地址
        ;     rxBuffer:  DB  000H                   ;接收的数据包的内容
              ; status:  DB  000H,000H              ;附加字节
     ; BYTES_IN_RXFIFO:  DB  07FH

;-------------------------------------------------------------------
;函数名称: SPIreadBurstRXFIFO
;函数功能:突发读访问RXFIFO
;-------------------------------------------------------------------
  SPIreadBurstRXFIFO:   CLR P2.4
                        ACALL  LOOP2               ;SO脚输出低电平等待
                        ACALL   WAIT
                        MOV DPTR,  #RXFIFOAddres   ;
                        ACALL  LOOP2               ;SO脚输出低电平等待
                        MOV R6,#01H
                        ACALL   WAIT
                        CLR A
                        MOVC A,@A+DPTR
                        MOV SPDAT,A                ;写寄存器地址
                        MOV R5,#03H                ;接收到的一个字节和两个附加字节
                        CLR A
                LOOP4:  ADD A,#rxBuffer
                        MOV R1,A
                        MOV  R6, #0FH
                        ACALL   WAIT               ;延时
                        MOV SPDAT, #00H            ;触发脉冲
                        MOV  R6, #02H
                        ACALL   WAIT               ;延时
                        MOV A, SPDAT
                        MOV @R1,SPDAT
                        SUBB A,#08H
                        INC A
                        DJNZ R5,LOOP4
                        MOV R6,#01H
                        ACALL   WAIT
                        MOV  A,SPDAT
                        ANL  ACC.7,#01H
                        RET

;-------------------------------------------------------------------
;函数名称:RFReceivePacket
;函数功能:接收数据包
;-------------------------------------------------------------------
      RFReceivePacket:
        SPIreadStatus:  CLR P2.4
                        ACALL  LOOP2
                        ACALL   WAIT
                        MOV SPDAT, #0FbH           ;写读RXBYTES地址
                        MOV  R6, #0FH
                        ACALL   WAIT               ;延时
                        MOV SPDAT, #00H            ;触发脉冲
                        MOV  R6, #02H
                        ACALL   WAIT               ;延时
                        MOV A, SPDAT
                        MOV R6, #01H
                        ACALL   WAIT
                    ;    SETB P2.4
                        ACALL   WAIT
                        ANL A,#7FH                 ;判断RXFIFO中有没有字节,SPIReadstatus(cc1100_RXBYTE&BYTES_IN_RXFIFO
                LOOP6:  JZ LOOP6
                        CLR A
                        ACALL  SPIreadBurstRXFIFO  ;突发读访问RXFIFO
                        JZ  Error
                        RETI


;-------------------------------------------------------------------
;函数名称:Error
;函数功能:
;-------------------------------------------------------------------
                Error: NOP
                       SJMP $


⌨️ 快捷键说明

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