通过上一个部分我们知道重置在18-1F端口写入数据就可以了。 通常是0x18 然后判断0x07位ISR寄存器的最高位 当网卡(NIC)进入复位状态时置 1,执行开始命令后清零;当接 收缓冲区溢出时置 1,读出一个或多个包后自动清零。
初始化主要设置缓冲区的配置 //设置接收配置寄存器 RCR 对数据包接收配置 port_write_byte(NE2K_IOADDR + 12, 0xE0); //设置发送配置寄存器 port_write_byte(NE2K_IOADDR + 13, 0xE2); //0x9正常宽字 0x01 loopbakce宽字 TCR设置 port_write_byte(NE2K_IOADDR + 14, 0xC8); //长度第八位,高八位 port_write_byte(NE2K_IOADDR + 10, 0x00); port_write_byte(NE2K_IOADDR + 11, 0x00); //清楚中断标志 port_write_byte(NE2K_IOADDR + 7, 0xFF); port_write_byte(NE2K_IOADDR + 0, 0x0A); //写物理网卡地址 选择了page1 port_write_byte(NE2K_IOADDR + NIC_COMMAND,0x61); for(i=0;i<6;i++){ port_write_byte(NE2K_IOADDR +i+1,buf[i*2]); } //当前寄存器位置 port_write_byte(NE2K_IOADDR + 7, 0x50); //设置多播地址 port_write_byte(NE2K_IOADDR + 8, 0x00); port_write_byte(NE2K_IOADDR + 9, 0x41); port_write_byte(NE2K_IOADDR + 10, 0x00); port_write_byte(NE2K_IOADDR + 11, 0x80); port_write_byte(NE2K_IOADDR + 12, 0x00); port_write_byte(NE2K_IOADDR + 13, 0x00); port_write_byte(NE2K_IOADDR + 14, 0x00); port_write_byte(NE2K_IOADDR + 15, 0x00); port_write_byte(NE2K_IOADDR + 0, 0x21); //设置接收页开始地址 port_write_byte(NE2K_IOADDR + 1, 0x50); //设置接收页结束地址 port_write_byte(NE2K_IOADDR + 2, 0x80); //设置边界地址 port_write_byte(NE2K_IOADDR + 3, 0x50); port_write_byte(NE2K_IOADDR + 4, 0x40);//发送起始页 port_write_byte(NE2K_IOADDR + 12, 0xCC); port_write_byte(NE2K_IOADDR + 13, 0xE2);//方便测试loopback port_write_byte(NE2K_IOADDR + 15, 0x00); port_write_byte(NE2K_IOADDR + 0, 0x22);
网卡地址的获取 1.设置读的位置 2.设置读页的高地位 3.设置读长度高地位 4.读取 网卡存储是重复存储在前面的12个字节的
第一页的前6个是设置mac的地址 7个是设置当前缓存指针的位置 8-F设置的是多播的地址匹配
1.缓冲位置 2.长度大小 3.写 4.实际长度 5.发射 检测发射成功 : CR 的第二位 这一位在置1时发送数据包,在发送完毕或终止时自动清零,写 0 没影响 ISR的第零位 这一位显示接收无错误(接收收到数据包并无错误时置 1) 一位 这一位显示发送无错误(发送完数据包并无错误时置 1)
1.读取当前位置 2.读取边界位置 当前》边界 可以读取前面4个字节 0:接受状态,1:下一页,2:当度第八位,3:长度高八位 读取缓冲区内容剔除前面这四个标志位
图片中的两个bug 1.状态01 有问题 如果是发送是正常则对头,如果是loopback模式则无效 (测试结果) CR寄存器发送完成后 &0x04==0 loopback模式对头 正常发射 错 TSR寄存器发送成功 &0x01==1 loopback模式错 正常发射 对 ISR寄存器 loopback模式对 正常发射 对 有知道上面CR和ISR的状态的还望告诉我!!! 2.高八位应该是零,结果跟第八位一样,排查发现跟自己写的C的转换函数有关系BUG。(跟指针有关)