本文引用地址:https://www.eepw.com.cn/article/201611/322174.htmdm_reg_write(DM9000_NSR, 0x2c);//清除TX状态
dm_reg_write(DM9000_IMR, 0x81);//打开DM9000接收数据中断
}
int dm_rec_packet(unsigned char *datas)
{
unsigned char int_status;
unsigned char rx_ready;
unsigned short rx_status;
unsigned short rx_length;
unsigned short temp;
int i;
int_status = dm_reg_read(DM9000_ISR);//读取ISR
if(int_status & 0x1)//判断是否有数据要接受
{
dm_reg_write(DM9000_ISR,0x01);//清除中断*******************F
rx_ready = dm_reg_read(DM9000_MRCMDX);//先读取一个无效的数据
Uart_Printf("ready1=%dn",rx_ready);
rx_ready = (unsigned char)DM_DATA_PORT;//真正读取到的数据包首字节
Uart_Printf("ready2=%dn",rx_ready);
if(rx_ready == 1)//判读首字节是否为1或0
{
DM_ADDR_PORT = DM9000_MRCMD;//连续读取数据包内容
rx_status = DM_DATA_PORT;//状态字节
rx_length = DM_DATA_PORT;//数据长度
Uart_Printf("nlength=%dn",rx_length);
for(i=0; i//16位数据转换为8位数据存储
{
delay(20);
temp = DM_DATA_PORT;
datas[i] = temp & 0x0ff;
datas[i + 1] = (temp >> 8) & 0x0ff;
}
if((datas[12]==8)&&(datas[13]==6))
{
if((datas[20]==0)&&(datas[21]==1))
Uart_Printf("ARP请求n");
if((datas[20]==0)&&(datas[21]==2))
Uart_Printf("ARP应答n");
for(i=1; i<=rx_length; i++)
{
Uart_Printf("%d",datas[i-1]);
if(i%6==0)
Uart_Printf("n");
}
}
}
}
else if(rx_ready !=0)//停止设备
{
//dm_reg_write(DM9000_IMR,0x80);//停止中断
//dm_reg_write(DM9000_ISR,0x0F);//清中断状态
//dm_reg_write(DM9000_RCR,0x0);//停止接收
//还需要复位系统,这里暂时没有处理
}
dm_reg_write(DM9000_ISR, 0x1);//清中断
return rx_length;
}
void __irq uartISR(void)
{
char ch;
rSUBSRCPND |= 0x1;
rSRCPND |= 0x1<<28;
rINTPND |= 0x1<<28;
ch=rURXH0;
if(ch == s)
tran=1;//表示发送一个ARP数据请求包
while(!(rUTRSTAT0 & 0x2));
rUTXH0=ch;
//for(i=0;i<100;i++);
}
void __irq DM9000ISR(void)
{
DisableIrq(BIT_EINT4_7);
Uart_Printf("nEINT7 Occuredn");
if(rEINTPEND&(1<<7))
{
rEINTPEND = rEINTPEND | (0x1<<7);
packet_len = dm_rec_packet(buffer);//接收网卡数据
}
rSRCPND = rSRCPND | (0x1<<4);
rINTPND = rINTPND | (0x1<<4);
EnableIrq(BIT_EINT4_7);
}
void init()
{
//uart0 port
rGPHCON = 0x00faaa;
rGPHUP= 0x7ff;
rULCON0 = 0x3;
rUCON0 = 0x5;
rUFCON0 = 0;
rUMCON0 = 0;
rUBRDIV0 = 26;
rSRCPND = (0x1<<27)|(0x1<<28);
rSUBSRCPND = 0x1;
rINTPND = (0x1<<27)|(0x1<<28);
rINTSUBMSK = ~(0x1);
rINTMSK = ~((0x1<<27)|(0x1<<28));
pISR_UART0 = (U32)uartISR;
//EINT7
rGPFCON = 2<<14;
rEXTINT0 = (rEXTINT0 & (~(0x07<<28))) | (0x01<<28);
rEINTMASK &= ~(1<<7);
rSRCPND = rSRCPND | (0x1<<4);
rINTPND = rINTPND | (0x1<<4);
rGPFCON = (rGPFCON & (~(0x03<<14))) | (0x02<<14);//GPF7设置为EINT7
rEXTINT0 = (rEXTINT0 & (~(0x07<<28))) | (0x01<<28);
rEINTMASK = rEINTMASK & (~(0x01<<7));
ClearPending(BIT_EINT4_7);
pISR_EINT4_7 = (U32)DM9000ISR;
rINTMSK &= ~(1<<4);
}
void Main(void)
{
tran=0;
MMU_Init();
init();
dm_init();
while(1)
{
if(tran==1)
{
dm_tran_packet(arpsendbuf1, 42 );//因为PC机不断向外发送数据,其中刚开始就有ARP数据包,
tran=0;//所以为了方便查看,PC机通过串口发送s时,DM9000
}
//向PC机发送一个ARP数据请求,再收到的ARP数据就是PC机的应答信号
}
}
评论