首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

网口芯片SMI接口实现

网口芯片SMI接口实现

最近在用P178G,需要对内部寄存器进行控制,实现各个PHY的开关与VLAN配置,为了替代最初模拟开关实现的“伪”开关,通过ds得知可以使用SMI接口进行读写寄存器,控制IC工作状态。
    时序与格式如图:
   
  该芯片前置码与其他很多芯片的32Bit高电平不同,按32bit实现也可以通用。常规SMI各个位域说明如下:
   PRE: 帧前缀域,为32个“1”比特,这帧前缀域不是须要的,某些物理层芯片的MDIO操纵就没有这个域。  
   OP: 帧操纵码,比特“10”默示此帧为一读操纵帧,比特“01”默示此帧为一写操纵帧。  
   PHYAD: 物理层芯片的地址,5个比特;
   REGAD: 用来选择物理层芯片的32个存放器中的某个存放器的地址;
   TA: 状况转换域,若为读操纵,则第一比特时MDIO为高阻态,第二比特时由物理层芯片使MDIO置“0”。若为写操纵,则MDIO仍由MAC层芯片控制,其输出“10”两个比特。
   DATA: 帧的存放器的数据域,16比特,若为读操纵,则为物理层送到MAC层的数据,若为写操纵,则为MAC层送到物理层的数据。  
      IDLE: 帧停止后的余暇状况,此时MDIO无源驱动,处高阻状况,但一般用上拉电阻使其处在高电平,即MDIO引脚须要上拉电阻。
  
  示例Code:
  void SMI_Write(unsigned char phy_add, unsigned char reg_add, unsigned int data){
unsigned int i;
ISR_DIS();      //interrupt disabled   
for (i = 0; i<32; i++)//send preamble,32 1   
{

SMI_1();
}
{//01            //send start   

SMI_0();

SMI_1();
}
{//01            //send op code,write   

SMI_0();

SMI_1();
}
for (i = 0; i<5; i++)//send phy address   
{

if (phy_add & 0x10)


SMI_1();//1   

else


SMI_0();//0   

phy_add <<= 1;
}
for (i = 0; i<5; i++)//send reg address   
{

if (reg_add & 0x10)


SMI_1();//1   

else


SMI_0();//0   

reg_add <<= 1;
}
{//10           //send turn around   

SMI_1();//1   

SMI_0();//0   
}
for (i = 0; i<16; i++)//send data   
{

if (data & 0x8000)


SMI_1();//1   

else


SMI_0();//0   

data <<= 1;
}
<pre name="code" class="cpp">      ISR_EN()<span style="font-family: Arial, Helvetica, sans-serif;">;     //interrupt enabled   </span>  }
继承事业,薪火相传
返回列表