4897|6

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

DM9000A网络芯片中断脚INT无输出信号 [复制链接]

代码用的是Uboot的dm9000x驱动,按照需要做了适当修改。初始化函数如下:


  1. /* Initilize dm9000 board
  2. */
  3. int
  4. eth_init( const char *ps_mac )
  5. {
  6.         int i, oft, lnk;
  7.     unsigned char u8_byte = 0;
  8.     unsigned char sa_mac[ 6 ] = { 0 };
  9.         DM9000_DBG("eth_init()\r\n");

  10.         /* RESET device */
  11.         dm9000_reset();
  12.         dm9000_probe();

  13.         /* NIC Type: FASTETHER, HOMERUN, LONGRUN */
  14.         identify_nic();

  15.         /* GPIO0 on pre-activate PHY */
  16.         DM9000_iow(DM9000_GPR, 0x00);        /*REG_1F bit0 activate phyxcer */

  17.         /* Set PHY */
  18.         set_PHY_mode();

  19.         /* Program operating register */
  20.         DM9000_iow(DM9000_NCR, 0x0);        /* only intern phy supported by now */
  21.         DM9000_iow(DM9000_TCR, 0);        /* TX Polling clear */
  22.         DM9000_iow(DM9000_BPTR, 0x3f);        /* Less 3Kb, 200us */
  23.         DM9000_iow(DM9000_FCTR, FCTR_HWOT(3) | FCTR_LWOT(8));        /* Flow Control : High/Low Water */
  24.         DM9000_iow(DM9000_FCR, 0x0);        /* SH FIXME: This looks strange! Flow Control */
  25.         DM9000_iow(DM9000_SMCR, 0);        /* Special Mode */
  26.         DM9000_iow(DM9000_NSR, NSR_WAKEST | NSR_TX2END | NSR_TX1END);        /* clear TX status */
  27.         DM9000_iow(DM9000_ISR, 0x0f);        /* Clear interrupt status */

  28.     if( ps_mac != 0 )
  29.     {
  30.         memcpy( sa_mac, ps_mac, 6 );
  31.             /* Set Node address */
  32.             DM9000_DBG("MAC: %02x:%02x:%02x:%02x:%02x:%02x\r\n", sa_mac[0],
  33.                    sa_mac[1], sa_mac[2], sa_mac[3], sa_mac[4], sa_mac[5]);
  34.             for (i = 0, oft = 0x10; i < 6; i++, oft++)
  35.                     DM9000_iow(oft, sa_mac[i]);
  36.             for (i = 0, oft = 0x16; i < 8; i++, oft++)
  37.                     DM9000_iow(oft, 0xff);

  38.             /* read back mac, just to be sure */
  39.             for (i = 0, oft = 0x10; i < 6; i++, oft++)
  40.                     DM9000_DBG("%02x:", DM9000_ior(oft));
  41.             DM9000_DBG("\r\n");
  42.     }

  43.         /* Activate DM9000 */
  44.         DM9000_iow(DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN);        /* RX enable */
  45.         //DM9000_iow(DM9000_IMR, IMR_PAR);        /* Enable TX/RX interrupt mask */
  46.         DM9000_iow( DM9000_IMR, 0x81 );
  47.    
  48.     u8_byte = DM9000_ior( DM9000_NSR );
  49.     DM9000_DBG( "DM9000_NSR = 0x%02x\r\n", u8_byte );
  50.         i = 0;
  51.         while (!(phy_read(1) & 0x20)) {        /* autonegation complete bit */
  52.                 mdelay(1);
  53.                 i++;
  54.                 if (i == 10000) {
  55.                         //xil_printf("could not establish link\r\n");
  56.                         return 0;
  57.                 }
  58.         }

  59.         /* see what we've got */
  60.         lnk = phy_read(17) >> 12;
  61.         xil_printf("operating at ");
  62.         switch (lnk) {
  63.         case 1:
  64.                 xil_printf("10M half duplex ");
  65.                 break;
  66.         case 2:
  67.                 xil_printf("10M full duplex ");
  68.                 break;
  69.         case 4:
  70.                 xil_printf("100M half duplex ");
  71.                 break;
  72.         case 8:
  73.                 xil_printf("100M full duplex ");
  74.                 break;
  75.         default:
  76.                 xil_printf("unknown: %d ", lnk);
  77.                 break;
  78.         }
  79.         xil_printf("mode\r\n");

  80.         return 0;
  81. }

复制代码

初始化代码中已经清了中断,并启用了接受中断,但为什么收到数据的时候,INT脚竟然没有信号输出?ISR中断寄存器都已经有中断位重置了呀。还请高手指点,谢谢!

最新回复

解决了,是硬件的问题。把有一个电阻弄掉就好了。但是哪一个电阻就必须去找硬件工程师看原理图了。  详情 回复 发表于 2010-3-21 22:10
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
中断屏蔽位,好像没见你使用,这个相应位在中断到来前要置0的,才会响应
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你们公司的代码命名方式很是独特
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

4
 
DM9000_iow( DM9000_IMR, 0x81 );
这一句就是中断屏蔽位呀。启用了接收中断。

而这一句
DM9000_iow(DM9000_ISR, 0x0f);    /* Clear interrupt status */
是清中断
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(中级)

5
 
帮顶下,

MARK,学习下!
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 
你的问题解决了么?是什么原因?我也是这个情况,INT脚一直是低电平,收中断状态信息显示,crc错误和physic layer错误。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
解决了,是硬件的问题。把有一个电阻弄掉就好了。但是哪一个电阻就必须去找硬件工程师看原理图了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表