请教DM9000A读写寄存器问题

2020-01-26 12:44发布


最近用C8051F340外接12M晶振,之后倍频到48MHZ做一个以太网传输的项目,现在遇到点问题,DM9000A的读写函数不正确,测试用例是:写完一个地址,之后把这个地址里的值读出来,但是每次都读不出来....DM9000A的CMD接P3^4,数据和地址接P4口
//-------------------------------------------------
//函数名:void IOW(unsigned char uc_data,unsigned char flag)
//输入:  uc_data:地址或数据;flag=1写数据,=0写寄存器
//输出:   NULL
//返回值:  NULL
//作者:
//修改:
//备注:   写寄存器  
//-------------------------------------------------
void IOW(unsigned char uc_data,unsigned char flag)
{
        
        P4 = uc_data;
        DCMD = flag;
        DCS = 0;
        DRE =1;
        DWD =0;
        Delay(10);
        DWD=1;
        DCS =1;
        
}

//-------------------------------------------------
//函数名:unsigned char IOR(unsigned char uc_add)
//输入:  uc_add:地址
//输出:   NULL
//返回值:  uc_add地址的数据
//作者:
//修改:
//备注:   读寄存器
//-------------------------------------------------
unsigned char IOR(unsigned char flag)
{
        unsigned char uc_data;
        P4=0Xff;
        DCS =1;
        DWD=1;
        Delay(10);
        DCS =0;
        DCMD = flag;                //数据操作
        DWD=1;
        DRE =0;                        //读数据
        uc_data=P4;
        Delay(10);
        DRE=1;
        DCS=1;
        
        return uc_data;
}
//----------------------------------------------
//函数名:void Write_Reg(unsigned char uc_reg,unsigned char uc_data)
//输入: reg:寄存器,uc_data:要写入寄存器的值
//输出: NULL
//返回值:         NULL
//作者:
//修改:
//备注:  写函数
//----------------------------------------------
void Write_Reg(unsigned char uc_reg,unsigned char uc_data)
{

   IOW(uc_reg,0) ;          //写地址
   Delay_us(10);
   IOW(uc_data,1);    //写数据

}

//----------------------------------------------
//函数名:unsigned char Read_Reg(unsigned char uc_reg)
//输入:  uc_reg: 读内容的指针
//输出:   NULL
//返回值:        reg指针的内容
//作者:
//修改:
//备注:   读函数操作
//----------------------------------------------
unsigned char Read_Reg(unsigned char uc_reg)
{
        unsigned char uc_data=0;

        IOW(uc_reg,0);
        Delay(10);
        uc_data=IOR(1)        ;
        return uc_data;

}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
dy22511825
1楼-- · 2020-01-26 18:33
。。。。怎么还没人。。。
twd3621576
2楼-- · 2020-01-26 23:58
不经常进论坛 给你个群吧 这群不错 Cortex M0-M3-M4+Lwip名称    群   号:8753696
dy22511825
3楼-- · 2020-01-27 03:39
twd3621576 发表于 2013-9-1 07:41
不经常进论坛 给你个群吧 这群不错 Cortex M0-M3-M4+Lwip名称    群   号:8753696

我现在程序问题是 在发送函数中 如果 单步调试 可以通过,但是全速运行时候uc_data=Read_Reg(NSR) ;        //获得NSR状态 while((uc_data & 0x0c) == 0);         // breakpoint1: 出现错误 这个值是0X40,一直等待,请问如何解决啊...
dy22511825
4楼-- · 2020-01-27 08:03
 精彩回答 2  元偷偷看……
qftek
5楼-- · 2020-01-27 13:23
严重建议:
MICREL KSZ8851SNL 性能、价格比台系芯片强很多,特别插拔不能link的bug不存在。另外SPI接口,硬件线路及软件驱动都容易。

WIZNET W5500 ,硬件集成TCP/IP协议栈。不要哪么费心费力去调试uIP lwIP之类的东东,硬件SPI接口,线路简单。

还有SMSC的相关芯片,性能超强。

哪些用台系芯片的,要好好考虑一下芯片BUG,及原厂及代理商是否能出质量承诺书,及硬件软件的复杂程度。有更好的,为什么选它 ?

一周热门 更多>