?? uartintc.c
字號:
if ( rx_vUARTIntStatus->vUARTIntRxBufDataCnt == (BYTE)RX_BUFFER_SIZE )
{
rx_vUARTIntStatus->UARTIntRxBufferFull = 1;
}
rx_vUARTIntStatus->vUARTIntRxBufWrPtr++;
if ( rx_vUARTIntStatus->vUARTIntRxBufWrPtr >= (BYTE)RX_BUFFER_SIZE )
{
rx_vUARTIntStatus->vUARTIntRxBufWrPtr = 0;
}
}
}
//------------------------------------------------------------
//
// TX Interrupts
//
tx_vUARTIntStatus = &tx_vUARTIntStatus2 ;
rx_vUARTIntStatus = &rx_vUARTIntStatus2 ;
if ( PIR3bits.TX2IF & PIE3bits.TX2IE )
{
if ( !tx_vUARTIntStatus->UARTIntTxBufferEmpty )
{
TXREG2 = tx_vUARTIntStatus->vUARTIntTxBuffer[tx_vUARTIntStatus->vUARTIntTxBufRdPtr];
// if ( parity )
// {
// addParityBit(1, vUARTIntStatus->vUARTIntTxBuffer[vUARTIntStatus->vUARTIntTxBufRdPtr]);
// }
tx_vUARTIntStatus->UARTIntTxBufferFull = 0;
tx_vUARTIntStatus->vUARTIntTxBufDataCnt--;
if ( tx_vUARTIntStatus->vUARTIntTxBufDataCnt == (UINT)0 )
{
tx_vUARTIntStatus->UARTIntTxBufferEmpty = 1;
}
tx_vUARTIntStatus->vUARTIntTxBufRdPtr++;
if ( tx_vUARTIntStatus->vUARTIntTxBufRdPtr >= (BYTE)TX_BUFFER_SIZE )
{
tx_vUARTIntStatus->vUARTIntTxBufRdPtr = 0;
}
}
else
{
PIE3bits.TX2IE = 0;
#if ( ENABLE_SER2_RS485 == 'Y' )
while ( TXSTA2bits.TRMT == (BYTE)0 );
Delay1KTCYx (1) ; // at 10 Mhz, 1000 instruction cycles delay for 0.4 ms.
mSetRS485_RTSLow ( P6720SER2 );
#endif
}
}
//------------------------------------------------------------
//
// RX Interrupts
//
if ( PIR3bits.RC2IF & PIE3bits.RC2IE )
{
if ( RCSTA2bits.FERR )
{ /* FERR error condition */
chTemp = RCREG2;
rx_vUARTIntStatus->UARTIntRxError = 1;
}
else if ( RCSTA2bits.OERR )
{ /* OERR error condition */
RCSTA2bits.CREN = 0;
RCSTA2bits.CREN = 1;
chTemp = RCREG2;
rx_vUARTIntStatus->UARTIntRxError = 1;
}
else if ( rx_vUARTIntStatus->UARTIntRxBufferFull )
{
chTemp = RCREG2;
rx_vUARTIntStatus->UARTIntRxOverFlow = 1;
}
else if ( !rx_vUARTIntStatus->UARTIntRxBufferFull )
{
rx_vUARTIntStatus->UARTIntRxOverFlow = 0;
rx_vUARTIntStatus->UARTIntRxBufferEmpty = 0;
rx_vUARTIntStatus->vUARTIntRxBuffer[rx_vUARTIntStatus->vUARTIntRxBufWrPtr] = RCREG2;
rx_vUARTIntStatus->vUARTIntRxBufDataCnt ++;
if ( rx_vUARTIntStatus->vUARTIntRxBufDataCnt == (BYTE)RX_BUFFER_SIZE )
{
rx_vUARTIntStatus->UARTIntRxBufferFull = 1;
}
rx_vUARTIntStatus->vUARTIntRxBufWrPtr++;
if ( rx_vUARTIntStatus->vUARTIntRxBufWrPtr >= (BYTE)RX_BUFFER_SIZE )
{
rx_vUARTIntStatus->vUARTIntRxBufWrPtr = 0;
}
}
}
}
//-----------------------------------------------------------------------------------
BYTE mSetUARTPort(UINT iport, UINT ibaud, UINT iparity)
{
//static unsigned int iport;
BYTE baudRate ;
if ( !mCheckPortHandle(iport) )
{
return 0;
}
else
{
//baudRate = ibaud;
//parity = iparity;
if ( ibaud == (BYTE)115 )
{
baudRate = ( ( UART_CLOCK_FREQ / 115200 ) / 16 ) - 1 ;
}
else
{
baudRate = ( ( UART_CLOCK_FREQ / ibaud ) / 16 ) - 1 ;
}
if ( iport == (UINT)P6720SER1 )
{
RCSTA1bits.SPEN = 0;
SPBRG = baudRate;
RCSTA1bits.SPEN = 1;
}
else
{
RCSTA2bits.SPEN = 0;
SPBRG2 = baudRate;
RCSTA2bits.SPEN = 1;
}
#if 0
if ( parity )
{
if ( iport )
{
TXSTA2bits.TX9 = 1;
RCSTA2bits.RX9 = 1;
}
else
{
TXSTAbits.TX9 = 1;
RCSTAbits.RX9 = 1;
}
}
#endif
return 1;
}
}
//-----------------------------------------------------------------------------------
VOID addParityBit(UINT iport, BYTE b)
{
BYTE bit0 = (b & 0b00000001);
BYTE bit1 = (b & 0b00000010);
BYTE bit2 = (b & 0b00000100);
BYTE bit3 = (b & 0b00001000);
BYTE bit4 = (b & 0b00010000);
BYTE bit5 = (b & 0b00100000);
BYTE bit6 = (b & 0b01000000);
BYTE bit7 = (b & 0b10000000);
BYTE p = (bit0 & bit1 & bit2 & bit3 & bit4 & bit5 & bit6 & bit7);
mCheckPortHandle(iport);
#if 0
switch ( parity )
{
case 1:
if ( iport == P6720SER1 )
{
TXSTAbits.TX9D = (1-p);break;
}
else
{
TXSTA2bits.TX9D = (1-p);break;
}
case 2:
if ( iport == P6720SER1 )
{
TXSTAbits.TX9D = p;break;
}
else
{
TXSTA2bits.TX9D = p;break;
}
}
#endif
}
//====================================================================================
/*Checks the parity bit returns 0 if parity fails, returns 1 if parity passes*/
BYTE checkParityBit(UINT iport, BYTE b)
{
BYTE bit0 = (b & 0b00000001);
BYTE bit1 = (b & 0b00000010);
BYTE bit2 = (b & 0b00000100);
BYTE bit3 = (b & 0b00001000);
BYTE bit4 = (b & 0b00010000);
BYTE bit5 = (b & 0b00100000);
BYTE bit6 = (b & 0b01000000);
BYTE bit7 = (b & 0b10000000);
BYTE p = (bit0 & bit1 & bit2 & bit3 & bit4 & bit5 & bit6 & bit7);
mCheckPortHandle(iport);
#if 0
switch ( parity )
{
case 1:
if ( iport == P6720SER1 )
{
if ( TXSTAbits.TX9D == (1-p) )
{
return 1;
}
else
{
return 0;
}
}
else
{
if ( TXSTA2bits.TX9D == (1-p) )
{
return 1;
}
else
{
return 0;
}
}
break;
case 2:
if ( iport ==P6720SER1 )
{
if ( TXSTAbits.TX9D == p )
{
return 1;
}
else
{
return 0;
}
}
else
{
if ( TXSTA2bits.TX9D == p )
{
return 1;
}
else
{
return 0;
}
}
break;
}
#endif
}
//====================================================================================
VOID mDisableUARTTxInt(UINT iport)
{
mCheckPortHandle(iport);
if ( iport == (UINT)P6720SER1 )
{
PIE1bits.TXIE = 0;
}
else
{
PIE3bits.TX2IE = 0;
}
}
//====================================================================================
VOID mEnableUARTTxInt(UINT iport)
{
mCheckPortHandle(iport);
if ( iport == (UINT)P6720SER1 )
{
PIE1bits.TXIE = 1;
}
else
{
PIE3bits.TX2IE = 1;
}
}
//====================================================================================
VOID mDisableUARTRxInt(UINT iport)
{
mCheckPortHandle(iport);
if ( iport == (UINT)P6720SER1 )
{
PIE1bits.RCIE = 0;
}
else
{
PIE3bits.RC2IE = 0;
}
}
//====================================================================================
VOID mEnableUARTRxInt(UINT iport)
{
mCheckPortHandle(iport);
if ( iport == (UINT)P6720SER1 )
{
PIE1bits.RC1IE = 1;
}
else
{
PIE3bits.RC2IE = 1;
}
}
//====================================================================================
VOID mSetUARTRxIntHighPrior(UINT iport)
{
mCheckPortHandle(iport);
RCONbits.IPEN = 1;
if ( iport == (UINT)P6720SER1 )
{
IPR1bits.RC1IP = 1;
}
else
{
IPR3bits.RC2IP = 1;
}
}
//====================================================================================
VOID mSetUARTRxIntLowPrior(UINT iport)
{
mCheckPortHandle(iport);
if ( iport == (UINT)P6720SER1 )
{
IPR1bits.RCIP = 0;
}
else
{
IPR3bits.RC2IP = 0;
}
}
//====================================================================================
VOID mSetUARTTxIntHighPrior(UINT iport)
{
mCheckPortHandle(iport);
RCONbits.IPEN = 1;
if ( iport == (UINT)P6720SER1 )
{
IPR1bits.TXIP = 1;
}
else
{
IPR3bits.TX2IP = 1;
}
}
//====================================================================================
VOID mSetUARTTxIntLowPrior(UINT iport)
{
mCheckPortHandle(iport);
if ( iport == (UINT)P6720SER1 )
{
IPR1bits.TXIP = 0;
}
#ifdef P18F6720
else
{
IPR3bits.TX2IP = 0;
}
#endif
}
//====================================================================================
VOID mSetUART_BRGHHigh(UINT iport)
{
mCheckPortHandle(iport);
if ( iport == (UINT)P6720SER1 )
{
TXSTAbits.BRGH = 1;
}
else
{
TXSTA2bits.BRGH = 1;
}
}
//====================================================================================
VOID mSetUART_BRGHLow(UINT iport)
{
mCheckPortHandle(iport);
if ( iport == (UINT)P6720SER1 )
{
TXSTAbits.BRGH = 0;
}
else
{
TXSTA2bits.BRGH = 0;
}
}
//====================================================================================
VOID mSetUARTBaud(UINT iport, UINT iBaudRate)
{
mCheckPortHandle(iport);
if ( iport == (UINT)P6720SER1 )
{
RCSTAbits.SPEN = 0;
SPBRG = iBaudRate;
RCSTAbits.SPEN = 1;
}
else
{
RCSTA2bits.SPEN = 0;
SPBRG2 = iBaudRate;
RCSTA2bits.SPEN = 1;
}
}
VOID mSetRS485_RTSHigh (UINT iport)
{
if ( iport == (UINT)P6720SER1 )
{
PORTCbits.RC5 = 1 ;
}
else
{
PORTGbits.RG3 = 1 ;
}
}
VOID mSetRS485_RTSLow (UINT iport)
{
if ( iport == (UINT)P6720SER1 )
{
PORTCbits.RC5 = 0 ;
}
else
{
PORTGbits.RG3 = 0 ;
}
}
//====================================================================================
BYTE mCheckPortHandle(UINT iport)
{
if ( iport >= (BYTE)PORTS )
{
return 0;
}
else
{
return 1;
}
}
//====================================================================================
VOID init_timer(VOID)
{
/* Setting Global interrupt pins */
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 1;
IPR1bits.TMR2IP = 1; //TMR1 interrupt set to high priority
PIE1bits.TMR2IE = 1;
PIR1bits.TMR2IF = 0;
T2CON = 0b00000111; // INit timer 2
PR2 = TMR2_PERIOD_REGISTER; //Load Timer 1 value
}
//====================================================================================
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -