[an error occurred while processing this directive]
|
struct sci
{
unsigned int ccr; /* 0x7050 in data space */
unsigned int ctl1; /* 0x7051 in data space */
unsigned int baud_hi; /* 0x7052 in data space */
unsigned int baud_lo; /* 0x7053 in data space */
unsigned int ctl2; /* 0x7054 in data space */
unsigned int rxst; /* 0x7055 in data space */
unsigned int rxemu; /* 0x7056 in data space */
unsigned int rxbuf; /* 0x7057 in data space */
unsigned int res1; /* 0x7058 in data space */
unsigned int txbuf; /* 0x7059 in data space */
unsigned int res2; /* 0x705a in data space */
unsigned int res3; /* 0x705b in data space */
unsigned int res4; /* 0x705c in data space */
unsigned int res5; /* 0x705d in data space */
unsigned int res6; /* 0x705e in data space */
unsigned int pri; /* 0x705f in data space */
};
typedef volatile struct sci SCI_STRUCT;
bool ChangeBaudRate(HANDLE h_Port, WORD BaudRate)
{
WORD mirror;
#ifdef _SCI2407_
SCI_STRUCT *sciptr; // pointer to sci defined structure
sciptr = (SCI_STRUCT *)SCI;
if(h_Port==SCI2407)
{
sciptr->baud_hi = BaudRate / 0x100;
sciptr->baud_lo = BaudRate % 0x100;
return true;
}
#endif
....
}
HANDLE OpenPort(char* Port, WORD BaudRate)
{
HANDLE h_Port;
SCI_STRUCT *sciptr; /* pointer to sci defined structure */
volatile WORD OCRAReg, INTReg, in_char;
#ifdef _SCI2407_
if(memcmp(Port, "SCI" , 3) == 0)
{
sciptr = (SCI_STRUCT *)SCI; /* overlay structure over the hardware */
/* 0x7050 for C2407 */
/* 1 stop, no parity, 8 data, async */
/* 0x17 */
/* Reset the uart */
sciptr->ctl1 = 0;
Sleep( 1 );
sciptr->ctl1 = SW_RESET;
/* reset low, clock internal, */
/* xmit enable, rec enable */
/* 0x13 */
sciptr->ccr = (WORD) ( SCI_CHAR2 | SCI_CHAR1 | SCI_CHAR0);
/* enable TX & RX ints */
/* 0x03 */
/* Set Interrupt SCI2407 */
INTReg = *(volatile WORD *)IMR;
INTReg |= 0x10; /* Set Unmask INT5=0x10 */
*(volatile WORD *)IMR = INTReg;
*(volatile WORD *)IFR = 0x10; /* Clear Interrupt request */
sciptr->ctl2 = (unsigned int) (RX_INT_EN);
/* load the baud rate */
ChangeBaudRate(SCI2407, BaudRate);
/*------------------------------------------------------------*/
/* Set mode to soft & TX low Prioritet */
/*------------------------------------------------------------*/
sciptr->pri = PRI_SOFT/*|PRI_RXPRI/*|PRI_TXPRI*/;
/*-------------------------------------------------------------*/
/* xmit enable, rec enable */
/*-------------------------------------------------------------*/
sciptr->ctl1 = (WORD) (SW_RESET | TX_ENA | RX_ENA | RXERR);
/* sciptr->ctl1 = (WORD) (SW_RESET | RX_ENA ); */
/* in_char = sciptr->rxst; */
/*------------------------------------------------------------*/
/* Test Uart */
/*------------------------------------------------------------*/
/*
sciptr->ccr |= (WORD)(LOOP_BACK);
sciptr->ccr = (WORD) ( SCI_CHAR2 | SCI_CHAR1 | SCI_CHAR0); */
return SCI2407;
} else
#endif
.......
}
#ifdef _SCI2407_
//////////////////////////////
// Read from SCI DSP //
//////////////////////////////
int readSCI2407(void)
{
SCI_STRUCT *sciptr = (SCI_STRUCT *)SCI; /* pointer to sci defined structure */
WORD rcv_status = 0;
WORD in_char;
rcv_status = sciptr->rxst;
rcv_status &= RXRDY;
if(!rcv_status)return -1;
if(!rcv_status)
{
sciptr->ctl1 = 0;
Sleep(1);
sciptr->ctl1 = (WORD) ( SW_RESET | TX_ENA | RX_ENA | RXERR);
return -1;
}
in_char = sciptr->rxbuf; /* get data from rec buffer */
in_char &= 0x00ff;
return (in_char); /* return data */
}
//////////////////////////
// transmit to SCI DSP //
//////////////////////////
WORD writeSCI2407(WORD out_char)
{
SCI_STRUCT *sciptr = (SCI_STRUCT *)SCI; /* pointer to sci defined structure */
WORD xmit_status = 0;
while( !xmit_status )
{
xmit_status = sciptr->ctl2; /* read xmit status */
xmit_status &= TX_EMPTY;
/* xmit_status &= TX_RDY; */
}
sciptr->txbuf = (0x00ff & out_char); /* send data */
return ((WORD) 0); /* return no error */
}
#endif
E-mail: info@telesys.ru