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

📄 mii.c

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

/************************************************************	
 *	Processer : Microchip PIC12C508A							*
 *	Compiler : Hi-TECH PICC 8.01 PL3							*
 *	Writer : Jason Kuo											*
 *	Description : It can read/write MII Phy Register 					*
 *************************************************************/	
#include <pic.h>

typedef	unsigned char	u8;
typedef	unsigned int	u16;

#define MDC		GP0
#define MDIO		GP1

u16 rx_buf,tx_buf;

void	InitPIC(void);
void Mdc_Pulse(void);  /*Clock line */
void Preamble(void);
void Send_Addr(char Data);
void PHY_Addr(char phy_id);
void Reg_Addr(char reg_addr);
void WriteData(void);
void ReadData(void);
void Idle(void);
void Mii_Read(char phy_id,char reg_addr);
void Mii_Write(char phy_id,char reg_addr);

//u16 rx_buf,tx_buf;


/*******************************************************/
void main(void)
{
     u8 regnum;
     
     InitPIC();
     for (regnum = 0; regnum < 10; regnum++)
     {
     		Mii_Read(0x00, regnum);
     		tx_buf = rx_buf;
     		Mii_Write(0x00, regnum);
     }

}

void	InitPIC(void)
{
    OPTION = (GPWU | GPPU | PS2 | PS1 | PS0);
    TRIS = 0x10;   	
    MDC = 1;
    MDIO = 0;
}


void Mdc_Pulse(void)  /*Clock line */
{
     MDC = 1;
     MDC = 1;
     MDC = 0;
}

void Preamble(void)
{
    char i;

    MDIO = 1;
    /* Transmit Preamble 11....11(32 bits) */
    for(i=0 ; i < 32 ; i++)
        Mdc_Pulse();
    /* Transmit Start of Frame '01' */
    MDIO = 0;
    Mdc_Pulse();
    MDIO = 1;
    Mdc_Pulse();
}

void Send_Addr(char Data)
{
    char i;

    for(i = 0; i < 5; i++)
    {
        if(Data & 0x10)
            MDIO = 1;
        else
            MDIO = 0;
        Mdc_Pulse();
        Data <<= 1;
    }
}

void PHY_Addr(char phy_id)
{
    /* Transmit Selected Address */
    Send_Addr(phy_id);
}

void Reg_Addr(char reg_addr)
{
  /* Transmit Selected register*/
    Send_Addr(reg_addr);
}

void WriteData(void)
{
    char i;
    unsigned int Temp;
    Temp = 0x8000;
    for ( i = 0;i < 16; i++)
    {
      if(tx_buf & Temp)
          MDIO = 1;
      else
         MDIO = 0;
      Mdc_Pulse();
      Temp >>= 1;
    }
}

void ReadData(void)
{
    char i;
    rx_buf = 0x0000;
    for ( i = 0;i < 16; i++)
    {
        Mdc_Pulse();
        if (MDIO == 1)
            rx_buf |= 0x0001;
        if (i < 15)
            rx_buf <<= 1;
    }
}

void Idle(void)
{
    MDIO = 1;
    Mdc_Pulse();
}

void Mii_Read(char phy_id,char reg_addr)
{

    rx_buf = 0x0000;
    Preamble();
    /*OP Code 10*/
    MDIO = 1;
    Mdc_Pulse();
    MDIO = 0;
    Mdc_Pulse();
    PHY_Addr(phy_id);
    Reg_Addr(reg_addr);
    /*Turnaround Z*/
    MDIO = 1;
    Mdc_Pulse();
    ReadData();
    Idle();
}

void Mii_Write(char phy_id,char reg_addr)
{
    Preamble();
    /*OP Code 01*/
    MDIO = 0;
    Mdc_Pulse();
    MDIO = 1;
    Mdc_Pulse();
    PHY_Addr(phy_id);
    Reg_Addr(reg_addr);
    /*Turnaround 10*/
    MDIO = 1;
    Mdc_Pulse();
    MDIO = 0;
    Mdc_Pulse();
    WriteData();
    Idle();
}

⌨️ 快捷键说明

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