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

📄 mii.lst

📁 以C语言利用PIC12C508A读写MII Phy的寄存器
💻 LST
字号:
     1: 

     2: /************************************************************   

     3:  *      Processer : Microchip PIC12C508A                                                        *

     4:  *      Compiler : Hi-TECH PICC 8.01 PL3                                                        *

     5:  *      Writer : Jason Kuo                                                                                      *

     6:  *      Description : It can read/write MII Phy Register                                        *

     7:  *************************************************************/ 

     8: #include <pic.h>

     9: 

    10: typedef unsigned char   u8;

    11: typedef unsigned int    u16;

    12: 

    13: #define MDC             GP0

    14: #define MDIO            GP1

    15: 

    16: u16 rx_buf,tx_buf;

    17: 

    18: void    InitPIC(void);

    19: void Mdc_Pulse(void);  /*Clock line */

    20: void Preamble(void);

    21: void Send_Addr(char Data);

    22: void PHY_Addr(char phy_id);

    23: void Reg_Addr(char reg_addr);

    24: void WriteData(void);

    25: void ReadData(void);

    26: void Idle(void);

    27: void Mii_Read(char phy_id,char reg_addr);

    28: void Mii_Write(char phy_id,char reg_addr);

    29: 

    30: //u16 rx_buf,tx_buf;

    31: 

    32: 

    33: /*******************************************************/

    34: void main(void)

    35: {

    36:      u8 regnum;

    37:      

    38:      InitPIC();

    39:      for (regnum = 0; regnum < 10; regnum++)

    40:      {

    41:                 Mii_Read(0x00, regnum);

    42:                 tx_buf = rx_buf;

    43:                 Mii_Write(0x00, regnum);

    44:      }

    45: 

    46: }

    47: 

    48: void    InitPIC(void)

    49: {

    50:     OPTION = (GPWU | GPPU | PS2 | PS1 | PS0);

    51:     TRIS = 0x10;        

    52:     MDC = 1;

    53:     MDIO = 0;

    54: }

    55: 

    56: 

    57: void Mdc_Pulse(void)  /*Clock line */

    58: {

    59:      MDC = 1;

    60:      MDC = 1;

    61:      MDC = 0;

    62: }

    63: 

    64: void Preamble(void)

    65: {

    66:     char i;

    67: 

    68:     MDIO = 1;

    69:     /* Transmit Preamble 11....11(32 bits) */

    70:     for(i=0 ; i < 32 ; i++)

    71:         Mdc_Pulse();

    72:     /* Transmit Start of Frame '01' */

    73:     MDIO = 0;

    74:     Mdc_Pulse();

    75:     MDIO = 1;

    76:     Mdc_Pulse();

    77: }

    78: 

    79: void Send_Addr(char Data)

    80: {

    81:     char i;

    82: 

    83:     for(i = 0; i < 5; i++)

    84:     {

    85:         if(Data & 0x10)

    86:             MDIO = 1;

    87:         else

    88:             MDIO = 0;

    89:         Mdc_Pulse();

    90:         Data <<= 1;

    91:     }

    92: }

    93: 

    94: void PHY_Addr(char phy_id)

    95: {

    96:     /* Transmit Selected Address */

    97:     Send_Addr(phy_id);

    98: }

    99: 

   100: void Reg_Addr(char reg_addr)

   101: {

   102:   /* Transmit Selected register*/

   103:     Send_Addr(reg_addr);

   104: }

   105: 

   106: void WriteData(void)

   107: {

   108:     char i;

   109:     unsigned int Temp;

   110:     Temp = 0x8000;

   111:     for ( i = 0;i < 16; i++)

   112:     {

   113:       if(tx_buf & Temp)

   114:           MDIO = 1;

   115:       else

   116:          MDIO = 0;

   117:       Mdc_Pulse();

   118:       Temp >>= 1;

   119:     }

   120: }

   121: 

   122: void ReadData(void)

   123: {

   124:     char i;

   125:     rx_buf = 0x0000;

   126:     for ( i = 0;i < 16; i++)

   127:     {

   128:         Mdc_Pulse();

   129:         if (MDIO == 1)

   130:             rx_buf |= 0x0001;

   131:         if (i < 15)

   132:             rx_buf <<= 1;

   133:     }

   134: }

   135: 

   136: void Idle(void)

   137: {

   138:     MDIO = 1;

   139:     Mdc_Pulse();

   140: }

   141: 

   142: void Mii_Read(char phy_id,char reg_addr)

   143: {

   144: 

   145:     rx_buf = 0x0000;

   146:     Preamble();

   147:     /*OP Code 10*/

   148:     MDIO = 1;

   149:     Mdc_Pulse();

   150:     MDIO = 0;

   151:     Mdc_Pulse();

   152:     PHY_Addr(phy_id);

   153:     Reg_Addr(reg_addr);

   154:     /*Turnaround Z*/

   155:     MDIO = 1;

   156:     Mdc_Pulse();

   157:     ReadData();

   158:     Idle();

   159: }

   160: 

   161: void Mii_Write(char phy_id,char reg_addr)

   162: {

   163:     Preamble();

   164:     /*OP Code 01*/

   165:     MDIO = 0;

   166:     Mdc_Pulse();

   167:     MDIO = 1;

   168:     Mdc_Pulse();

   169:     PHY_Addr(phy_id);

   170:     Reg_Addr(reg_addr);

   171:     /*Turnaround 10*/

   172:     MDIO = 1;

   173:     Mdc_Pulse();

   174:     MDIO = 0;

   175:     Mdc_Pulse();

   176:     WriteData();

   177:     Idle();

   178: }

⌨️ 快捷键说明

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