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

📄 voip8kisr.asm

📁 Cypress 的VOIP DEMO 研究VOIP终端的朋友可以研究研究
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	MOV	A, REG[IDX_PP]
	PUSH	A
	; -----------------------------
	MOV	A, REG[CUR_PP]
	PUSH	A
	MOV	REG[CUR_PP], 0
	; -----------------------------


	; --------------------------------------------------------------------
	; Adjust 8 KHz interrupt to track RF stream from Headset
	; --------------------------------------------------------------------
	MOV	A, [isrPeriod]
	MOV	REG[PWM16_1_PERIOD_LSB_REG], A
	; --------------------------------------------------------------------

	; --------------------------------------------------------------------
	;
	; STATE-MACHINE TO CONTROL RADIO TX/RX SLOTTING
	;
	; --------------------------------------------------------------------
	INC	[_slotCt]
	MOV	A, [_slotCt]
	ASL	A		; 2 bytes/jump
	JACC	.jpTbl
	; --------------------------------------------------------------------
.jpTbl:	JMP	doSynchronize	; 0  Synchronize
	; ---------------------------
	JMP	doFrameTx_1a	; 1  TRANSMIT 
	JMP	isrRadX		; 2	      
	JMP	doFrameTx_3a	; 3 	      
	JMP	doFrameTx_4a	; 4 	      
	JMP	isrRadX		; 5 	      
	JMP	doFrameTx_6a	; 6           
; ----------------------------------	 
	JMP	doFrameRx_1	; 7  RECEIVE  
	JMP	doFrameRx_2a	; 8 	      
	JMP	doFrameRx_3a	; 9 	      
	JMP	isrRadX		; 10	      
	JMP	doFrameRx_5a 	; 11	      
	JMP	doFrameRx_6a	; 12	      
; ----------------------------------	 
	JMP	doFrameTx_1b	; 13 TRANSMIT 
	JMP	doFrameTx_2b	; 14	      
	JMP	doFrameTx_3b	; 15	      
	JMP	doFrameTx_4b	; 16	      
	JMP	isrRadX	 	; 17	      
	JMP	isrRadX		; 18	      
; ----------------------------------	 
	JMP	doFrameRx_1	; 19 RECEIVE  
	JMP	doFrameRx_2b	; 20	      
	JMP	doFrameRx_3b	; 21	      
	JMP	isrRadX		; 22	      
	JMP	doFrameRx_5b	; 23	      
	JMP	doFrameRx_6b	; 24	      
; ----------------------------------	 
CH_CHG_STATE:	EQU	25 
	JMP	doChChg1	; 25
	JMP	doChChg2	; 26
	JMP	doChChg3	; 27
	JMP	doChChg4	; 28
	JMP	doChChg5	; 29
	JMP	doChChg6	; 30
	JMP	doChChg11	; 30
	JMP	doChChg12	; 30
	JMP	doChChg13	; 30
	JMP	doChChg14	; 30
	JMP	doChChg15	; 30
	JMP	doChChg16	; 30
; ----------------------------------	 

; ----------------------------------------------------------------------------
;
; CONTROLLED CHANNEL CHANGE, MAINTAIN SYNCHRONOUS SLOT TIMING.
;
; Currently it begins on a Rx slot because the radio's state is best most
;  controlled just prior to RX_GO.
;
; It currently finishes just before the following Rx slot.  The Tx slot is
;  problematic because some Tx setup occurs in the latter stages of Rx
;
; ----------------------------------------------------------------------------
; doChChg1 - Set radio in IDLE state, starts just before RxGo cycle
; ----------------------------------------------------------------------------
doChChg1:		; Time 0 uS
;	TP2_LOW
	MOV	[_slotCt], CH_CHG_STATE
	MOV	A, XACT_CFG_ADR + bSPI_WRITE
	MOV	X, FRC_END_STATE + END_STATE_IDLE
	CALL	isrRadioWrite
.L1:	MOV	A, XACT_CFG_ADR		; Wait for FRC_END_STATE to finish
	CALL	isrRadioRead
	AND	A, FRC_END_STATE
	JNZ	.L1
	JMP	isrRadX

; ----------------------------------------------------------------------------
; doChChg2 - Write new channel to radio
; ----------------------------------------------------------------------------
doChChg2:
;	TP2_HIGH
	MOV	A, CHANNEL_ADR + bSPI_WRITE
	MOV	X, [_voiceCh]
	CALL	isrRadioWrite
	JMP	isrRadX

; ----------------------------------------------------------------------------
; doChChg3,4,5 - Synthesizer settling time
; ----------------------------------------------------------------------------
doChChg3:	// 125 uS settling
doChChg4:	// 250 uS settling
doChChg5:	// 375 uS settling
doChChg6:	//
doChChg11:	//
doChChg12:	//
doChChg13:	//
doChChg14:	//
doChChg15:	//
	JMP	isrRadX

; ----------------------------------------------------------------------------
; doChChg13 - Set radio in RXSYNTH, ready for RxGo at next ISR
; ----------------------------------------------------------------------------
doChChg16:	// 375 uS settling
	MOV	A, XACT_CFG_ADR + bSPI_WRITE
	MOV	X, FRC_END_STATE + END_STATE_RXSYNTH
	CALL	isrRadioWrite
.L1:	MOV	A, XACT_CFG_ADR		; Wait for FRC_END_STATE to finish
	CALL	isrRadioRead
	AND	A, FRC_END_STATE
	JNZ	.L1
	MOV	[_slotCt], 6		; Next ISR is RxA
	MOV	[_reqChWrite], 0	; Clear ch write request
	JMP	isrRadX

; ----------------------------------------------------------------------------
;
; doFrameTx_1 - TX_GO for frame (only if RX_GO is clear)
;
; ----------------------------------------------------------------------------
doFrameTx_1a:
	UART_START
	TEST_TIK_HI
	TEST_TIK_LO
; --------------------------------------; TEST ONLY
SKIP_MASK: EQU	0x06
  IF SLOTSKIP_TEST	;;;;;;;;;;;;;;;;; Test farside recovery by skipping
	MOV	A, [_voipCt+LSB]	;  some TX_GO slots
	AND	A, SKIP_MASK		;
	cmp	a, 0x00			; Suppress 16 consecutive Tx A slots
;	tst	[_voipCt+LSB], 1	; Suppress Alternate Tx A slots
	jz	skipTx			;
  ENDIF			;;;;;;;;;;;;;;;;;
; --------------------------------------; TEST ONLY
	JMP	doFrameTx_1x
	; --------------------------------------------------------------------

doFrameTx_1b:
	UART_BIT
; --------------------------------------; TEST ONLY
  IF SLOTSKIP_TEST	;;;;;;;;;;;;;;;;; Test farside recovery by skipping
	MOV	A, [_voipCt+LSB]	;  some TX_GO slots
	AND	A, SKIP_MASK		;
	cmp	a, SKIP_MASK		; Suppress 16 consecutive Tx B slot
;	tst	[_voipCt+LSB], 1	; Suppress Alternate B Tx slots
	jz	skipTx			;
  ENDIF			;;;;;;;;;;;;;;;;;
; --------------------------------------; TEST ONLY

doFrameTx_1x:
	; --------------------------------------------------------------------
	; Confirm RX_GO is zero before TX_GO is issued:
	;  Either because already aborted Rx (rxGoOn = 0)
	;  Or because Rx self-finished (IRQ implies RXC/RXE or finished)
	; --------------------------------------------------------------------
	MOV	A, [rxGoOn]
	JZ	txGo			; Already aborted Rx
	IS_IRQ_ON
       	JNZ	txGo			; IRQ implies RXC or RXE, TX_GO OK
	TST	[rxIrqStatus], RXC_IRQ + RXE_IRQ
	JNZ	txGo			; RX_GO finished early, TX_GO OK
	; --------------------------------------------------------------------
	; RX_GO is *still* active (probably LENGTH field was corrupt).
	; Let Rx Buffer overflow to end RX_GO (but this TX Slot is missed)
	; --------------------------------------------------------------------
skipTx:	INC_16	_mibMissTx
	MOV	[txGoSkipped], 1
	JMP	isrRadX

	; --------------------------------------------------------------------
txGo:	; Issue TxGO at consistent offset from ISR entry
	;
	; The correct delay from the ISR to the TxGO issue is established
	;  by the delay from the ISR to SOP Tracking in doFrameRx_2.
	;  The goal 662 uS between SOP2 and PA2.
	;  Since PA1 to SOP2 is 88 uS, 662 uS gives 750 uS PA1 to PA2.
	;  Since 662mod125 = 37uS and 37 uS is about the time for the SPI 
	;  writes and for the PA to respond to TxGO, no tweak delay is needed
	; --------------------------------------------------------------------
	; ---------- goto Receive mode when Tx finished
	MOV	X, END_STATE_RX
	MOV	A, XACT_CFG_ADR + bSPI_WRITE
	CALL	isrRadioWrite
	MOV	[txGoSkipped], 0	; Tx GO was issued
	
	; --------------------------------------------------------------------
	; Position TX_GO 85 uS from falling edge of Remote PACTL
	; --------------------------------------------------------------------
DLY1:	EQU	(1 * CPU_MHZ/9)	;
	MOV	A, DLY1		;
.L1:	DEC	A		; 4
	JNZ	.L1		; 5

 	; ---------- Write Tx length and set TxGo
	MOV	[timeTmpB], [txPktLen]
	MOV	[timeTmpC], TX_GO
	MOV	[timeTmpA], timeTmpB  
	MOV	X, 2		; Packet length
	MOV	A, TX_LENGTH_ADR + bSPI_AUTO_INC + bSPI_WRITE
	CALL	isrRadioBurstWriteWip	; Write length and TX control as burst.

	JMP	isrRadX

doFrameTx_2b:
	UART_BIT
	JMP	isrRadX

; ----------------------------------------------------------------------------
;
; doFrameTx_3b - Preparation for copying Rx A data (first VOIP frame)
; doFrameTx_3a - Preparation for copying Rx B data (if Rx A data was missed)
;
; ----------------------------------------------------------------------------
doFrameTx_3b:				; Unload FIRST VoIP Rx Frame
	TEST_TIK_ERR2_LO
	JMP	doFrameTx_3x

doFrameTx_3a:				; Unload SECOND VoIP Rx Frame
	UART_BIT
	MOV	[rxVoipSet], 0		; Haven't loaded *new* VOIP frame yet


doFrameTx_3x:				; Unload VoIP Rx Frame
	; --------------------------------------------------------------------
	; Evaluate prior Receive results, store length to unload next ISR
	; --------------------------------------------------------------------
	MOV	[radRxCount], 0		; Default to no data to load
	CMP	[rxPktStat],RXPKT_NOSOP	; If there was no SOP,
	JZ	.noRxFrame		;  then we're done
					; Had SOP, so expect RXC and/or RXE
	MOV	A, RX_IRQ_STATUS_ADR
	CALL	isrRadioRead
	OR	[rxIrqStatus], A
	TST	[rxIrqStatus], RXOW_IRQ + RXBERR_IRQ + RXE_IRQ
	JZ	.ok			; No error
	; --------------------------------------------------------------------
	TEST_TIK_ERR1_HI		; ERROR found
	INC_16	_mibMissRx_1
	OR	[rxIrqStatus], RXC_IRQ	; RXE implies RXC (per HD)
	MOV	A,  RX_STATUS_ADR	; ERROR FLAG(s)
	CALL	isrRadioRead
	MOV	[radRxCount], 16	; Errors unload full 16 Bytes
	JMP	.trash			;  into TRASH buffer
	; --------------------------------------------------------------------

.ok:	TST	[rxIrqStatus], RXC_IRQ	; Had SOP, so have RXC if radio 250K
	JZ	isrRadX			;  Only if radio goes 125K or 62K

; ----------------------------------------------------------------------------
; DIVERSITY TEST: Read/Record individual Antenna RSSI
; ----------------------------------------------------------------------------
	MOV	A, RSSI_ADR
	CALL	isrRadioRead
	AND	A, 0x1F			; A = 000x xxxx = 5-bit raw RSSI
	CMP	[_slotCt], 3
	JNZ	.slotB
; -------------------------------------
.slotA:	CMP	A, [_tstRssiMax0]
	JC	.s1
	MOV	[_tstRssiMax0], A
.s1:	CMP	A, [_tstRssiMin0]
	JNC	.s11
	MOV	[_tstRssiMin0], A
	; ------------------------------
.s11:  	
	PUSH	A			; A = 000x xxxx = 5-bit raw RSSI
       	MOV	A, [_rssiAveA_Q3]	; Average RSSI for Antenna A
	ASR	A			;
	ASR	A			;
	ASR	A			;
	AND	A, 0x1F			; Ave>>3
	SUB	[_rssiAveA_Q3], A	;
	POP	A			;
	ADD	[_rssiAveA_Q3], A	; ave = ave - (ave>>3) + raw
       	JMP	.exit			;
; -------------------------------------
.slotB:	CMP	A, [_tstRssiMax1]
       	JC	.s2
       	MOV	[_tstRssiMax1], A
.s2:   	CMP	A, [_tstRssiMin1]
       	JNC	.s21
       	MOV	[_tstRssiMin1], A
	; ------------------------------
.s21:  	PUSH	A			; A = 000x xxxx = 5-bit raw RSSI
       	MOV	A, [_rssiAveB_Q3]	; Average RSSI for Antenna B
	ASR	A			;
	ASR	A			;
	ASR	A			;
	AND	A, 0x1F			; Ave>>3
	SUB	[_rssiAveB_Q3], A	; ave = ave - (ave>>3)
	POP	A			;
	ADD	[_rssiAveB_Q3], A	; ave = ave - (ave>>3) + raw
	; fallthru
.exit:
; ----------------------------------------------------------------------------

	MOV	A, RX_COUNT_ADR
	CALL	isrRadioRead

	MOV	[radRxCount], A		; # bytes to Read
	CMP	A, VOIP_PKT_LEN
	JNZ	isrRadX			; CONTROL Packet

	; --------------------------------------------------------------------
	; Received valid VOIP frame, schedule radio buffer unload
	; --------------------------------------------------------------------
.voip:	CMP	[rxVoipSet], 0		; If already have new VOIP sample-set
	JNZ	.trashDup		;  then TRASH duplicate VOIP frame.

	MOV	[RadioWipPtr], bufRxVoip0	; Default
	TST	[bufRxVoipTog], 1
	JZ	isrRadX		  ; Use this VOIP buffer
	MOV	[RadioWipPtr], bufRxVoip1 ; Use that VOIP buffer
	JMP	isrRadX

.trashDup:
.trash:
	MOV	[rxPktStat], RXPKT_TRASH
	JMP	isrRadX

; No SOP earlier, so no Rx data available
.noRxFrame:
	JMP	isrRadX

; ----------------------------------------------------------------------------
;
; doFrameTx_4 -
;
; ----------------------------------------------------------------------------
doFrameTx_4a:
	UART_BIT
	JMP	doFrameTx_4x
	; --------------------------------------------------------------------
doFrameTx_4b:
	UART_STOP
	; --------------------------------------------------------------------
doFrameTx_4x:
	; --------------------------------------------------------------------
	; If Rx data pending, finally unload Radio
	; --------------------------------------------------------------------
	MOV	A, [radRxCount]		; # data bytes in Radio

⌨️ 快捷键说明

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