⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smi.c

📁 pdh控制程序
💻 C
字号:
#ifndef _SMI_C_
#define _SMI_C_

#include "smi.h"

void SmiPhyWrite( BYTE phyRegAddr, BYTE phyAddr, WORD value )
{
	smiStartWrite();

	smiPhyRegisterSend( phyRegAddr, phyAddr );

	smiWriteValue( (SMIDATA *)&value );
}

WORD SmiPhyRead( BYTE phyRegAddr, BYTE phyAddr )
{
	WORD value;

	smiStartRead();

	smiPhyRegisterSend( phyRegAddr, phyAddr );

	smiReadValue( (SMIDATA *)&value );

	return value;
}

void smiBitSend( BYTE length, BYTE value )
{
	BYTE counter;

	for( counter=0; counter<length; counter++ )
	{
		if( value & 0x80 )
			setMDIO
		else
			clearMDIO

		value <<= 1;
	}
}

BYTE smiBitGet( void )
{
	BYTE counter, value;

	value = 0;
	for( counter=0; counter<8; counter++ )
	{
		value <<= 1;

		MDC = 0;
		MDIO = 1;

		if(MDIO)
			value ++;

		MDC = 1;
	}
	return value;
}

void smiPreambleSend( void )
{
	BYTE counter;

	MDIO=1;

	for( counter=0; counter<MAXPREAMBLELENGTH; counter++ )
	{
		MDC = 0;
		MDC = 1;
	}
}

void smiStartWrite( void )
{
	smiPreambleSend();

	/*start flag: 01*/
	clearMDIO;
	setMDIO;

	/*write register falg : 01*/
	clearMDIO;
	setMDIO;

	/*write turn around : 10*/
	setMDIO;
	clearMDIO;
}

void smiStartRead( void )
{
	smiPreambleSend();

	/*start flag: 01*/
	clearMDIO;
	setMDIO;

	/*read register falg : 10*/
	setMDIO;
	clearMDIO;

	/*read turn around : z0*/
	MDIO = 1;
	setMDIO;
	setMDIO;
}

void smiPhyRegisterSend( BYTE phyRegAddr, BYTE phyAddr )
{
	smiBitSend( SMIPHYADDRESSLENGTH, phyAddr << SMIPHYADDRESSBIT );
	smiBitSend( SMIPHYADDRESSLENGTH, phyRegAddr << SMIPHYADDRESSBIT );
}


void smiWriteValue( SMIDATA *smiData )
{
	smiBitSend(8, smiData->bit8.high8);
	smiBitSend(8, smiData->bit8.low8);
}

void smiReadValue( SMIDATA *smiData )
{
	smiData->bit8.high8 = smiBitGet();
	smiData->bit8.low8 = smiBitGet();
}


#endif
#if 0

/*------------------------------------------------------------------------**
**--                                                                    --**
**--  File      : smi.c             Last Update: 01/07/2003         --**
**--  Version   : 0.01B                                                 --**
**--  Description : MII bus' Read/Write operation for BCM5221 PHY       --**
**--                                                                    --**
**--  Originated by jwb 2002.10                                         --**
                 THE TECH CENTER OF NANJING POSTEL,JIANGSU,CHINA.
**--  history:
        2004-04-04  xhb       optimize
        2004-03-01  xhb       rewrite
        2003-1-7    NONE                                                --**
**------------------------------------------------------------------------**/
/*在11.0592M晶体下,读函数须8ms*/

#include "api.h"

/************************************************************
        Global varible
*************************************************************/
#ifdef ECP216A /*ECP216A-113F*/ 
#define MDC         P1_2
#define MDIO        P3_7

#elif defined DEMO113F   /*IC+ DEMO board*/   
#define MDC         P2_1
#define MDIO        P2_0

#elif defined ES2308R    /*es2308r*/
#define MDC         P3_4
#define MDIO        P3_3
#endif


/************************************************************
        定义MDC/MDIO的控制操作
*************************************************************/
#define setMDIO          {MDC=0;MDIO=1;MDC=1;}
#define clearMDIO        {MDC=0;MDIO=0;MDC=1;}



static void smiBitSend(unsigned char len, unsigned char value)
{
unsigned char i;

    for(i=0;i<len;i++)
    {
        if( value & 0x80 )
            setMDIO
        else
            clearMDIO

        value <<= 1;
    }
}

static unsigned char smiBitGet(void)
{
unsigned char i,value;

    value = 0;
    for(i=0;i<8;i++)
    {
        value <<= 1;

        MDC = 0;
        MDIO = 1;

        if(MDIO)
            value ++;

        MDC = 1;
    }
    return(value);
}
/************************************************************
        SMI 总线初始化(flag=1 read;  flag=0 write)
*************************************************************/
static void smiStart(smiFlag)     
{
unsigned char i;
    
    MDIO=1;
    for(i=0;i<33;i++)   /*at least 32 contigous 1*/
    {
        MDC = 0;
        MDC = 1;
    }

    clearMDIO;             /*start: 01*/
    setMDIO;

    if( smiFlag )
    {/*read register*/
        setMDIO;
        clearMDIO;
    }
    else
    {/*write register*/
        clearMDIO;
        setMDIO;
    }

    smiBitSend(5, phyAddress << 3);    /*PHY ADDRESS*/
    smiBitSend(5, regAddress << 3);    /*REGISTR ADDRESS*/

}

/************************************************************
        往SMI 总线上发送2个字节的数据
*************************************************************/
void smiWrite(void)
{
    if( !write_register_flag )
        return;

    smiStart(0);

    setMDIO;
    clearMDIO;

    smiBitSend(8, smiData.bit8.high8);
    smiBitSend(8, smiData.bit8.low8);

}
/************************************************************
        从SMI 总线上接收2个字节的数据
*************************************************************/
void smiRead(void)
{

    smiStart(1);

    MDIO = 1;
    setMDIO;
    setMDIO;

    smiData.bit8.high8 = smiBitGet();
    smiData.bit8.low8 = smiBitGet();
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -