;########################################################################### ;# TEST MENU AND ROUTINES FOR SCC2692 DUART # ;# can be added to SBCMon # ;########################################################################### ;hardware-dependant mapping in XRAM space; takes 4 address lines A[3:0] DUART_MRA EQU 7F20h DUART_SRA EQU 7F21h DUART_CSRA EQU 7F21h DUART_CRA EQU 7F22h DUART_BRG2 EQU 7F22h DUART_RHRA EQU 7F23h DUART_THRA EQU 7F23h DUART_ACR EQU 7F24h DUART_IPCR EQU 7F24h DUART_ISR EQU 7F25h DUART_IMR EQU 7F25h DUART_CTU EQU 7F26h DUART_CTUR EQU 7F26h DUART_CTL EQU 7F27h DUART_CTLR EQU 7F27h DUART_MRB EQU 7F28h DUART_SRB EQU 7F29h DUART_CSRB EQU 7F29h DUART_CRB EQU 7F2Ah DUART_BRGA EQU 7F2Ah DUART_RHRB EQU 7F2Bh DUART_THRB EQU 7F2Bh DUART_IP06 EQU 7F2Dh DUART_OPCR EQU 7F2Dh DUART_STARTCNT EQU 7F2Eh DUART_STOPCNT EQU 7F2Fh DUART_SETOP EQU 7F2Eh DUART_RESETOP EQU 7F2Fh ;***************************************************************** ;* Command 'S' and 's': send/receive on SCC2692 DUART * ;* S or s alone: start local echo on port A or B * ;* type Ctrl-X to quit * ;* S or s with string: sends the string to port A or B * ;* (Add 'S' and 's' keys with LJMP here to CmdTable) * ;***************************************************************** CmdDUART: MOV R0,#CmdBuffer MOV A,@R0 MOV C,ACC.5 ;select port 2 if lower case INC R0 MOV A,@R0 JZ CmdDUARTRecv CmdDUARTSendLoop: LCALL SendSerialByteDUART INC R0 MOV A,@R0 JNZ CmdDUARTSendLoop CmdDUARTEnd: LJMP SBCMain CmdDUARTRecv: MOV F0,C CmdDUARTRecvLoop: MOV C,F0 LCALL GetSerialByteDUART JNC CmdDUARTRecvLoop CJNE A,#CTRLX,CmdDUARTEcho SJMP CmdDUARTEnd CmdDUARTEcho: MOV C,F0 LCALL SendSerialByteDUART SJMP CmdDUARTRecvLoop ;***************************************************************** ;* Initialize SCC2692 DUART with 3.6864 MHz crystal * ;***************************************************************** InitDUART: MOV DPTR,#DUART_CRA MOV A,#25h ;CRA: reset receiver MOVX @DPTR,A MOV A,#35h ;CRA: reset transmitter MOVX @DPTR,A MOV A,#15h ;CRA: reset MR pointer, enable TX & RX MOVX @DPTR,A MOV DPTR,#DUART_MRA MOV A,#13h ;MR1A: no RTS, RxRDY, Char, no parity, 8 bits MOVX @DPTR,A LCALL WAIT47us MOV A,#07h ;MR2A: normal channel mode, 1 stop bit MOVX @DPTR,A MOV DPTR,#DUART_CSRA MOV A,#0CCh MOVX @DPTR,A MOV DPTR,#DUART_CRB MOV A,#25h ;CRB: reset receiver MOVX @DPTR,A MOV A,#35h ;CRB: reset transmitter MOVX @DPTR,A MOV A,#15h ;CRB: reset MR pointer, enable TX & RX MOVX @DPTR,A MOV DPTR,#DUART_MRB MOV A,#13h ;MR1B: RxRDY, Char, no parity, 8 bits MOVX @DPTR,A LCALL WAIT47us MOV A,#07h ;MR2B: normal channel mode, 1 stop bit MOVX @DPTR,A MOV DPTR,#DUART_CSRB MOV A,#0CCh MOVX @DPTR,A MOV DPTR,#DUART_ACR MOV A,#11100000b ;ACR7=1, Timer=X1/CLK MOVX @DPTR,A ;test at 19200 baud CLR C LCALL SendSerialD DB "SCC2692 port 1",13,0 SETB C LCALL SendSerialD DB "SCC2692 port 2",13,0 ;test 115200 baud with normal 7200 baud rate ; MOV A,#01110000b ; MOV DPTR,#DUART_ACR ; MOVX @DPTR,A ; MOV A,#10 ; CLR C ; LCALL SetDUARTBaudRate ; MOV A,#10 ; SETB C ; LCALL SetDUARTBaudRate ; MOV DPTR,#DUART_BRGA ; MOVX A,@DPTR ; CLR C ; LCALL SendSerialD ; DB "8031EVB serial port 1 @115200",13,0 ; SETB C ; LCALL SendSerialD ; DB "8031EVB serial port 2 @115200",13,0 ;leave test mode ; MOV DPTR,#DUART_BRGA ; MOVX A,@DPTR ;Warning when using test mode at base address + 0Ah: ;Output pins 0 & 1 are then connected to internal clock nodes. ;If they are wired to RTS externally, the receiver may dislike ;high frequency edges on its CTS input (interrupt flood) RET ;DUART BaudRate Table ;value -> baud in CSR[7:4] for Rx and CSR[3:0] for Tx ;with ACR[7]=0 ACR[7]=1 BRGTest A ;0 50 75 7200 ;1 110 110 880 ;2 134.5 134.5 1076 ;3 200 150 14400 ;4 300 300 28800 ;5 600 600 57600 ;6 1200 1200 115200 ;7 1050 2000 2000 ;8 2400 2400 57600 ;9 4800 4800 4800 ;10 7200 1800 14400 ;11 9600 9600 9600 ;12 38400 19200 19200 ;13 Timer Timer ;14 IP4-16X IP4-16X ;15 IP4-1X IP4-1X ;***************************************************************** ;* Function: GetSerialByteDUART * ;* Purpose: Checks if a byte has been received from the external* ;* serial port and returns it in the accumulator (C=1) * ;* or resets C=0 if the receive buffer was empty * ;* Input: C: port 0/1 * ;* Output: ACC: Byte that was received via the ext.serial port * ; C: status 1=byte read * ;* Destroyed Registers: DPTR * ;***************************************************************** GetSerialByteDUART: JC GetSerialByteDUARTb GetSerialByteDUARTa: MOV DPTR,#DUART_SRA MOVX A,@DPTR RRC A ;move bit 0 to C and test it JC GetSerialByteDUART2 RET GetSerialByteDUART2: MOV DPTR,#DUART_RHRA MOVX A,@DPTR SETB C RET GetSerialByteDUARTb: MOV DPTR,#DUART_SRB MOVX A,@DPTR RRC A ;move bit 0 to C and test it JC GetSerialByteDUARTb2 RET GetSerialByteDUARTb2: MOV DPTR,#DUART_RHRB MOVX A,@DPTR SETB C RET ;***************************************************************** ;* Function: SendSerialByteDUART * ;* Purpose: Sends the byte in the accumulator to the ext.serial * ;* port after waiting for transmitter readuy * ;* Input: ACC: Byte to send, C: port 0/1 * ;* Output: None. * ;* Destroyed Registers: DPTR * ;***************************************************************** SendSerialByteDUART: JC SendSerialByteDUARTb SendSerialByteDUARTa: PUSH ACC MOV DPTR,#DUART_SRA SSBDTxRDY: MOVX A,@DPTR NOP JNB ACC.2,SSBDTxRDY ;loop if transmitter not ready MOV DPTR,#DUART_THRA POP ACC MOVX @DPTR,A RET SendSerialByteDUARTb: PUSH ACC MOV DPTR,#DUART_SRB SSBDTxRDYb: MOVX A,@DPTR NOP JNB ACC.2,SSBDTxRDYb MOV DPTR,#DUART_THRB POP ACC MOVX @DPTR,A RET ;***************************************************************** ;* Function: SendSerialD * ;* Purpose: Sends the null-terminated string that immediately * ;* follows the LCALL that called the function to the * ;* external serial port. * ;* Input: ACC: Byte to send * ;* Output: None. * ;* Destroyed Registers: None * ;***************************************************************** SendSerialD: POP DPH POP DPL PUSH ACC PUSH PSW SendSerialD1: CLR A MOVC A,@A+DPTR INC DPTR JZ SendSerialDExit PUSH DPH PUSH DPL LCALL SendSerialByteDUART POP DPL POP DPH SJMP SendSerialD1 SendSerialDExit: POP PSW POP ACC PUSH DPL PUSH DPH RET ;***************************************************************** ;* Function: ReadDUARTInputs * ;* Purpose: read SCC2692 inputs into ACC * ;* Output: ACC * ;* Destroyed Register: DPTR * ;***************************************************************** ReadDUARTInputs: MOV DPTR,#DUART_IP06 MOVX A,@DPTR RET ;***************************************************************** ;* Function: WriteDUARTOutputs * ;* Purpose: set/reset SCC2692 output ports according to ACC * ;* Input: ACC * ;* Output: None. * ;* Destroyed Register: DPTR * ;***************************************************************** WriteDUARTOutputs: MOV DPTR,#DUART_RESETOP MOVX @DPTR,A ;all bits set in A reset bits in OPR CPL A ;select all other bits in A MOV DPTR,#DUART_SETOP MOVX @DPTR,A ;all bits now ser in A set bits in OPR CPL A ;OP = not OPR RET