应用环境详见参见:ping lwip网络协议栈 分析(一)
网卡:ENC28J60
dos执行ping指令:
ping 192.168.5.8 -t -l 1
抓包:
看到如下现象
网卡ENC28J60自动填充短针至60字节:
PC发送--下位机接收时,抓取到42==42+1 字节数据
下位机发送--PC接收时,抓取到60==42+(18)字节数据
这里寻个原因-----基本定位到enc28j60的自动填充 相关部分(填充0x00)
查看手册及网卡的驱动配置情况,如下:
看下手册上对发送数据包的要求:
发送函数:
/*
*通过ENC28J60发送数据包到网络//详见手册7.1
*参数:len---包长 ; *packet----数据包的指针
*返回值:无
*/
void enc28j60PacketSend(unsigned int len, unsigned char* packet)
{
// Set the write pointer to start of transmit buffer area--设置发送缓冲区地址写指针入口
while(!(enc28j60Read(ESTAT) & ESTAT_CLKRDY));//检查ESTAT_CLKRDY--时钟就绪
enc28j60Write(EWRPTL, TXSTART_INIT&0xFF);
enc28j60Write(EWRPTH, TXSTART_INIT>>8);
// Set the TXND pointer to correspond to the packet size given--使用给定的len设置发送缓冲器结束地址
enc28j60Write(ETXNDL, (TXSTART_INIT+len)&0xFF);
enc28j60Write(ETXNDH, (TXSTART_INIT+len)>>8);
// write per-packet control byte (0x00 means use macon3 settings)--
//发送数据包:ENC28J60要求在待发送数据包前添加一个包控制字节,包控制字节格式如图7.1--bit0 --POVERRIDE--详见手册7.1
enc28j60WriteOp(ENC28J60_WRITE_BUF_MEM, 0, 0x00);
// copy the packet into the transmit buffer--将数据包复制到发送缓冲区
enc28j60WriteBuffer(len, packet);
...............
..............
}
留意倒数第二行的设置代码:将包控制字节的bit 0位==设置为0(低),于是决定了:MACON3中的值用于确定数据包发送的方式。
再来看下MACON3寄存器的内容:
在网卡初始化的过程中有设置:
unsigned char enc28j60Init(unsigned char* macaddr)
{
....................
//由于ENC28J60不支持自动协商机制,所以对端的网卡需要强制设置为全双工--
//MACON3_PADCFG0用0填充所有短帧至60字节长,并追加一个有效的CRC,其他参数详见手册:MACON3寄存器
enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN|MACON3_FULDPX);
.........................
}
“用 0填充所有短帧至 60字节长,并追加一个有效的CRC”这便是这里要找到的根据。
通过抓到的包也可看出这一情况:
而且是由网络接口层来填充的---------然--并不算作“被需要“的数据。