📄 fenetpq2.c
字号:
*
* FUNCTION NAME: BDRxError
*
* DESCRIPTION:
*
* Return TRUE if Buffer Descriptor Status bd_cstatus indicates Receive
* Error; Return FALSE otherwise note Receive Errors are as follows:
*
* 0x80: DPLL Error (DE)
* 0x20: Length Violation (LG)
* 0x10: Non-Octet Aligned (NO)
* 0x8: Rx Abort Sequence (AB)
* 0x4: Rx CRC Error (CR)
* 0x2: Overrun (OV)
* 0x1: Carrier Detect Lost (CD)
*
* EXTERNAL EFFECTS: None
*
* PARAMETERS:
*
* bd_cstatus
*
* RETURNS: TRUE if there was an error and FALSE if there wasn't
*
*-------------------------------------------------------------------------*/
UHWORD BDRxError(UHWORD bd_cstatus)
{
if (bd_cstatus & BD_RX_ERROR)
return TRUE;
else
return FALSE;
} /* end BDRxError */
/*--------------------------------------------------------------------------
*
* FUNCTION NAME: LastBD
*
* DESCRIPTION: Return TRUE if Buffer Descriptor with status and
* control register bd_cstatus is last in frame; Return
* FALSE otherwise.
*
* EXTERNAL EFFECTS: None
*
* PARAMETERS:
*
* bd_cstatus -
*
* RETURNS:
*
*-------------------------------------------------------------------------*/
UHWORD LastBD(UHWORD bd_cstatus)
{
if (bd_cstatus & 0x0800)
return TRUE;
else
return FALSE;
} /* end LastBD */
/*--------------------------------------------------------------------------
*
* FUNCTION NAME: BDEmpty
*
* DESCRIPTION:
*
* Return TRUE if Buffer Descriptor Status bd_cstatus is empty. Return
* FALSE otherwise.
*
* EXTERNAL EFFECTS: None
*
* PARAMETERS:
*
* bd_cstatus
*
* RETURNS: TRUE if empty and FALSE if it isn't
*
*-------------------------------------------------------------------------*/
UHWORD BDEmpty(UHWORD bd_cstatus)
{
if (bd_cstatus & 0x8000)
return TRUE;
else
return FALSE;
} /* end BDEmpty */
/*--------------------------------------------------------------------------
*
* FUNCTION NAME: Led
*
* DESCRIPTION:
*
* Turn On/Off either the Green (LD21) or Red (LD18) LED on PQ2FADS board.
*
* EXTERNAL EFFECTS:
*
* PARAMETERS:
*
* setting - 0 turns off LED; otherwise turn on LED.
*
* RETURNS: NONE
*
*--------------------------------------------------------------------------*/
void Led(UHWORD setting)
{
switch(setting)
{
/* Turn red and green LEDs off */
case OFF:
CSR->bcsr0 |= (GP_LED1_PIL | GP_LED2_PIL);
break;
/* Turn green LED on */
case GREEN:
CSR->bcsr0 &= ~GP_LED1_PIL;
break;
/* Turn red LED on */
case RED:
CSR->bcsr0 &= ~GP_LED2_PIL;
break;
/* Turn red LED on to indicate an error */
default:
CSR->bcsr0 &= ~GP_LED2_PIL;
}
} /* end Led */
/*--------------------------------------------------------------------------
*
* FUNCTION NAME: FlashLed
*
* DESCRIPTION: This function flashes the Red LED (LD18) on the PQ2FADS Board.
*
* EXTERNAL EFFECTS: None
*
* PARAMETERS: none
*
* RETURNS: None
*
*--------------------------------------------------------------------------*/
void FlashLed()
{
UBYTE ii;
UWORD jj;
for (ii = 0; ii<20; ii++)
{
Led(ii%2); /* Turn on every other time through the loop */
for (jj=0; jj < 100000; jj++); /* Wait */
}
Led(OFF); /* LED off */
} /* end FlashLed */
/*--------------------------------------------------------------------------
*
* FUNCTION NAME: SetEEinMSR
*
* DESCRIPTION:
*
* Enables external interrupts in the core by setting EE bit (bit 16)
* in MSR.
*
* EXTERNAL EFFECTS: None
*
* PARAMETERS: none
*
* RETURNS: none
*-------------------------------------------------------------------------*/
void SetEEinMSR(void)
{
/* NOTE: This is syntax for the DIAB compiler. You may need to alter it
for other compilers */
asm(mfmsr r3);
asm(ori r3,r3,0x8000 );
asm(mtmsr r3);
} /* end SetEEinMSR */
/*----------------------------------------------------------------------------
* The following routines are used to communinicate with the Transceiver using
* the Management Interface. However they are not called by the above software,
* as the Transceiver is auto. configured after reset/power-up. They are
* included for reference, in case the user requires to change the default
* settings.
*---------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------
*
* FUNCTION NAME: MdioFrame
*
* DESCRIPTION:
*
* Sends frames to the transceiver.
*
* EXTERNAL EFFECTS: None
*
* PARAMETERS: None
*
* RETURNS: Data
*
*---------------------------------------------------------------------------*/
int MdioFrame(int R_W, int PhyAddr, int RegAddr, int PutData)
{
unsigned int GetData;
IMM->io_regs[PORTC].pdir |= MDIO_PIN_MASK; //set to output mode
MdioSend(0xFFFFFFFF,32); //PreAmble
MdioSend(0x1,2); /* Start Frame Delimiter */
if (R_W)
MdioSend(0x2,2); /* Read OpCode */
else
MdioSend(0x1,2); /* Write OpCode */
MdioSend(PhyAddr,5); /* Send PHY transciever Address */
MdioSend(RegAddr,5); /* Send Register Address */
if (R_W)
{ /* if read */
IMM->io_regs[PORTC].pdir &= ~MDIO_PIN_MASK; /* set to input mode */
GetData = MdioReceive(17); /* Drive TurnAround and Data */
MdioReceive(2);
}
else
{ /* if write */
MdioSend(0x2,2); /* Drive TurnAround */
MdioSend(PutData, 16); /* Send Data */
GetData = 0;
IMM->io_regs[PORTC].pdir &= ~MDIO_PIN_MASK; /* set to input mode */
}
return GetData;
} /* end MdioFrame */
/*----------------------------------------------------------------------------
*
* FUNCTION NAME: MdioSend
*
* DESCRIPTION:
*
* Shift out bits of data
*
* EXTERNAL EFFECTS: None
*
* PARAMETERS: None
*
* RETURNS: Data
*
*---------------------------------------------------------------------------*/
void MdioSend( UWORD txF, int size)
{
UWORD dmask;
int i,j; /* index */
dmask = 1 << (size-1); /* msbit out first */
for ( i = 0; i < size; i++ )
{ /* for "size" bits */
if ( txF & dmask )
{ /* output data bit high */
IMM->io_regs[PORTC].pdat |= MDIO_PIN_MASK;
}
else
{ /* output data bit low, >400ns */
IMM->io_regs[PORTC].pdat &= ~MDIO_PIN_MASK;
}
/* >10ns */
IMM->io_regs[PORTC].pdat |= MDC_PIN_MASK; /* clock rise */
txF = (UWORD)(txF << 1); /* >160ns */
for (j=0; j<40; j++)
IMM->io_regs[PORTC].pdat &= ~MDC_PIN_MASK; /* clock fall */
for (j=0; j<40; j++);
}
} /* end MdioSend */
/*----------------------------------------------------------------------------
*
* FUNCTION NAME: MdioReceive
*
* DESCRIPTION:
*
* Shift out bits of data
*
* EXTERNAL EFFECTS: None
*
* PARAMETERS: None
*
* RETURNS: Data
*
*---------------------------------------------------------------------------*/
UWORD MdioReceive(int size)
{
int i,j,rxF; /* index */
rxF = 0x0;
for ( i = 0; i < size; i++ )
{ /* 16 bits */
IMM->io_regs[PORTC].pdat |= MDC_PIN_MASK; /* clock rise */
if ( IMM->io_regs[PORTC].pdat & MDIO_PIN_MASK )
{
/* if read in a high bit */
rxF = ( (UHWORD)(rxF << 1) | 1 ); /* shift in a one */
}
else
{ /* if read in a low bit */
rxF = ( (UHWORD)(rxF << 1) & ~(UHWORD)1 ); /* shift in a zero */
}
for (j=0; j<40; j++);
IMM->io_regs[PORTC].pdat &= ~MDC_PIN_MASK; /* clock fall */
for (j=0; j<40; j++);
} /* end of for loop */
return rxF;
} /* end MdioReceive */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -