; ====== RX DDS AD9835 support: ======
DDS = 0916D9C7H ;initial Rx DDS frequency
Fr0 .EQU O20H.1 ;RX DDS Frequency0 flag
DDS_Cmd_WrPh .EQU 00000000B ;write phase byte
DDS_Cmd_WrPhDef .EQU 00010000B ;-//- to the defer register
DDS_Ph0 .EQU 00001000B ;phase0 address
DDS_Ph1 .EQU 00001010B ;phase1 address
DDS_Ph2 .EQU 00001100B ;phase2 address
DDS_Ph3 .EQU 00001110B ;phase3 address
DDS_Ph_LSB .EQU 00000000B ;phase byte 1 address
DDS_Ph_MSB .EQU 00000001B ;phase byte 2 address
DDS_Cmd_WrFr .EQU 00100000B ;write frequency byte
DDS_Cmd_WrFrDef .EQU 00110000B ;-//- to the defer register
DDS_Fr0 .EQU 00000000B ;frequency0 address
DDS_Fr1 .EQU 00000100B ;frequency1 address
DDS_Fr_L_LSB .EQU 00000000B ;frequency byte 1 address
DDS_Fr_H_LSB .EQU 00000001B ;frequency byte 2 address
DDS_Fr_L_MSB .EQU 00000010B ;frequency byte 3 address
DDS_Fr_H_MSB .EQU 00000011B ;frequency byte 4 address
DDS_Cmd_PSel .EQU 01000000B ;phase select command
DDS_Cmd_FSel .EQU 01010000B ;frequency select command
DDS_Cmd_PFSel .EQU 01100000B ;phase and frequency select command
DDS_PSEL0 .EQU 00000000B ;select phase0
DDS_PSEL1 .EQU 00000010B ;select phase1
DDS_PSEL2 .EQU 00000100B ;select phase2
DDS_PSEL3 .EQU 00000110B ;select phase3
DDS_FSEL0 .EQU 00000000B ;select frequency0
DDS_FSEL1 .EQU 00001000B ;select frequency1
DDS_Cmd_Cnt1 .EQU 10000000B ;DDS control 1 command
DDS_SYNC .EQU 00100000B ;SYNC bit
DDS_SELSRC .EQU 00010000B ;SELSRC bit
DDS_Cmd_Cnt2 .EQU 11000000B ;DDS control 2 command
DDS_SLEEP .EQU 00100000B ;SLEEP bit
DDS_RESET .EQU 00010000B ;RESET bit
DDS_CLR .EQU 00001000B ;CLR bit
;Set RX DDS Phase
;Input: R2:R1 - phase code
; A - phase register number (0..3)
RxDDS_P: JNZ Ph1
MOV R3,#DDS_Ph0
MOV R4,#DDS_PSEL0+DDS_Cmd_PSel
SJMP PhX
Ph1: DEC A
JNZ Ph2
MOV R3,#DDS_Ph1
MOV R4,#DDS_PSEL1+DDS_Cmd_PSel
SJMP PhX
Ph2: DEC A
JNZ Ph3
MOV R3,#DDS_Ph2
MOV R4,#DDS_PSEL2+DDS_Cmd_PSel
SJMP PhX
Ph3: MOV R3,#DDS_Ph3
MOV R4,#DDS_PSEL3+DDS_Cmd_PSel
PhX: MOV A,#DDS_Cmd_WrFrDef+DDS_Ph_LSB
ADD A,R3
MOV B,R1
LCALL RxDDS_Wr
MOV A,#DDS_Cmd_WrFr+DDS_Ph_MSB
ADD A,R3
MOV B,R2
LCALL RxDDS_Wr
MOV A,R4
LCALL RxDDS_Wr
RET
;Set RX DDS Frequency
;Input: R4:R3:R2:R1 - frequency code
; Fr0 - Frequency0 flag
;Out: Fr0 = !Fr0
RxDDS_F: JNB Fr0,Freq1
Freq0: MOV R5,#DDS_Fr0
MOV R6,#DDS_Cmd_FSel+DDS_FSEL0
SJMP FreqS
Freq1: MOV R5,#DDS_Fr1
MOV R6,#DDS_Cmd_FSel+DDS_FSEL1
FreqS: MOV A,#DDS_Cmd_WrFrDef+DDS_Fr_L_LSB
ADD A,R5
MOV B,R1
LCALL RxDDS_Wr
MOV A,#DDS_Cmd_WrFr+DDS_Fr_H_LSB
ADD A,R5
MOV B,R2
LCALL RxDDS_Wr
MOV A,#DDS_Cmd_WrFrDef+DDS_Fr_L_MSB
ADD A,R5
MOV B,R3
LCALL RxDDS_Wr
MOV A,#DDS_Cmd_WrFr+DDS_Fr_H_MSB
ADD A,R5
MOV B,R4
LCALL RxDDS_Wr
MOV A,R6
LCALL RxDDS_Wr
CPL Fr0
RET
;Init RX DDS:
;Phase0 = 0
;Frequency = #DDS
RxDDS_I: MOV A,#DDS_Cmd_Cnt2+DDS_SLEEP+DDS_RESET+DDS_CLR
LCALL RxDDS_Wr
MOV A,#DDS_Cmd_Cnt1+DDS_SYNC+DDS_SELSRC
LCALL RxDDS_Wr
CLR A
MOV R1,A
MOV R2,A
LCALL RxDDS_P
MOV R1,# DDS & 0FFH
MOV R2,#(DDS>>8) & 0FFH
MOV R3,#(DDS>>16) & 0FFH
MOV R4,#(DDS>>24) & 0FFH
LCALL RxDDS_F
MOV A,#DDS_Cmd_Cnt2
LCALL RxDDS_Wr
RET
;Rx DDS Write:
;In: A = control byte
; B = data byte
RxDDS_Wr: CLR RSYNC
LCALL Ser_Wr0
MOV A,B
LCALL Ser_Wr0
SETB RSYNC
RET