?? 收發器2.asm
字號:
$include (C8051F330.inc)
G_LED BIT P1.3;
R_LED BIT P1.2;P1.7;
SCK BIT P0.2;P0.4
MISO BIT P0.3;P0.5
MOSI BIT P0.4;P0.6
CE BIT P0.5;P0.2
CSN BIT P0.0;P0.3;收發模塊SPI接口選擇。低電平有效。
IRQ BIT P0.1;P1.2
MARK EQU 20H;接收、寫入操作狀態標記位。
SIGN EQU 21H;未用。
STATUS EQU 22H
EDAD_DATA EQU 23H
;30H,31H,32H,3H讀數據地址
HEAD1 EQU 70H;未用。
HEAD2 EQU 71H;未用。
HEAD3 EQU 72H;未用。
HEAD4 EQU 73H;未用。
HEAD5 EQU 74H;未用。
HEAD6 EQU 75H;未用。
D_LONG EQU 38H;每段數據長度。
R_DELA EQU 39H;判數據發送完畢的延時寄存器。
R_LONG EQU 3AH;每段數據長度寄存器。
R_NUM EQU 3BH;未用。
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 002BH
RETI
ORG 0033H
RETI
ORG 003BH
RETI
ORG 0043H
RETI
ORG 004BH
RETI
ORG 0053H
RETI
ORG 005BH
RETI
ORG 0063H
RETI
ORG 006BH
RETI
ORG 0073H
RETI
ORG 0080H
START:
;------------------------------硬件配置。
MOV PCA0MD,#00H;關看門狗。
MOV SP,#80H;=================
LCALL Init_Device;配置(所有中斷禁止).6.125M
MOV IE, #00h;關中斷。
;-----------------------------
CLR TI0
CLR RI0
CLR SPIF
CLR CE
SETB CSN
SETB IRQ
;-----------------------------
CLR R_LED;上電指示。
LCALL DELAY4;燈亮延時
KK1:
;+++++++++++++++++++++++++++++++++++++++++++++++++
mov SPI0CFG, #040h;無線模塊模式。
mov SPI0CN, #001h;
mov SPI0CKR, #000h;3.0625M
;+++++++++++++++++++++++++++++++++++++++++++++++++
LCALL R_TXD;配置收發芯片。
LCALL CLEAR_DATA
;-------------------------------------------------
;查詢接收中斷,讀取數據。
;-------------------------------------------------
K3:
;LCALL DELAY1
CLR R_LED
JB IRQ,$;------------$$$$$$$$$$$$$$$$$$$$$
SETB R_LED
LCALL RECIVE_WRITE
MOV A,49H
JNZ K15
MOV A,4BH
JNZ K15
LJMP K3
;-------------------------------------------------
;=================================================
;********************子程序模塊*******************
;===========================================
;===============數據接收寫入================
RECIVE_WRITE:
LJMP REC14
;----------------------接收數據/寫卡。循環等待 "接收中斷"和"寫卡"信號。
REC13:
CLR CSN
MOV SPI0DAT,#017H;讀FIFO_STATUS。
JNB SPIF,$
CLR SPIF
MOV SPI0DAT,#017H;讀FIFO_STATUS。
JNB SPIF,$
CLR SPIF
MOV A,SPI0DAT
SETB CSN
JB ACC.0,REC14;=1空;=0有數據。
LJMP REC1
REC14:
JNB IRQ,REC1;$$$$$$$$$$$$$$$$$$$$$
JB TF2H,REC6;T2 丟失數據時填充XRAM定時器。
JNB TF0,REC14;T0 結束監視定時器。
LJMP REC12
REC1:
;CPL G_LED
LCALL READ_32BYTES;*****************
CLR TR2
CLR TF2H
JB MARK.3,REC3
;----------------開啟填充定時器。
MOV TMR2L,#00H;10.7mS
MOV TMR2H,#00H
SETB TR2
LJMP REC3
;-------------------------------------------
REC12:
CLR TF0
DJNZ R_DELA,REC14
SETB MARK.7
LJMP REC7
REC6:
CLR TR2
CLR TF2H
LCALL FULL_DATA
;==============================================================
REC3:
JNB MARK.3,REC7;=1, 開始寫SD卡標志。
CLR CSN
MOV SPI0DAT,#0E2H;沖洗接收緩沖區。
JNB SPIF,$
CLR SPIF
SETB CSN
LJMP REC8
REC7:
JNB MARK.7,REC13;--------數據傳送"完畢"。
SETB MARK.5
RET
;===============================================================
REC8:
;JNB MISO,REC5;=1已經為本次寫入準備好。
CLR MARK.3;清除 "寫卡"信號。
REC10:
;+++++++++++++++++++++++++++++++++++++++++++++++++
mov SPI0CFG, #070h;SD卡模式。
mov SPI0CN, #001h;
;mov SPI0CKR, #00Eh;200K
mov SPI0CKR, #000h;3.0625M
;+++++++++++++++++++++++++++++++++++++++++++++++++
LCALL WRITE_ONE_BLOCK
CPL G_LED
MOV R_DELA,#60;復位延時接收參數。
;+++++++++++++++++++++++++++++++++++++++++++++++++
mov SPI0CFG, #040h;無線模塊模式。
mov SPI0CN, #001h;
mov SPI0CKR, #000h;3.0625M
;+++++++++++++++++++++++++++++++++++++++++++++++++
;JB MARK.4,REC11;數據寫入完成(MISO=1?)。
;LJMP REC2
REC11:
INC 48H;已寫扇區計數器。
LCALL NEXT_ADRESS;求出下一扇區字節地址。
;#########################################################
;-------------------------本次接收完成------------------
REC2:
JNB MARK.7,REC15;判完標志。
;CLR TI0
;MOV IE,#00h;關UART中斷。
SETB MARK.5
; SETB BLUE_LED
RET
REC15:
LJMP REC13
;#########################################################
;-------------------------------------------出錯提示。
REC4:;MARK.4=0,上次數據未被接受。
MOV IE,#00h;關UART中斷。
RET
REC5:;MISO=0,設備未準備好。
MOV IE,#00h;關UART中斷。
RET
;===========================================
;================讀取RX數據===============
;===========================================
READ_32BYTES:
MOV R2,#20H
CLR CSN
MOV SPI0DAT,#061H;讀RX數據(讀狀態寄存器)。
JNB SPIF,$
CLR SPIF
R32_1:
MOV SPI0DAT,#00H;讀RX數據。
JNB SPIF,$
CLR SPIF
MOV A,SPI0DAT
MOVX @DPTR,A
INC DPTR;****************
DJNZ R2,R32_1
SETB CSN
CLR CSN
MOV SPI0DAT,#027H;寫STATUS。
JNB SPIF,$
CLR SPIF
MOV SPI0DAT,#7EH;清除STATUS標志;
JNB SPIF,$
CLR SPIF
SETB CSN
;MOV TMR2L,#00H;257mS
;MOV TMR2H,#00H
;--------------------------------------------收到一個數據塊。
INC 49H;
;-------------------------
;CPL BLUE_LED;反轉指示燈。
SETB MARK.0; =1,收到一段數據。
;-------------------------
MOV A,DPH
CJNE A,#02H,R32_2;檢查是否寫完1扇區。
MOV DPTR,#0000H
SETB MARK.3;開始寫卡標志。
CLR MARK.0; =1,收到一段數據。
MOV 49H,#00H
INC 4BH
R32_2:
RET
;MOV 48H,#00H;已寫扇區計數器。
;MOV 49H,#00H;最后一扇區數據塊的個數。
;MOV 4BH,#00H;共收到數據扇區數。
;===========================================
;================填充XRAM數據===============
;===========================================
FULL_DATA:
MOV A,#00H
MOVX @DPTR,A
INC DPTR;****************
MOV A,DPH
CJNE A,#02H,FULL_DATA;檢查是否寫完1扇區。
MOV DPTR,#0000H
SETB MARK.3;開始寫卡標志。
CLR MARK.0; =1,收到一段數據。
MOV 49H,#00H
INC 4BH
RET
;MOV 48H,#00H;已寫扇區計數器。
;MOV 49H,#00H;最后一扇區數據塊的個數。
;MOV 4BH,#00H;共收到數據扇區數。
;-------------------------------------------------
;初始化配置收發寄存器。
;-------------------------------------------------
R_TXD:
CLR CSN
MOV SPI0DAT,#031H;寫接收 0通道 字節數。
JNB SPIF,$
CLR SPIF
MOV SPI0DAT,#020H;32bytes
JNB SPIF,$
CLR SPIF
SETB CSN
nop
CLR CSN
MOV SPI0DAT,#032H;寫 1通道 字節數。
JNB SPIF,$
CLR SPIF
MOV SPI0DAT,#020H;32bytes
JNB SPIF,$
CLR SPIF
SETB CSN
nop
CLR CSN
MOV SPI0DAT,#026H;
JNB SPIF,$
CLR SPIF
MOV SPI0DAT,#007H;1Mbps,0dBm。
JNB SPIF,$
CLR SPIF
SETB CSN
nop
nop
CLR CSN
MOV SPI0DAT,#02AH;寫 0通道 5字節=接收=地址D8D8D8D8D8。
JNB SPIF,$
CLR SPIF
MOV R1,#5
R_T1:
MOV SPI0DAT,#0D8H;
JNB SPIF,$
CLR SPIF
DJNZ R1,R_T1
SETB CSN
nop
CLR CSN
MOV SPI0DAT,#030H;寫 5字節=發送=地址D8D8D8D8D8。
JNB SPIF,$
CLR SPIF
MOV R1,#5
R_T2:
MOV SPI0DAT,#0D8H;
JNB SPIF,$
CLR SPIF
DJNZ R1,R_T2
SETB CSN
nop
CLR CSN
MOV SPI0DAT,#025H;設定工作頻道。
JNB SPIF,$
CLR SPIF
MOV SPI0DAT,#020H;32頻道
JNB SPIF,$
CLR SPIF
SETB CSN
nop
;-------------------------------------------------
;接收配置。
;-------------------------------------------------
CLR CSN
MOV SPI0DAT,#020H;寫CONFIG。
JNB SPIF,$
CLR SPIF
MOV SPI0DAT,#00BH;上電,接收態。
JNB SPIF,$
CLR SPIF
SETB CSN
SETB CE
RET
;-------------------------------------------------
;-------------------------------------------------
;清除中斷源,和發射緩沖區。
;----------------------------------
CLEAR_DATA:
CLR CSN
MOV SPI0DAT,#027H;寫STATUS。
JNB SPIF,$
CLR SPIF
MOV SPI0DAT,#7EH;清除STATUS標志;
JNB SPIF,$
CLR SPIF
SETB CSN
NOP
CLR CSN
MOV SPI0DAT,#0E1H;沖洗發射緩沖區。
JNB SPIF,$
CLR SPIF
SETB CSN
RET
;----------------------------------
;***********************************************
;6.125MHz工作配置。
;***********************************************
Timer_Init:
mov TMOD, #001h;T0 16位,T2 16位。
mov CKCON, #011h;T0 SYSCLK/4;T2 SYSYCLK.
ret
;SPI_Init:
; mov SPI0CFG, #040h
; mov SPI0CN, #001h
; mov SPI0CKR, #00Eh
; ret
Port_IO_Init:
; P0.0 - Skipped, Push-Pull, Digital
; P0.1 - Skipped, Open-Drain, Digital
; P0.2 - SCK (SPI0), Push-Pull, Digital
; P0.3 - MISO (SPI0), Open-Drain, Digital
; P0.4 - MOSI (SPI0), Push-Pull, Digital
; P0.5 - Skipped, Push-Pull, Digital
; P0.6 - Skipped, Push-Pull, Digital
; P0.7 - Unassigned, Open-Drain, Digital
; P1.0 - Unassigned, Open-Drain, Digital
; P1.1 - Unassigned, Open-Drain, Digital
; P1.2 - Skipped, Open-Drain, Digital
; P1.3 - Skipped, Open-Drain, Digital
; P1.4 - Unassigned, Open-Drain, Digital
; P1.5 - Unassigned, Open-Drain, Digital
; P1.6 - Unassigned, Open-Drain, Digital
; P1.7 - Unassigned, Open-Drain, Digital
mov P0MDOUT, #075h
mov P0SKIP, #063h
mov P1SKIP, #00Ch
mov XBR0, #002h
mov XBR1, #040h
ret
Oscillator_Init:
mov OSCICN, #081h;6.125M
ret
; Initialization function for device,
; Call Init_Device from your main program
Init_Device:
lcall Timer_Init
;lcall SPI_Init
lcall Port_IO_Init
lcall Oscillator_Init
ret
;===========================================
;=== 延時子程序 ===
DELAY4:
MOV R5,#20
DEL11:
MOV R6,#250
DEL10:
MOV R7,#0FFH
DEL9:
DJNZ R7,DEL9
DJNZ R6,DEL10
DJNZ R5,DEL11
RET
DELAY3:;R5=3,每扇區寫間的延時等待。
MOV R5,#3
DEL6:
MOV R6,#250
DEL5:
MOV R7,#0FFH
DEL4:
DJNZ R7,DEL4
DJNZ R6,DEL5
DJNZ R5,DEL6
RET
DELAY2:
MOV R5,#1
DEL3:
MOV R6,#200
DEL2:
MOV R7,#0FFH
DEL1:
DJNZ R7,DEL1
DJNZ R6,DEL2
DJNZ R5,DEL3
RET
DELAY1:
MOV R6,#60;=60,1.275mS
DEL7:
MOV R7,#0FFH
DEL8:
DJNZ R7,DEL8
DJNZ R6,DEL7
RET
DELAY9:
MOV R6,#150
DEL97:
MOV R7,#0FFH
DEL98:
DJNZ R7,DEL98
DJNZ R6,DEL97
RET
;===========================================
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -