这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 【求助】RTL8019,初始化芯片以后,读取ISR和CURR寄存器的值全部为0x

共4条 1/1 1 跳转至

【求助】RTL8019,初始化芯片以后,读取ISR和CURR寄存器的值全部为0xFF

助工
2011-10-17 21:12:23     打赏

最近在做一个TCP/IP的东东,刚好使用RTL8019AS芯片,在编写驱动程序的时候,对芯片进行初始化以后,进行读取ISR和CURR寄存器,发现两个寄存器的值都是0xFF,颇感郁闷,在此向各位大虾请教一下。具体初始化代码如下:

//==========================================
//软件复位部分
//==========================================
   // 选择页
    RealTekSelectPage(0);
    // 切换到正常工作方式
    RealTekWriteREG(&pRealTekReg->reg0w.CR, pRealTekReg, 0x22);

    // 对芯片进行复位操作
    OSTimeDly(OS_TICKS_PER_SEC >> 4);
    value = RealTekReadREG(pRealTekReg->reg0r.ResetPort, pRealTekReg);
    RealTekWriteREG(pRealTekReg->reg0w.ResetPort, pRealTekReg, (BYTE)value);
    OSTimeDly(OS_TICKS_PER_SEC >> 4);

    // 使网卡停止运行
    RealTekWriteREG(&pRealTekReg->reg0w.CR, pRealTekReg, 0x21);

    // 延时10  毫秒以上,确保芯片进入停止模式
    OSTimeDly(OS_TICKS_PER_SEC >> 4);

    // 读取ISR  标志,判断网卡是否复位成功
    value = RealTekReadREG(&pRealTekReg->reg0r.ISR, pRealTekReg);
    if (value & 0x00000080)
    {
        printf("NIC Reset OK!\r\n");
    }
    else
    {
        printf("NIC Reset Failed!\r\n");
        goto InitcleanUp;
    }
    // 软复位结束

//==========================================
//初始化部分
//==========================================
    // 设置发送缓冲区起始地址
    RealTekWriteREG(&pRealTekReg->reg0w.TPSR, pRealTekReg, 0x40);

    // 设置接收缓冲区范围
    RealTekWriteREG(&pRealTekReg->reg0w.PSTART, pRealTekReg, 0x4C);
    RealTekWriteREG(&pRealTekReg->reg0w.PSTOP, pRealTekReg, 0x80);
    RealTekWriteREG(&pRealTekReg->reg0w.BNRY, pRealTekReg, 0x4C);

    // 清除中断标志位
    RealTekWriteREG(&pRealTekReg->reg0w.ISR, pRealTekReg, 0xFF);

    // IMR  中断屏蔽寄存器,禁止所有中断
    RealTekWriteREG(&pRealTekReg->reg0w.IMR, pRealTekReg, 0x00);

    // RBCR0, RBCR1  远程字节寄存器,用于设置远程DMA  字节数
    RealTekWriteREG(&pRealTekReg->reg0w.RBCR0, pRealTekReg, 0x00);
    RealTekWriteREG(&pRealTekReg->reg0w.RBCR1, pRealTekReg, 0x00);

    // RCR   接收配置寄存器,监视方式,不接收数据包
    RealTekWriteREG(&pRealTekReg->reg0w.RCR, pRealTekReg, 0x20);

    // TCR   传输配置寄存器,选择内部Loop back  模式
    RealTekWriteREG(&pRealTekReg->reg0w.TCR, pRealTekReg, 0x02);

    // DCR  数据配置寄存器,8  位DMA  方式
    RealTekWriteREG(&pRealTekReg->reg0w.DCR, pRealTekReg, 0xC8);

    // 选择页
    RealTekSelectPage(1);
 
    // CURR  当前页面寄存器
    RealTekWriteREG(&pRealTekReg->reg1rw.CURR, pRealTekReg, 0x4D);

    // MAR0 - MAR7  设置多播地址
    RealTekWriteREG(&pRealTekReg->reg1rw.MAR0, pRealTekReg, 0xFF);
    RealTekWriteREG(&pRealTekReg->reg1rw.MAR1, pRealTekReg, 0xFF);
    RealTekWriteREG(&pRealTekReg->reg1rw.MAR2, pRealTekReg, 0xFF);
    RealTekWriteREG(&pRealTekReg->reg1rw.MAR3, pRealTekReg, 0xFF);
    RealTekWriteREG(&pRealTekReg->reg1rw.MAR4, pRealTekReg, 0xFF);
    RealTekWriteREG(&pRealTekReg->reg1rw.MAR5, pRealTekReg, 0xFF);
    RealTekWriteREG(&pRealTekReg->reg1rw.MAR6, pRealTekReg, 0xFF);
    RealTekWriteREG(&pRealTekReg->reg1rw.MAR7, pRealTekReg, 0xFF);

    // PAR0 - PAR5  设置MAC  地址
    RealTekWriteREG(&pRealTekReg->reg1rw.PAR0, pRealTekReg, 0x00);
    RealTekWriteREG(&pRealTekReg->reg1rw.PAR1, pRealTekReg, 0x1F);
    RealTekWriteREG(&pRealTekReg->reg1rw.PAR2, pRealTekReg, 0x16);
    RealTekWriteREG(&pRealTekReg->reg1rw.PAR3, pRealTekReg, 0x16);
    RealTekWriteREG(&pRealTekReg->reg1rw.PAR4, pRealTekReg, 0x73);
    RealTekWriteREG(&pRealTekReg->reg1rw.PAR5, pRealTekReg, 0x1A);

    // 选择页
    RealTekWriteREG(&pRealTekReg->reg0w.CR, pRealTekReg, 0x20);
    OSTimeDly(OS_TICKS_PER_SEC >> 4);

    // RCR   接收配置寄存器,仅接收自己地址的数据包(  以及广播地址数据包)  和多点播送地址包
    // 丢弃小于64  字节的数据包,丢弃校验错误的数据包
    RealTekWriteREG(&pRealTekReg->reg0w.RCR, pRealTekReg, 0xCC);

    // TCR   传输配置寄存器,启用CRC  生成和CRC  自动校验,工作在正常模式
    RealTekWriteREG(&pRealTekReg->reg0w.TCR, pRealTekReg, 0xE0);

    // 写ISR  寄存器,  清空中断状态寄存器
    RealTekWriteREG(&pRealTekReg->reg0w.ISR, pRealTekReg, 0xFF);

    // IMR  中断屏蔽寄存器
    RealTekWriteREG(&pRealTekReg->reg0w.IMR, pRealTekReg, 0x35);

    // 回到正常工作方式
    RealTekWriteREG(&pRealTekReg->reg0w.CR, pRealTekReg, 0x22);

当读取ISR和CURR的值的时候,发现两个寄存器都为0xFF,不知为何,请各位赐教,非常感谢!




关键词: 求助     RTL8019     初始化     芯片     以后     读取         

菜鸟
2011-10-17 21:24:49     打赏
2楼
问题出在了初始化的时候,添加了一些调试代码,选择了Page1,而当有数据到来时,直接读取0x07寄存器的值,引入了错误。正确的做法是:当网卡中断的时候,先停止网卡工作,然后保证在页面0的时候,读取ISR寄存器的值,再根据ISR的值进行中断处理。

菜鸟
2013-08-06 11:13:03     打赏
3楼

兄弟,我也出现了这个情况,看了你的帖子,还是没有成功啊!指教一下啊!


菜鸟
2013-08-06 11:15:44     打赏
4楼

         NET_RST=1;  //RESET
         delay_ms(500);
         NET_RST=0;        
    Data=RTL8019_Read(0x1f);
         RTL8019_Write(0x1f,Data);
     //    RTL8019_Write(ISR,0xff);
         delay_ms(100);
 /* 
    RTL8019_Write(CR,0XE1); // PAGE3
    RTL8019_Write(0X01,0XC0);
    RTL8019_Write(CONFIG2,0X60);
    RTL8019_Write(CONFIG3,0x0);
    RTL8019_Write(0X01,0X00);
    */
  
    RTL8019_Write(CR,0X21); // PAGE0
          delay_ms(100);
//RTL8019_Write(ISR,0xff); 
 //   RTL8019_Write(IMR,0);
   
  //   RTL8019_Write(BNRY,0X4C);
  //   Data=RTL8019_Read(BNRY);
   
    RTL8019_Write(RCR,0x1C);
    RTL8019_Write(TCR,0x02);  
      RTL8019_Write(DCR,0x48);
  //   RTL8019_Write(BNRY,0X4C);

    RTL8019_Write(PSTART,0x4c);   
    RTL8019_Write(PSTOP,0X80);
    RTL8019_Write(TPSR,0X40);
   
      RTL8019_Write(RBCR0,0x0); 
      RTL8019_Write(RBCR1,0x0); 
      RTL8019_Write(TBCR0,0x0); 
      RTL8019_Write(TBCR1,0x0); 
     delay_ms(200);
     RTL8019_Write(BNRY,0X4C);
      RTL8019_Write(ISR,0xFF); 
   // Data=RTL8019_Read(BNRY);
       RTL8019_Write(IMR,0x1F);
//    RTL8019_Write(TCR,0x00);   
    delay_ms(2);

   
    RTL8019_Write(CR,0X61); // PAGE1
   
    RTL8019_Write(CURR, 0x4C);//CURRÊÇÍø¿¨Ð´ÄÚ´æµÄÖ¸Õë¡£ËüÖ¸Ïòµ±Ç°ÕýÔÚдµÄÒ³µÄÏÂÒ»Ò³
         Data=RTL8019_Read(CURR);

    RTL8019_Write(PAR0, 0xBA);
    Data=RTL8019_Read(CURR);
         Data=RTL8019_Read(PAR0);

    RTL8019_Write(PAR1, 0xDD);
    RTL8019_Write(PAR2, 0xEA);
    RTL8019_Write(PAR3, 0x0C);
    RTL8019_Write(PAR4, 0x11);

   
    RTL8019_Write(MAR0, 0xff);
    RTL8019_Write(MAR1, 0xff);
    RTL8019_Write(MAR2, 0xff);
    RTL8019_Write(MAR3, 0xff);
    RTL8019_Write(MAR4, 0xff);
    RTL8019_Write(MAR5, 0xff); 
    RTL8019_Write(MAR6, 0xff);
    RTL8019_Write(MAR7, 0xff);

          RTL8019_Write(CR,0x22); //Start the NIC
         



共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]