📄 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>
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 + -