请问rtl8309如何控制其PHY寄存器

king315   2010-6-23 22:27 楼主
RTL8309的资料好少,我在网络上有找到通过SMI接口协议来操作寄存器的,能通过主芯片和8309之间的I2C来进行通信,然后控制寄存器吗?

回复评论 (3)

通过SMI来操作寄存器的代码如下:但我是想通过I2C来操作

  1. unsigned int Read8309(unsigned int phyad,unsigned int regad)
  2. {
  3.         unsigned char i;
  4.         unsigned int tmp=0;
  5.         unsigned int idata OutData=0;
  6.        
  7.         for(i=0;i<32;i++)//send preamble,32 1
  8.         {
  9.               SMI_1();
  10.          }
  11.         {//01            //send start
  12.             SMI_0();
  13.             SMI_1();
  14.          }
  15.          {//10           //opcode
  16.             SMI_1();
  17.             SMI_0();
  18.          }
  19.         //PHYAD
  20.         for(i=0;i<5;i++)
  21.         {
  22.                 if(phyad&0x10)
  23.                         SMI_1();
  24.                 else
  25.                         SMI_0();//0
  26.                      phyad<<=1;
  27.         }
  28.         for(i=0;i<5;i++)//send reg address
  29.             {
  30.                 if(regad&0x10)
  31.                         SMI_1();
  32.                 else
  33.                         SMI_0();//0
  34.                      regad<<=1;
  35.         }
  36.         {//10           //send turn around
  37.             SMI_1();
  38.             SMI_0();
  39.          }
  40.         OutData=0;
  41.         for(i = 0; i < 16; i++)
  42.            {       
  43.                 MDC=1;
  44.                 OutData=(OutData<<1);
  45.                 if(MDIO==1) OutData|=1;                       
  46.                 MDC=0;       
  47.                
  48.         }
  49.         return OutData;
  50. }

  51. void Write8309(unsigned int phyad,unsigned int regad,unsigned int regvalue)
  52. {
  53.         unsigned char i;
  54.         unsigned int tmp=0;
  55.         unsigned int InData=0;
  56.        
  57.         for(i=0;i<32;i++)//send preamble,32 1
  58.         {
  59.               SMI_1();
  60.          }
  61.         {//01            //send start
  62.             SMI_0();
  63.             SMI_1();
  64.          }
  65.          {//10           //opcode
  66.             SMI_0();
  67.             SMI_1();
  68.          }
  69.         //PHYAD
  70.         for(i=0;i<5;i++)
  71.         {
  72.                 if(phyad&0x10)
  73.                         SMI_1();
  74.                 else
  75.                         SMI_0();//0
  76.                      phyad<<=1;
  77.         }
  78.         for(i=0;i<5;i++)//send reg address
  79.             {
  80.                 if(regad&0x10)
  81.                         SMI_1();
  82.                 else
  83.                         SMI_0();//0
  84.                      regad<<=1;
  85.         }
  86.         {//10           //send turn around
  87.             SMI_1();
  88.             SMI_0();
  89.          }
  90.         for(i = 0; i < 16; i        ++)
  91.         {
  92.               if(regvalue&0x8000)
  93.                           SMI_1();
  94.                   else
  95.                           SMI_0();//0
  96.               regvalue<<=1;
  97.     }
  98. }
点赞  2010-6-23 22:32
我也在找资料,高人
点赞  2011-6-13 21:39
看到您以前的一个关于RTL8309的帖子,请问您知道如何将配置数据放到外部24c02么?代码大概是怎样编写?
点赞  2015-7-5 09:38
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复