#include <reg51.h>
#include <string.h>
#include <intrins.h>
//#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];
//SMI运行管脚
//sbit MDIO=P1^5;
//sbit MDC=P1^6;
sbit CPUC = P3^4;
sbit CPUIO = P3^5;
bit read_flag= 0 ;
bit write_flag= 0 ;
bit read_re_flag= 0 ;
bit write_re_flag= 0 ;
bit send_over= 0 ;
/********
void delay(unsigned int delay_time)
{
unsigned int k= 0 ;
do
{
k++;
}while(k<delay_time);
}
************/
/***************************
MDC时钟的一个周期
***************************/
void CPU_Clock_01()
{
CPUC=0;
s_nop_();
CPUC=1;
s_nop_();
}
/***************************
MDIO输入数据0
MDIO在MDC的下降沿输出
***************************/
void CPU_Data_0()
{
CPUC=0;
//s_nop_();
CPUIO=0;
s_nop_();
CPUC=1;
s_nop_();
}
/***************************
MDIO输入数据1
***************************/
void CPU_Data_1()
{
CPUC=0;
//s_nop_();
CPUIO=1;
s_nop_();
CPUC=1;
s_nop_();
}
/***************************
MDIO输入数据1
***************************/
void CPU_Start()
{
CPU_Data_0();
CPU_Data_1();
}
void CPU_R_opcode()
{
CPU_Data_1();
CPU_Data_0();
}
void CPU_W_opcode()
{
CPU_Data_0();
CPU_Data_1();
}
/*********************************************
通过SMI写入数据,仅byte的低5位bit
PHYADDER是PHY地址为0,1,2,3,4这;第一个以太网口为0
*********************************************/
void CPU_ID_reg(unsigned char byte)
{
unsigned char i;
for(i=0;i<2;i++)
{
if(byte&0x02)CPU_Data_1();
else CPU_Data_0();
byte=byte<<1;
}
}
/*********************************************
REGADDER为PHY的寄存器地址,一共32个寄存器
*********************************************/
void CPU_adder_reg(unsigned char byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byte&0x80)CPU_Data_1();
else CPU_Data_0();
byte=byte<<1;
}
}
void CPU_R_TA()
{
CPU_Clock_01();
CPU_Clock_01();
}
void CPU_W_TA()
{
CPU_Data_1();
CPU_Data_0();
}
void CPU_Idle()
{
unsigned char i;
for(i=0;i<32;i++)
CPU_Data_1();
}
/*********************************************
通过SMI读取寄存器内容
PHYADDER是PHY地址为0,1,2,3,4这里第一个以太网口为0
REGADDER为PHY的寄存器地址,return一个16位数据
*********************************************/
unsigned int CPU_read(unsigned char PHYADDER,unsigned char REGADDER)
{
unsigned int value,i;
CPU_Idle();
CPU_Start();
CPU_R_opcode();
CPU_ID_reg(PHYADDER);
CPU_adder_reg(REGADDER);
CPUIO = 1;
CPU_R_TA();
for(i=0;i<16;i++)
{
value=value<<1;
CPUC=0;
if(CPUIO==1)value=value|0x0001;
s_nop_();
CPUC=1;
s_nop_();
}
CPU_Idle();
return value;
}
/*********************************************
通过SMI写取寄存器内容
PHYADDER是PHY地址为0,1,2,3,4这里第一个以太网口为0
REGADDER为PHY的寄存器地址,写一个16位数据
*********************************************/
void CPU_write(unsigned char PHYADDER,unsigned char REGADDER,unsigned int value)
{
unsigned int i;
CPU_Idle();
CPU_Start();
CPU_W_opcode();
CPU_ID_reg(PHYADDER);
CPU_adder_reg(REGADDER);
CPU_W_TA();
for(i=0;i<16;i++)
{
if(value&0x8000)CPU_Data_1();
else CPU_Data_0();
value=value<<1;
}
CPU_Idle();
}
void init_serialcomm( void )
{
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD = 0x20 ; // TMOD: timer 1, mode 2, 8-bit reload
PCON = 0x80 ; // SMOD=1;
TH1 = 0xFD ; // Baud:19200 fosc=11.0592MHz
TL1 = 0xFD ;
IE = 0x90 ; // Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
// TI=1;
}
// 向串口发送一个字符
void send_char( unsigned char ch)
{
SBUF=ch;
while (TI== 0 );
TI= 0 ;
}
// 向串口发送一个字符串,strlen为该字符串长度
void send_string( unsigned char *str, unsigned int strlen)
{
unsigned int k= 0 ;
do
{
send_char(*(str + k));
k++;
} while (k < strlen);
}
void S_read_F(unsigned char adder)
{
unsigned char DataBuff[2];
unsigned int reg_data=0x0306;
reg_data=reg_data|(adder<<11);
CPU_write(0x00,0x3e,reg_data);
CPU_write(0x00,0x3f,0x0003);
reg_data=CPU_read(0x00,0x4a);
DataBuff[1]=reg_data;
DataBuff[0]=reg_data>>8;
send_string(DataBuff,2);
}
void S_write_F(unsigned char adder,unsigned int wdata)
{
unsigned char DataBuff[2];
unsigned int reg_data=0x0706;
CPU_write(0x00,0x3d,wdata);
reg_data=reg_data|(adder<<11);
CPU_write(0x00,0x3e,reg_data);
CPU_write(0x00,0x3f,0x0003);
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
//if (RI&!send_over)
if (RI)
{
unsigned char ch;
RI = 0 ;
ch=SBUF;
inbuf1[INBUF_LEN]=ch;
//send_char( inbuf1[INBUF_LEN]);
if(inbuf1[0]==0x55)INBUF_LEN++;
else INBUF_LEN=0;
if (INBUF_LEN==6)
{
INBUF_LEN=0;
if(inbuf1[1]==1)
{
read_flag= 1 ;
}
else if(inbuf1[1]==2) write_flag= 1;
else if(inbuf1[1]==3)read_re_flag=1;
else write_re_flag=1;
}
}
}
main()
{
init_serialcomm( ) ;
//IniIP113F();
while(1){
if(read_flag)
{
unsigned int reg_data;
unsigned char DataBuff[2];
reg_data=CPU_read(inbuf1[2],inbuf1[3]);
DataBuff[1]=reg_data;
DataBuff[0]=reg_data>>8;
send_char(0xaa);
send_string(DataBuff,2);
read_flag= 0 ; //取数标志清0
send_over=0;
}
if(write_flag)
{
unsigned int reg_data;
unsigned char DataBuff[2];
reg_data=inbuf1[4];
reg_data=reg_data<<8;
reg_data=reg_data+ inbuf1[5];
CPU_write(inbuf1[2],inbuf1[3],reg_data);
reg_data=CPU_read(inbuf1[2],inbuf1[3]);
DataBuff[1]=reg_data;
DataBuff[0]=reg_data>>8;
send_char(0xbb);
send_string(DataBuff,2);
write_flag=0;
}
if(read_re_flag)
{
S_read_F(inbuf1[3]);
// delay(100);
read_re_flag= 0 ; //取数标志清0
}
if(write_re_flag)
{
unsigned int reg_data;
reg_data=inbuf1[4];
reg_data=reg_data<<8;
reg_data=reg_data+ inbuf1[5];
S_write_F(inbuf1[3],reg_data);
//RTL8305_Set();
write_re_flag=0;
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
cpu.zip_CPU接口
共26个文件
bak:8个
obj:2个
plg:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 185 浏览量
2022-09-21
18:05:29
上传
评论
收藏 60KB ZIP 举报
温馨提示
单片机模拟CPU接口,对其他工作芯片寄存器的读写操作
资源详情
资源评论
资源推荐
收起资源包目录
cpu.zip (26个子文件)
cpu
CPU.lnp 42B
rtl8305.c 6KB
rtl8305.uvopt 55KB
rtl8305.LST 13KB
cfs.opt.bak 1KB
rtl8305.lnp 46B
rt.OBJ 6KB
cfs.uvopt 54KB
rtl8305 16KB
CPU.hex 3KB
rtl8305.OBJ 17KB
rtl8305.opt.bak 1KB
rtl8305_Uv2.Bak 2KB
rtl8305.Uv2.bak 2KB
rtl8305_uvproj.bak 13KB
rtl8305_uvopt.bak 55KB
rtl8305.uvproj 13KB
rt.LST 4KB
rtl8305_Opt.Bak 1KB
cfs.Uv2.bak 2KB
rtl8305.plg 2KB
CPU 15KB
CPU.plg 406B
rt.c 2KB
CPU.M51 20KB
rtl8305.M51 24KB
共 26 条
- 1
我虽横行却不霸道
- 粉丝: 75
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0