- 积分
- 4
贡献15
飞刀0 FD
注册时间2015-6-19
在线时间1 小时
扫一扫,手机访问本帖
|
开发板向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[7]*/
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[i] = tmp & 0x0ff;
data[i+1] = (tmp>>8)&0x0ff;
}
}
return len;
} |
|