1. 项目概述:深入硬件交换机的流量治理核心
在网络交换系统的世界里,数据包就像城市交通中的车辆,有救护车、消防车,也有普通的私家车。如果所有车辆都挤在同一条道上,没有红绿灯和优先通行权,那么紧急任务必然会被延误。硬件交换机的优先级映射与流量控制机制,就是为数据包构建的这套“智能交通系统”。它的核心任务,是在数据包进入交换芯片的瞬间,就为其贴上“优先级标签”,并基于此标签,在后续的转发、队列调度和出端口过程中,实施差异化的“交通管制”,从而确保关键业务流(如实时控制指令、音视频流)能够获得低延迟、低抖动的“快速通道”。
德州仪器(TI)的AM263P系列微控制器集成的CPSW(Common Platform Switch)模块,便是一个功能完备的嵌入式硬件交换机典范。它不仅仅是一个简单的MAC控制器,更内嵌了复杂的服务质量(QoS)硬件引擎。对于从事工业通信、汽车电子或高端消费电子的嵌入式工程师而言,深入理解CPSW的优先级映射与流量控制机制,是设计出稳定、可靠、响应及时的网络节点的关键。这不仅仅是配置几个寄存器那么简单,而是需要透彻理解数据包从“入境”到“出境”的全过程中,硬件是如何观察、分类、标记并调度它们的。本文将基于AM263P的技术参考手册,拆解CPSW的优先级判定流水线、CRC处理策略以及高级流量整形功能,并提供从原理到配置的实战指南。
2. 优先级映射逻辑全解析:数据包的“身份”认定
当数据包抵达CPSW的端口时,硬件需要立即决定其优先级(0-7,7为最高)。这个决策过程是一套严格的、可配置的流水线。理解这套逻辑,是进行正确QoS配置的基石。
2.1 优先级判定流水线
CPSW的优先级判定遵循一个固定的顺序,我们可以将其视为一个决策树。这个决策的核心寄存器是CPSW_P0_CONTROL_REG(对于主机端口Port 0)或相应端口控制寄存器。判定流程严格按照以下顺序进行:
- VLAN优先级检查:硬件首先检查数据包是否包含VLAN标签(802.1Q)。如果包含,并且
RX_REMAP_VLAN位被置位,则交换机将直接采用VLAN标签中的3位优先级代码点(PCP)字段作为硬件交换优先级。这是一种最直接、最标准的优先级传递方式。如果该位被清除,则跳过VLAN优先级,进入下一步检查。 - IPv4 DSCP检查:如果数据包是IPv4类型(L2帧类型
LTYPE = 0x0800),并且IP头部服务类型(TOS)字段的DSCP部分(字节14的高6位)有效,同时DSCP_IPV4_EN使能位被置位,则进入DSCP映射流程。若RX_REMAP_DSCP_V4位被置位,硬件会提取DSCP值(0-63),并通过端口专用的DSCP到优先级映射寄存器(CPSW_PN_DSCP_PRI_MAP_REG)进行查表,将6位DSCP映射为3位硬件优先级(0-7)。否则,使用默认的CPPI接收通道号作为优先级。 - IPv6 DSCP检查:与IPv4类似,针对IPv6数据包(
LTYPE = 0x86DD),检查其流量类别(Traffic Class)字段。若DSCP_IPV6_EN使能且RX_REMAP_DSCP_V6置位,则进行DSCP映射。 - 默认优先级:如果以上条件均不满足(即非VLAN tagged且未启用或不符合DSCP映射条件),则数据包被认定为“非标签”流量,其硬件交换优先级直接由CPPI接收通道号决定。通常,在简单应用中,我们可以通过软件为不同的业务流分配不同的CPPI接收通道,从而间接实现优先级分类。
注意:
RX_REMAP_VLAN和RX_REMAP_DSCP_*这些重映射功能,与端口的发送优先级重映射(通过CPSW_PN_TX_PRI_MAP_REG配置)存在互斥性。技术手册明确指出,当使能了接收侧基于VLAN或DSCP的重映射时,发送优先级重映射应保持默认值。这意味着,一旦你决定在入口使用内容感知的优先级映射,出口的优先级调整能力将受到限制。设计时需要权衡:是希望在入口精确分类,还是在出口灵活调整。
2.2 映射寄存器配置实战
理解逻辑后,配置就变得有章可循。以下是一个典型的配置示例,假设我们需要为Port 0配置基于DSCP的优先级映射:
- 确定优先级策略:首先规划你的DSCP到硬件优先级的映射关系。例如,将EF(加速转发,DSCP 46)映射到最高优先级7,将AF41(保证转发,DSCP 34)映射到优先级6,将BE(尽力而为,DSCP 0)映射到优先级0。
- 配置DSCP映射表:对于Port 0,需要配置
CPSW_P0_DSCP_PRI_MAP_REG寄存器。这个寄存器通常是一个32位或64位的查找表,每个DSCP值(0-63)对应一个3位的优先级值。你需要根据策略,填充这个查找表。
由于DSCP有64个可能值,手动计算极易出错。在实际工程中,通常会定义一个数组来初始化这个映射表,或者使用TI提供的驱动库函数。// 示例:将DSCP 46 (0b101110) 映射到优先级 7 (0b111) // 假设寄存器每2位控制一个DSCP映射(简化模型,实际位宽需查手册) CPSW_P0_DSCP_PRI_MAP_REG = 0x...; // 精心设置每一位 - 使能DSCP重映射:在
CPSW_P0_CONTROL_REG寄存器中,设置DSCP_IPV4_EN和RX_REMAP_DSCP_V4位(如果支持IPv6,还需设置DSCP_IPV6_EN和RX_REMAP_DSCP_V6)。// 使能IPv4 DSCP优先级重映射 CPSW_P0_CONTROL_REG |= (DSCP_IPV4_EN_MASK | RX_REMAP_DSCP_V4_MASK); - 关闭冲突功能:确保端口发送优先级重映射寄存器
CPSW_P0_TX_PRI_MAP_REG保持复位默认值(通常是恒等映射,即优先级x映射到优先级x)。
实操心得:在调试优先级映射时,一个非常有效的方法是使用“优先级染色”测试。发送一系列具有不同VLAN PCP或DSCP值的数据包,然后在接收端(或通过交换机的统计计数器)检查这些包最终被放入哪个硬件优先级队列。这能最直观地验证你的配置是否正确。AM263P的CPSW模块通常提供每个优先级队列的帧计数寄存器,是调试的利器。
3. 数据完整性基石:CRC校验的生成、检查与透传
在关注优先级的同时,数据完整性是通信不可妥协的底线。CPSW对循环冗余校验(CRC)的处理提供了精细的控制,这对某些特定协议(如某些工业以太网协议要求保留或修改CRC)至关重要。
3.1 CRC处理的双重控制
CPSW的CRC处理涉及两个关键控制位,它们分别管理不同路径:
出口CRC控制 (
P0_TX_CRC_REMOVE):位于CPSW_CONTROL_REG。此位决定从主机端口(Port 0)发送出去的报文是否包含CRC。- 置1:发送时移除CRC。适用于上层协议(如某些隧道协议或自定义封装)已经包含校验,或需要由后续硬件添加CRC的场景。
- 清0:发送时保留或添加CRC。这是以太网标准模式。
CRC类型选择 (
CRC_TYPE):位于每个端口的CPSW_PN_MAC_CONTROL_REG。此位决定端口使用哪种CRC算法。- 清0:使用标准的以太网CRC-32(即IEEE 802.3定义的CRC)。
- 置1:使用Castagnoli CRC-32C(多项式
0x1EDC6F41)。这种CRC在SCTP、iSCSI等协议中广泛使用,因其在硬件中计算效率更高。
一个重要原则:出口数据包的CRC类型,完全由出口端口的CRC_TYPE位决定,与入口数据包携带的CRC类型无关。这意味着,一个携带标准CRC的包进入交换机,如果从CRC_TYPE=1的端口出去,它将被重新计算并替换为Castagnoli CRC。
3.2 不同路径的CRC行为详解
为了��清晰,我们分路径看CRC的“旅程”:
| 数据包路径 | 入口CRC检查 | 出口CRC生成/处理 | 关键控制位与行为 |
|---|---|---|---|
| 以太网端口 -> 交换机内部 -> 以太网端口 | 端口根据自身CRC_TYPE检查入口CRC(以太网或Castagnoli)。错误包可配置为丢弃或传递。 | 出口端口根据自身CRC_TYPE生成新的CRC附加到包尾。如果入口CRC有错误且包被传递,出口CRC的至少一个字节会被反转以示错误。 | CRC_TYPE决定检查类型和生成类型。错误指示通过反转CRC字节实现。 |
| CPPI主机端口 -> 交换机内部 -> 以太网端口 | 主机通过缓冲区描述符的CRC_TYPE位告知交换机入口CRC类型(或无CRC)。P0_RX_PASS_CRC_ERR控制是否传递错误包。 | 同上,由出口以太网端口的CRC_TYPE生成CRC。 | 主机侧拥有更大灵活性,可逐包指定CRC类型(若支持)。错误信息可记录在描述符中。 |
| 以太网端口 -> 交换机内部 -> CPPI主机端口 | 同上,以太网端口检查CRC。 | 由P0_TX_CRC_REMOVE决定是否移除CRC。若保留,CRC类型由P0_TX_CRC_TYPE位全局指定。 | 主机接收侧可能收到不带CRC的包,需由软件处理校验。 |
配置建议:对于大多数标准以太网应用,保持CRC_TYPE=0(标准以太网CRC)和P0_TX_CRC_REMOVE=0(包含CRC)是最简单可靠的选择。只有当你的系统需要与使用Castagnoli CRC的特定协议栈交互,或者为了提升主机侧处理性能而希望硬件移除CRC时,才需要修改这些配置。
踩坑记录:我们曾在一个项目中,因为误将
P0_TX_CRC_REMOVE设为1,导致所有从主机发出的数据包都没有CRC。对端设备(一个商用交换机)的某些型号在收到无CRC的包时,并未丢弃,而是静默地工作,但网络层的重传率莫名升高。排查良久才发现是CRC缺失导致对端物理层或MAC层产生了不可见的错误计数。因此,除非协议明确要求,否则不要轻易移除CRC。
4. FIFO内存管理与队列控制:流量调度的大本营
优先级决定了数据包的“身份”,而FIFO(先进先出)队列则是它们等待调度的“候车室”。CPSW为每个端口配备了一个独立的FIFO内存,这是实现流量控制和调度的物理基础。
4.1 FIFO内存结构解析
每个端口的FIFO内存总大小为20,480字节(20KB),被划分为若干个1KB的“块”。这些内存块在接收和发送队列之间动态分配:
- 逻辑接收队列:1个,用于缓存从该端口进入交换机的数据包。
- 逻辑发送队列:8个(对应优先级0-7),用于缓存即将从该端口发送出去的数据包。
分配的关键在于两个寄存器字段:
TX_MAX_BLKS:在CPSW_PN_MAX_BLKS_REG中,定义分配给8个发送队列总和的内存块数。RX_MAX_BLKS:在同一个寄存器中,定义分配给接收队列的内存块数。
核心约束:TX_MAX_BLKS + RX_MAX_BLKS必须等于20。因为总内存就是20块。默认配置通常是TX_MAX_BLKS=16,RX_MAX_BLKS=4。这意味着80%的内存用于发送缓冲,20%用于接收缓冲。你可以根据端口的业务特性调整这个比例。例如,对于一个以上行接收为主的端口,可以适当增加RX_MAX_BLKS。
4.2 发送队列控制策略
8个发送优先级队列共享TX_MAX_BLKS所定义的总内存。CPSW允许通过权重或严格优先级(SP)算法来决定从哪个队列取包发送。配置通常涉及:
- 调度算法:选择是严格优先级(总是先发送高优先级队列的包,可能导致低优先级饿死)还是加权轮询(WRR)等更公平的算法。相关配置通常在队列调度寄存器中。
- 队列使能/禁用:可以禁用某个优先级的发送队列。
- 阻塞控制:
TX_HOST_BLKS_REM等字段用于监控FIFO剩余块数,防止主机发送的流量(尤其是尽力而为流量)占满FIFO,从而阻塞高优先级的速率受限流量。这是实现内部流量隔离的关键。
配置示例:假设我们为Port 1配置发送队列,希望优先级7和6用于关键控制流量,采用严格优先级;优先级5-0用于普通数据,采用加权轮询。
- 首先,通过
CPSW_P1_MAX_BLKS_REG设置发送和接收块分配(例如,TX=14, RX=6)。 - 然后,在队列调度寄存器中,将优先级7和6设置为严格优先级模式,并确保其权重最高(或设置为SP模式)。
- 接着,为优先级5-0配置合理的权重值(例如,基于业务流量比例)。
- 最后,使能
TX_HOST_BLKS_REM检查,并设置一个阈值(例如,4个块),当FIFO剩余块数低于此阈值时,暂停主机向低优先级队列注入新的普通数据包,为核心流量预留空间。
5. 高级流量控制机制:从速率限制到时间感知调度
基础的优先级队列解决了“谁先走”的问题,但对于需要精确带宽控制或严格时间同步的应用,还需要更高级的机制。
5.1 速率限制(流量整形)
速率限制是QoS的核心功能之一,用于确保某些流量不会超过承诺的带宽,或在网络空闲时能利用额外带宽。CPSW的速率限制分为接收侧(CPPI端口)和发送侧(以太网端口),概念类似。
核心概念:
- 承诺信息速率(CIR):保证提供的带宽。只要配置合理(未超额订阅),这部分流量总能被发送。
- 超额信息速率(EIR):在满足CIR且网络(或FIFO)有空闲资源时,可以尝试发送的额外带宽。
接收侧速率限制(CPPI Port 0): 每个接收通道(对应优先级0-7)都有独立的CPSW_P0_PRI_CIR_REG_y和CPSW_P0_PRI_EIR_REG_y寄存器。速率计算公式为:优先级速率 (Mbps) = [ (频率(MHz) * CIR寄存器值) / 32768 ] + [ (频率(MHz) * EIR寄存器值) / 32768 ]其中,频率是VBUSP_GCLK的时钟频率。例如,在350MHz时钟下,要为优先级7配置10Mbps的CIR(无EIR),计算CIR值 = (10 * 32768) / 350 ≈ 936。
关键配置规则与陷阱:
- 优先级固定:一旦有任何通道启用了速率限制,所有通道的优先级类型必须设置为“固定优先级”,不能再使用“轮询优先级”。这是硬件限制。
- 高低顺序:被速率限制的通道必须配置为最高的硬件优先级。例如,如果你要限制两个流,应使用优先级7和6,而不是7和0。
- 包含开销:配置的速率已经包含了12字节的帧间隔(IPG)和8字节的前导码。计算实际有效数据带宽时需要扣除这部分。
- EIR的前提:只有为某个优先级配置了非零的CIR,才能为其配置非零的EIR。EIR的发送受限于非速率限制流量的积压情况。
发送侧速率限制(以太网端口): 原理与接收侧完全对称,使用CPSW_NC_ETH_MAC_PN_PRI_CIR_REG_y和CPSW_NC_ETH_MAC_PN_PRI_EIR_REG_y寄存器。配置规则同上。
5.2 增强型计划流量(EST - IEEE 802.1Qbv)
这是用于实现时间敏感网络(TSN)中“时间感知整形器(TAS)”的关键硬件特性。EST允许你在一个周期性的时间窗口内,精确地调度哪些优先级的数据包可以在哪个时间片被发送,从而实现微秒级甚至纳秒级的确定性延迟。
EST工作原理简述:
- 时间循环:EST基于一个由CPTS模��生成的、周期性的时间间隔(例如125µs,对应8kHz的音频帧周期)。
- 获取命令:每个以太网端口有一个最多包含128条“获取命令”的RAM。每条命令包含:
- 获取计数(Fetch Count):14位,表示该命令生效的“线速时钟”周期数。
- 获取允许(Fetch Allow):8位(对应8个优先级),每一位指示在此时间片内,对应的优先级是否被允许开始传输一个新包。
- 调度执行:在每个时间循环开始时,硬件从命令RAM的地址0开始,依次执行这些获取命令。例如,命令0可能允许优先级7在开始的200个时钟周期内发送,命令1可能设置所有优先级为0(清空线路)50个时钟,命令2再允许优先级6发送150个时钟。
配置EST的核心步骤:
- 配置时间间隔:通过CPTS模块设置EST函数生成器的周期(
CPTS_RFT_CLK的倍数)。 - 规划调度表:根据你的实时流量周期和大小,计算并填充EST获取命令RAM。这是最复杂的部分,需要计算每个优先级流量的最大传输单元(MTU)所需的传输时间(考虑线速),并留出足够的“保护带”(零允许时间)来清空线路上前一个可能正在传输的包。
- 设置操作模式:选择单缓冲区(128条命令连续执行)或双缓冲区(两个64条命令的缓冲区,可在周期边界切换,用于动态更新调度表)。
- (可选)启用包填充:在“零允许”时间段内,允许发送非计划内的小包,以提高链路利用率。这需要精确配置
est_fill_margin等参数,确保填充包不会干扰下一个计划内包的准时发送。 - (可选)启用时间戳:通过设置
EST_TS_EN等位,可以让EST在发送计划内包时生成时间戳事件,用于软件监控和校准调度时序。
实战心得:配置EST是一项精密工程。强烈建议先从简单的、单优先级的计划开始,使用示波器或高精度时间戳来测量实际发送时间与理论时间的偏差。AM263P的CPTS模块和EST时间戳功能是调试的宝贵工具。常见的坑包括:低估了包传输时间(忘记算前导码和IPG)、保护带时间不足导致计划包被延迟、以及双缓冲区切换时机不对导致调度表更新错位。
6. 音频视频桥接(AVB)与相关协议概览
CPSW也支持音频视频桥接(AVB,现已发展为更广泛的TSN标准集)的相关特性。AVB旨在为实时音视频流提供有界低延迟和低抖动的网络传输保障。它不是一个单一功能,而是一套协议组合在硬件上的体现:
- IEEE 802.1AS(gPTP):精确时间协议。用于在整个桥接局域网中同步所有设备的时钟,达到亚微秒级精度。这是所有时间敏感应用的基础。CPSW的CPTS模块提供了硬件时间戳支持,是实现低同步误差的关键。
- IEEE 802.1Qav(信用整形器):转发与队列。它定义了一种“基于信用的整形(CBS)”算法,用于平滑发送队列中的流量,防止突发流量阻塞链路,从而为AV流提供有界的延迟。这与前面提到的EST(802.1Qbv)不同,Qav是工作在队列层面的流量整形,而Qbv是工作在时间门控层面的调度。
- IEEE 802.1Qat(SRP):流预留协议。类似于一个“资源预约”系统。音视频流(Talker)在发送前,会通过SRP协议沿着网络路径向交换机(Bridge)和接收端(Listener)申请预留必要的带宽资源。只有资源预留成功,流才会开始传输,确保了网络不会过载。
- IEEE 1722(AVBTP):层2传输协议。它定义了如何在以太网帧中封装时间敏感的音频/视频数据,并包含“呈现时间戳”,供接收端用于精准的播放同步。
在AM263P的CPSW中,对AVB的支持主要体现在:
- 通过CPTS硬件支持802.1AS时间戳。
- 通过优先级队列、速率限制和EST功能,为实现802.1Qav和Qbv提供了硬件基础。
- 软件需要实现上层的协议栈(如gPTP协议栈、SRP协议栈、1722封装/解封装)来与这些硬件特性配合,共同构建完整的AVB/TSN节点。
应用场景:当你需要设计一个车载音频系统、专业音频调音台、或工业视觉系统,其中多个设备需要通过以太网同步传输高质量的、低延迟的音频或视频流时,深入理解并配置CPSW的这些高级流量控制机制,就从“可能”变成了“必须”。它让你能够从硬件底层保障关键流量的性能,而不是仅仅依赖操作系统的软件队列,后者在高负载下会引入不可预测的延迟和抖动。
7. 常见问题与调试技巧实录
在实际开发和调试中,仅理解原理是不够的,快速定位和解决问题才是关键。以下是一些基于实战的常见问题与排查思路。
7.1 优先级映射不生效
- 现象:配置了DSCP或VLAN重映射,但数据包似乎仍按默认CPPI通道优先级处理。
- 排查步骤:
- 确认使能位:首先双检查
RX_REMAP_VLAN、DSCP_IPV4_EN、RX_REMAP_DSCP_V4等关键使能位是否确实已写入寄存器。使用调试器读取寄存器确认,而非仅看写入代码。 - 检查数据包格式:确认发送的数据包格式完全符合硬件检测条件。例如,对于DSCP映射,确保是标准的IPv4/IPv6包,且DSCP字段位于正确偏移量。使用Wireshark抓取原始报文进行验证。
- 验证映射表:如果使用DSCP映射,仔细核对
CPSW_PN_DSCP_PRI_MAP_REG的每一位。一个常见的错误是位序理解错误或数组索引与DSCP值对应关系搞错。 - 排查互斥配置:检查是否同时使能了发送优先级重映射(
CPSW_PN_TX_PRI_MAP_REG非默认值)。如果是,根据手册,这可能导致接收重映射失效。暂时将发送重映射恢复为默认值测试。 - 利用统计计数器:查看CPSW提供的基于优先级的接收/发送帧计数器。发送特定优先级的数据包,观察对应优先级的计数器是否增加。这是最直接的验证方法。
- 确认使能位:首先双检查
7.2 速率限制效果不符合预期
- 现象:配置了CIR/EIR,但实际流量速率远高于或低于设定值,或者EIR流量完全无法通过。
- 排查步骤:
- 计算寄存器值:重新核算根据时钟频率和期望速率计算出的CIR/EIR寄存器值。确保计算正确,特别注意时钟频率单位是MHz,速率单位是Mbps。使用公式:
寄存器值 = (目标速率(Mbps) * 32768) / 时钟频率(MHz)。 - 检查时钟源:确认
VBUSP_GCLK的实际运行频率与你的计算基准是否一致。有时时钟配置会因功耗模式改变。 - 验证优先级配置:确认被速率限制的优先级是否已配置为最高的硬件优先级(如7和6)。同时,确认在使能速率限制后,该端口的优先级类型已设置为“固定优先级”,而非“轮询”。
- 检查超额订阅:确保所有流向同一出口优先级的总CIR之和没有超过该端口该优先级的出口CIR配置。例如,Port 0和Port 1都有15%的流量发往Port 2的优先级3,那么Port 2优先级3的CIR至少应配置为30%以上(还需留有余量)。
- EIR不工作的可能原因:EIR流量只在所有非速率限制优先级队列为空时才会被调度。如果系统中有持续的尽力而为(BE)流量,EIR流量可能永远得不到机会。检查
TX_HOST_BLKS_REM的配置,确保为BE流量设置了合理的阻塞阈值,防止其占满队列。
- 计算寄存器值:重新核算根据时钟频率和期望速率计算出的CIR/EIR寄存器值。确保计算正确,特别注意时钟频率单位是MHz,速率单位是Mbps。使用公式:
7.3 EST调度出现时间漂移或计划包被延迟
- 现象:配置了EST调度表,但高优先级计划包未能准时发送,或者整个调度周期出现累积性偏移。
- 排查步骤:
- 校准时间基准:首先确保CPTS的时钟与EST函数生成器的时钟配置正确,并且与网络的gPTP主时钟(如果使用)同步。使用CPTS的时间戳输出功能,测量EST周期信号的实际间隔。
- 复核“零允许”时间:计划包之前的“零允许”(Fetch Allow全为0)时间段长度必须足够长,以清空线路上可能正在传输的最大尺寸的数据包。计算清空时间需考虑线速(千兆/百兆)和包的最大传输单元(MTU)。公式为:
清空时间 (时钟周期) = (包长(字节) * 8) / 线速(比特每时钟周期)。对于千兆模式,线速是1字节/时钟;对于百兆模式,是1 nibble(半字节)/时钟。务必为硬件处理延迟增加额外余量(通常建议额外增加几十个时钟周期)。 - 检查命令RAM边界:在双缓冲区模式下,确保在正确的时间点(一个周期结束后,下一个周期开始前)切换
EST_BUFSEL。过早或过晚切换会导致调度表更新不及时或错乱。监控EST_BUFACT状态位来确认当前活跃的缓冲区。 - 启用并分析时间戳:使能EST时间戳事件(
EST_TS_EN),并让软件记录计划包的实际发送时间。与理论时间对比,可以精确发现是哪个环节出现了延迟。是保护带不足?还是命令执行有偏差? - 隔离测试:在初始调试时,最好在相对空闲的网络环境下进行,排除其他流量干扰。可以先只调度一个优先级,发送固定大小的测试包,用示波器或高精度pcap工具观察发送波形,这是最直观的调试方式。
7.4 CRC错误或校验不一致
- 现象:对端设备报告CRC错误,或使用抓包工具发现CRC校验和不正确。
- 排查步骤:
- 明确路径:首先确定出错的数据包路径(主机到外部,外部到主机,外部到外部)。
- 检查CRC类型一致性:确认通信双方端口的
CRC_TYPE设置一致。如果一端生成标准CRC,另一端检查Castagnoli CRC,必然失败。对于主机端口,检查P0_TX_CRC_TYPE和P0_RX_PASS_CRC_ERR的配置。 - 检查CRC移除设置:如果对端期望收到带CRC的包,确保
P0_TX_CRC_REMOVE为0。如果协议栈希望自己处理CRC,则可以置1,但需确保双方理解一致。 - 检查缓冲区描述符:对于CPPI路径,检查接收和发送缓冲区描述符中的
CRC_TYPE位是否与数据包的实际CRC类型匹配。 - 使用环回测试:将芯片的某个以太网端口配置为内部环回模式,自发自收。这样可以排除外部链路和对方设备的问题,聚焦于CPSW自身的配置。