📄 smi.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 + -