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