打印

W77E58+RTL8019,不能对RTL8019的IMR和PAR0~PAR5不能操作

[复制链接]
1682|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
solomne|  楼主 | 2007-7-10 18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
对RTL8019初始化时,代码如下:
unsigned char xdata chRTLInitTmp;
    unsigned int i;
            //在RSTDRV从高电平回到低电平之后的100MS时,在对RTL8019做读写操作,以确保完全复位
        P35 = 1;
    for(i = 0;i < 400;i++);
    P35 = 0;
    for(i = 0;i < 4000;i++);
    
    /* reset: write to reset prot */
        WriteReg(0x18,0xaa);
        chRTLInitTmp = ReadReg(0x18);
        for(i = 0;i < 20;i++);        

    /* init RTL registers*/
        WriteReg(0x00,0x21);
        chRTLInitTmp = 0x00;
        chRTLInitTmp = ReadReg(0x00);

        RTLPage(0);
        WriteReg(0x0a,0x00);    //清RBCR0
        WriteReg(0x0b,0x00);    //清RBCR1
        WriteReg(0x0c,0xe0);    //RCR,监视模式,不接收数据报
        WriteReg(0x0d,0xe2);    //TCR,loopback模式

         WriteReg(0x01,    0x4c);    /* Pstart    */
    WriteReg(0x02,    0x80);    /* Pstop    */
    WriteReg(0x03,    0x4c);    /* BNRY        */
    WriteReg(0x04,    0x40);    /* TPSR        */

        WriteReg(0x07,0xFF);    /* ISR: Interrupt Status Register,write FF to clear up all interrupt status */
        //WriteReg(0x0f,0x00);    /* IMR: Interrupt Mask Register,屏蔽掉所有中断 */
        WriteReg(0x0e,0xC8);    /* DCR: Data Configuration Register*/

    WriteReg(0x0c,0xCE);    /* RCR*/
    WriteReg(0x0d,0xE0);    /* TCR*/

        //To debug
        chRTLInitTmp = ReadReg(0x07);
        chRTLInitTmp = ReadReg(0x0f);

    RTLPage(1);
    WriteReg(0x07,0x4d); //CURR,设置为指向当前正在写的页的下一页

    /* MAR0 */
    WriteReg(0x08,0x00);
    WriteReg(0x09,0x41);
    WriteReg(0x0a,0x00);
    WriteReg(0x0b,0x80);
    WriteReg(0x0c,0x00);
    WriteReg(0x0d,0x00);
    WriteReg(0x0e,0x00);
    //WriteReg(0x0f,0x00);

    /* set phisical address */
        RTLPage(1);
    WriteReg(1,0x00);
    WriteReg(2,0xe0);
    WriteReg(3,0x19);
    WriteReg(4,0x21);
    WriteReg(5,0x68);
    WriteReg(6,0x12);
        for(i = 0;i < 200;i++);

        //To debug
        chRTLInitTmp = ReadReg(0x08);
        chRTLInitTmp = ReadReg(0x09);
        chRTLInitTmp = ReadReg(0x0a);
        chRTLInitTmp = ReadReg(0x0b);
        chRTLInitTmp = ReadReg(0x0c);
        chRTLInitTmp = ReadReg(0x0d);
        chRTLInitTmp = ReadReg(0x0e);
        //chRTLInitTmp = ReadReg(0x0f);

        chRTLInitTmp = ReadReg(0x01);
        chRTLInitTmp = ReadReg(0x02);
        chRTLInitTmp = ReadReg(0x03);
        chRTLInitTmp = ReadReg(0x04);
        chRTLInitTmp = ReadReg(0x05);
        chRTLInitTmp = ReadReg(0x06);

    /* transimit start page */
    LastSendStartPage = SEND_START_PAGE0;
    StartPageOfPacket = RECEIVE_START_PAGE + 1;

    /* in the beginning, no packet is in sending */
    InSending = FALSE;

    RTLPage(0);
    /* initial over, start command and receive */
        WriteReg(0x0c,0xcc);                //将芯片置于正常模式,跟外部网络连接
        WriteReg(0x0d,0xe0);
        WriteReg(0x07,0xFF);
        chRTLInitTmp = ReadReg(0x07);       //清除所有中断标志位
    WriteReg(0x00,0x22);

相关帖子

沙发
solomne|  楼主 | 2007-7-10 18:15 | 只看该作者

问题描述

问题在于:当对复位寄存器0x18~0x1f、配置寄存器0x00及其他都操作正常,写进去的数与读出的数相等。但是对IMR(中断屏蔽寄存器)和PAR0~PAR5(物理地址寄存器)不能正常操作。
IMR的问题:执行WriteReg(0x0f,0x00);语句时,直接停止,不向下运行了,但是如果跟到函数里确实正常的,很莫名其妙。
PAR0~PAR5的问题:
执行
         RTLPage(1);
    WriteReg(1,0x00);
    WriteReg(2,0xe0);
    WriteReg(3,0x19);
    WriteReg(4,0x21);
    WriteReg(5,0x68);
    WriteReg(6,0x12);
        for(i = 0;i < 200;i++);
再执行
        chRTLInitTmp = ReadReg(0x01);
        chRTLInitTmp = ReadReg(0x02);
        chRTLInitTmp = ReadReg(0x03);
        chRTLInitTmp = ReadReg(0x04);
        chRTLInitTmp = ReadReg(0x05);
        chRTLInitTmp = ReadReg(0x06);
读出的数根本不是写进去的值。
不知哪里出来问题,向各位高手求助!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝