📄 935-cc1100接收数据包程序(单个字节)07.6.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 + -