📄 voip8kisr.asm
字号:
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 + -