资源简介
RTL8305的寄存器读写以及stc的串口设置
代码片段和文件信息
#include
#include
#include
//#define leng 0x2
#define max 0x06
#define s_nop_() _nop_()//;_nop_();_nop_();_nop_()//;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
unsigned char INBUF_LEN=0;
unsigned char inbuf1[max];
//I2C运行管脚
sbit SDA=P1^3;
sbit SCL=P1^2;
//SMI运行管脚
//sbit MDIO=P1^5;
//sbit MDC=P1^6;
sbit MDC = P1^0;
sbit MDIO = P1^1;
sbit work=P3^2;
bit read_flag= 0 ;
bit write_flag= 0 ;
bit send_over= 0 ;
void delay(unsigned int delay_time)
{
unsigned int k= 0 ;
do
{
k++;
}while(k }
/***************************
MDC时钟的一个周期
***************************/
void SMI_Clock_01()
{
MDC=0;
s_nop_();
MDC=1;
s_nop_();
}
/***************************
MDIO输入数据0
MDIO在MDC的下降沿输出
***************************/
void SMI_Data_0()
{
MDC=0;
//s_nop_();
MDIO=0;
s_nop_();
MDC=1;
s_nop_();
}
/***************************
MDIO输入数据1
***************************/
void SMI_Data_1()
{
MDC=0;
//s_nop_();
MDIO=1;
s_nop_();
MDC=1;
s_nop_();
}
/***************************
MDIO输入数据1
***************************/
void SMI_Start()
{
SMI_Data_0();
SMI_Data_1();
}
void SMI_R_opcode()
{
SMI_Data_1();
SMI_Data_0();
}
void SMI_W_opcode()
{
SMI_Data_0();
SMI_Data_1();
}
/*********************************************
通过SMI写入数据,仅byte的低5位bit
PHYADDER是PHY地址为0,1,2,3,4这;第一个以太网口为0
REGADDER为PHY的寄存器地址一共32个寄存器
*********************************************/
void SMI_adder_reg(unsigned char byte)
{
unsigned char i;
for(i=0;i<5;i++)
{
if(byte&0x10)SMI_Data_1();
else SMI_Data_0();
byte=byte<<1;
}
}
void SMI_R_TA()
{
SMI_Clock_01();
SMI_Clock_01();
}
void SMI_W_TA()
{
SMI_Data_1();
SMI_Data_0();
}
void SMI_Idle()
{
unsigned char i;
for(i=0;i<32;i++)
SMI_Data_1();
}
/*********************************************
通过SMI读取寄存器内容
PHYADDER是PHY地址为0,1,2,3,4这里第一个以太网口为0
REGADDER为PHY的寄存器地址return一个16位数据
*********************************************/
unsigned int SMI_read(unsigned char PHYADDERunsigned char REGADDER)
{
unsigned int valuei;
SMI_Idle();
SMI_Start();
SMI_R_opcode();
SMI_adder_reg(PHYADDER);
SMI_adder_reg(REGADDER);
MDIO = 1;
SMI_R_TA();
for(i=0;i<16;i++)
{
value=value<<1;
MDC=0;
if(MDIO==1)value=value|0x0001;
s_nop_();
MDC=1;
s_nop_();
}
SMI_Idle();
return value;
}
/*********************************************
通过SMI写取寄存器内容
PHYADDER是PHY地址为0,1,2,3,4这里第一个以太网口为0
REGADDER为PHY的寄存器地址写一个16位数据
*********************************************/
void SMI_write(unsigned char PHYADDERunsigned char REGADDERunsigned int value)
{
unsigned int i;
SMI_Idle();
SMI_Start();
SMI_W_opcode();
SMI_adder_reg(PHYADDER);
SMI_adder_reg(REGADDER);
SMI_W_TA();
for(i=0;i<16;i++)
{
if(value&0x8000)SM
评论
共有 条评论