zj@happy 发表于 2015-6-19 20:33:11

DM9000中断问题

开发板向pc机发送一个ARP包,然后电脑返回一个ARP包,开发板解析正常,但是DM9000的中断引脚的电平一直没有改变导致老是进入中断。不知道连接DM9000的中断引脚为什么中断后电平改变。按道理是我配置了INIT脚低电平有效。配置后设置低电平中断。当接收到数据的时候INIT为低电平,然后进入中断。但是一直就低了。没有高电平过导致一直进入中断。求救。
void dm9000_handle()
{
    __asm__(
    "sub lr, lr, #4\n"
    "stmfd sp!, {r0-r12, lr}\n"      
    :
    :
   );
    recv_data();       
    /* 清除中断 */
    EINT0PEND = ~0x0;
    VIC0ADDRESS = 0;
    VIC1ADDRESS = 0;
    printf("\n*******   %d**********\n\r",count);
    count++;
    if(count==1024)
            count=10;
    __asm__(
    "ldmfd sp!, {r0-r12, pc}^ \n"      
    :
    :
);
   
}

void init_irq()
{
   
    GPNCON |= (0x2<<14);/*GPN7外部中断对应 ExtInterrupt*/
    EINT0CON0 = (0x1<<12); /*高电平触发中断*/
    EINT0MASK=0;
    VIC0INTENABLE |= 0b10;/*使能Externalinterrupt 4 ~ 11*/
    EINT7_VECTORADDR = (int)dm9000_handle;
    __asm__(
   
    "mrc p15,0,r0,c1,c0,0\n"
    "orr r0,r0,#(1<<24)\n"
    "mcr p15,0,r0,c1,c0,0\n"

    "mrs r0,cpsr\n"
    "bic r0, r0, #0x80\n"
    "msr cpsr_c, r0\n"            
    :
    :
);
}

u32 dm9000_rx(u8 *data)
{
    u16 status,len;
    u16 tmp;
    u32 i;
    u8 ready = 0;
   
    /*判断是否产生中断,且清除*/
    if(dm9000_reg_read(DM9000_ISR) & 0x01)
      dm9000_reg_write(DM9000_ISR,0x01);
    else
      return 0;
      
    /*空读*/
    ready = dm9000_reg_read(DM9000_MRCMDX);
   
    if ((ready & 0x01) != 0x01)
    {
            ready = dm9000_reg_read(DM9000_MRCMDX);
            if ((ready & 0x01) != 0x01)
              return 0;
    }
   
   
    /*读取状态*/
    status = dm9000_reg_read(DM9000_MRCMD);
   
    /*读取包长度*/
    len = DM_DAT;
   
    /*读取包数据*/
    if(len<PTK_MAX_LEN)
    {
       for(i=0;i<len;i+=2)
       {
         tmp = DM_DAT;
         data = tmp & 0x0ff;
         data = (tmp>>8)&0x0ff;
       }
    }
   
    return len;
}

w1092352710zz 发表于 2016-11-16 14:24:45

我在这一块也遇到问题了,进入中断后串口上打印不出主机的IP和MAC地址,打印的是开发板的,我的QQ:1092352710,咱两个可以讨论一下

w1092352710zz 发表于 2016-11-16 14:44:30

哥们方便把你的qq给搜说一下嘛?
页: [1]
查看完整版本: DM9000中断问题