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

📄 mii.c

📁 单片机读写MII寄存器驱动
💻 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>
#include <macros.h>
#include "iom8v.h"

typedef	unsigned char	u8;
typedef	unsigned int	u16;

#define MDC		2
#define MDIO	3

//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;   	//把gp0,gp1设为输出
	DDRC|=0X0C;
    PORTC |= 0X04;  //置PORTc的BIT2高
    PORTC &=~0x08;  //置PORTc的BIT3低
}


void Mdc_Pulse(void)  /*Clock line */
{
      PORTC |= 0X04;
	  PORTC |= 0X04;
	  PORTC &=~0x04;
     //MDC = 1;
     //MDC = 1;
    //MDC = 0;
}

void Preamble(void)
{
    char i;
    PORTC |= 0X08;
    //MDIO = 1;
    /* Transmit Preamble 11....11(32 bits) */
    for(i=0 ; i < 32 ; i++)
    Mdc_Pulse();
    /* Transmit Start of Frame '01' */
	 PORTC &=~0x08;
    //MDIO = 0;
    Mdc_Pulse();
	PORTC |= 0X08;
    //MDIO = 1;
    Mdc_Pulse();
}

void Send_Addr(char Data)
{
    char i;

    for(i = 0; i < 5; i++)
    {
        if(Data & 0x10)
		  PORTC |= 0X08;
           // MDIO = 1;
        else
		   PORTC &=~0X08;
            //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(u16 tx_buf)
{
    char i;
	//u16 tx_buf;
    unsigned int Temp;
    Temp = 0x8000;
    for ( i = 0;i < 16; i++)
    {
      if(tx_buf & Temp)
	      PORTC |= 0X08;
          //MDIO = 1;
      else
	     PORTC &= ~0X08;
        // MDIO = 0;
      Mdc_Pulse();
      Temp >>= 1;
    }
}

u16 ReadData()
{
    char i;
	u16 rx_buf;
    rx_buf = 0x0000;
	//DDRC &=~0x08;
    for ( i = 0;i < 16; i++)
    {
        Mdc_Pulse();  
		if ((PINC&0X08)==0X08)
            rx_buf |= 0x0001;
        if (i < 15)
            rx_buf <<= 1;
    }
	return rx_buf;
}

void Idle(void)
{
    PORTC |= 0X08;
    //MDIO = 1;
    Mdc_Pulse();
}

u16 Mii_Read(char phy_id,char reg_addr)
{
    u16 rel;
    rel = 0x0000;
    Preamble();
    /*OP Code 10*/
	PORTC |= 0X08;
    //MDIO = 1;
    Mdc_Pulse();
	PORTC &= ~0X08;
    //MDIO = 0;
    Mdc_Pulse();
    PHY_Addr(phy_id);
    Reg_Addr(reg_addr);
    /*Turnaround Z*/
	PORTC |= 0X08;
    //MDIO = 1;
    Mdc_Pulse();
    rel=ReadData();
    Idle();
	return rel;
}

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

⌨️ 快捷键说明

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