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