ENC28J60固件开发:传输长度检查错误排查求助
ENC28J60 传输长度校验错误排查:类型/长度字段的正确计算
核心问题拆解
你遇到的Transmit Length Check Error确实和以太网帧的类型/长度字段直接相关,但这个字段的取值逻辑不是简单填写实际数据长度,要结合以太网帧规范和ENC28J60的硬件要求:
类型/长度字段的两种工作模式
这个16位字段有两种作用,对应不同的校验逻辑:
- 模式1:长度字段(值 < 0x0600)
此时字段代表类型/长度字段之后的有效负载总长度,且必须满足以太网最小帧长要求:有效负载长度至少为46字节。
你发送的"Hello World"只有11字节,远小于46,此时必须填充全0字节凑够46,类型/长度字段要填46,而不是11。如果不填充且填11,芯片会判定长度不合法,触发校验错误。 - 模式2:协议类型字段(值 ≥ 0x0600)
当字段值大于等于1536(0x0600)时,芯片会把它当作上层协议类型(比如0x0800对应IPv4,0x0806对应ARP),此时不会触发长度校验逻辑。这种模式更适合你的测试场景:直接把类型/长度字段设为一个合法的协议类型值,就能直接发送11字节的"Hello World",不需要填充。
针对你的测试场景的具体解决步骤
- 用协议类型模式(推荐)
- 把帧的类型/长度字段设为
0x0800(IPv4)或0x0806(ARP)这类标准值。 - 直接把"Hello World"作为有效负载放入发送缓冲区,无需填充。
- 确保发送缓冲区的帧结构正确:目的MAC(6字节)→ 源MAC(6字节)→ 类型/长度(2字节)→ 有效负载(11字节),CRC由ENC28J60自动生成,无需手动添加。
- 把帧的类型/长度字段设为
- 用长度字段模式
- 给"Hello World"添加35字节的填充数据(比如全0),使有效负载总长度达到46字节。
- 类型/长度字段设为
46(十六进制0x002E)。 - 同样确保帧结构的前14字节(MAC+类型/长度)正确,后接46字节的有效负载。
额外检查点
- 确认发送缓冲区的起始地址和长度设置正确,芯片能正确读取到完整的帧数据。
- 检查发送命令的时序是否符合ENC28J60的 datasheet 要求,比如写完缓冲区后是否正确触发发送指令。
内容的提问来源于stack exchange,提问作者Harmandeep Dubb
相关产品推荐
相关产品推荐

