MPC8540 TSEC以太网控制器寄存器详解:从MAC配置到DMA数据收发
1. MPC8540 TSEC以太网控制器寄存器详解:从MAC配置到数据收发控制
在嵌入式网络开发,尤其是基于PowerPC架构的通信处理器设计中,以太网控制器是连接设备与外部世界的核心枢纽。飞思卡尔(现恩智浦)的MPC8540处理器集成的三速以太网控制器(TSEC)是一个功能强大的硬核IP,支持10M、100M和1000Mbps速率。很多工程师在拿到官方几百页的参考手册时,往往会被其中密密麻麻的寄存器描述所淹没,感觉无从下手。实际上,这些寄存器并非杂乱无章,它们紧密围绕着数据收发的完整生命周期进行组织。今天,我就结合自己多年在PowerQUICC III平台上的调试经验,带你深入TSEC的寄存器世界,不仅告诉你每个位是干什么的,更重点剖析它们在实际驱动编写和数据流控制中是如何协同工作的,以及那些手册里不会写的“坑”在哪里。
理解TSEC的寄存器,本质上是在理解一个高效DMA引擎如何与MAC层逻辑配合,完成从内存缓冲区到物理链路的无缝数据搬运。这个过程涉及初始化配置、发送调度、接收管理、错误处理以及性能调优等多个环节。我们将从最核心的MAC配置寄存器入手,逐步深入到发送和接收控制,最后讨论缓冲区描述符和高级功能,目标是让你看完后能独立完成一个稳定高效的TSEC驱动底层配置。
2. TSEC寄存器体系结构与设计哲学
在深入每个寄存器之前,我们必须先建立对TSEC整体寄存器地图的宏观认识。TSEC的寄存器并非随意排列,而是遵循清晰的功能模块划分,大致可以分为以下几个部分:
- 全局控制与状态寄存器:如DMACTRL(DMA控制)、IEVENT(中断事件)、IMASK(中断掩码),负责控制器的启停、中断的全局管理。
- 发送(Transmit)通路寄存器:管理数据包的发送流程,包括发送控制(TCTRL)、状态(TSTAT)、缓冲区描述符指针(TBPTR, TBASE)以及特殊的乱序缓冲区指针(OSTBDP)。
- 接收(Receive)通路寄存器:管理数据包的接收流程,包括接收控制(RCTRL)、状态(RSTAT)、缓冲区描述符指针(RBPTR, RBASE)以及接收缓冲区长度(MRBLR)。
- MAC层配置寄存器:这是实现802.3协议的关键,包括MACCFG1/2(MAC配置)、IPGIFG(帧间隔)、HAFDUP(半双工控制)、MAXFRM(最大帧长)等,直接决定了MAC的行为模式。
- MII管理接口寄存器:用于配置和控制外部的PHY芯片,包括MIIMCFG(配置)、MIIMCOM(命令)、MIIMADD(地址)、MIIMCON(控制数据)、MIIMSTAT(状态数据)等。
- 统计寄存器:记录收发帧数、各种错误计数等,用于网络监控和调试。
所有寄存器都是32位宽,通过内存映射方式访问。TSEC模块在系统内存中有两个主要的偏移基址,分别对应TSEC1和TSEC2(如果芯片支持多个TSEC实例)。例如,TSEC1的寄存器从0x2_4000开始,TSEC2的从0x2_5000开始,具体偏移量在手册中给出。
重要提示:访问这些寄存器时,必须注意对齐和访问大小。通常使用32位读写操作。在修改任何控制寄存器(尤其是使能位)前,确保相关的DMA通道已优雅停止(通过DMACTRL[GRS]/[GTS]),否则可能导致不可预知的行为或总线错误。
2.1 寄存器编程的核心思想:描述符链与DMA
TSEC数据收发的核心是缓冲区描述符(Buffer Descriptor, BD)。描述符是一个位于内存中的数据结构(通常为8字节),它包含了一个数据缓冲区的地址、长度和控制状态信息。TSEC的DMA引擎会自动遍历由这些描述符组成的链表,从缓冲区取数据发送,或将接收到的数据存入缓冲区。
寄存器在这里扮演了“指挥官”和“导航员”的角色:
- 基址寄存器(如TBASE, RBASE):告诉DMA引擎描述符链表的起始位置在哪里。这个地址必须是8字节对齐的。
- 当前指针寄存器(如TBPTR, RBPTR, CRBPTR):DMA引擎当前正在处理或刚刚处理完的描述符地址。软件可以通过读取它来了解DMA的进度。
- 控制寄存器(如TCTRL, RCTRL):发送“开始”、“停止”等命令,并配置过滤模式(如混杂模式)。
- 状态寄存器(如TSTAT, RSTAT):反映DMA引擎和MAC的当前状态,例如是否因为错误而停止(QHLT位)。
这种“软件准备描述符和缓冲区,硬件DMA自动搬运”的模式,极大地减轻了CPU的负担,是实现高性能网络吞吐的关键。我们的寄存器配置,很大程度上就是在为这套自动化流水线设置正确的规则和参数。
3. MAC层配置寄存器深度解析
MAC配置寄存器决定了控制器如何与网络协议交互,是TSEC正常工作的基石。配置错误可能导致帧格式错误、无法链接或性能低下。
3.1 MAC配置寄存器1(MACCFG1):功能模块开关
MACCFG1(偏移量:TSEC10x2_4500, TSEC20x2_5500)是一个功能强大的总开关。
- Soft_Reset (Bit 0):软件复位位。写1会使MAC内部所有模块复位。这是一个需要谨慎操作的位。通常只在驱动初始化时使用一次。写入后,需要等待数个时钟周期再将其清零,并重新配置其他MAC寄存器。手册中强调,在设置或清除使能位(Rx_EN, Tx_EN)前,应使用DMACTRL的优雅停止位,而非直接使用Soft_Reset。
- Reset Rx/Tx MC/Fun (Bits 12-15):这四位用于分别复位接收MAC控制块、发送MAC控制块、接收功能块和发送功能块。这比全局Soft_Reset更精细,可用于调试或重新初始化特定模块,而不影响其他部分。例如,当流控制逻辑出现异常时,可以尝试单独复位接收MAC控制块。
- Loop Back (Bit 23):回环模式。置1后,MAC发送器的输出直接连接到接收器的输入。这是硬件自检和驱动调试的利器。你可以不连接外部PHY和网线,就能测试整个MAC和数据路径是否正常。在初始化调试阶段,先开启回环模式测试基本收发功能,可以快速隔离物理层问题。
- Rx_Flow / Tx_Flow (Bits 26-27):流控制使能位。分别控制接收方向是否处理PAUSE帧,以及发送方向是否允许发出PAUSE帧。在全双工千兆以太网中,流控制对于防止缓冲区溢出至关重要。通常需要同时使能。
- Rx_EN / Tx_EN (Bits 29, 31):接收和发送使能位。这是数据流的总闸门。关键操作顺序:在使能前,必须确保相应的描述符链表和缓冲区已正确设置(TBASE/RBASE已写入)。在禁用前,必须先设置DMACTRL[GRS](优雅停止接收)或[GTS](优雅停止发送),并等待IEVENT中对应的中断标志置位,确认DMA已完全停止,然后才能清除Rx_EN/Tx_EN。直接清除使能位可能导致DMA访问非法内存。
3.2 MAC配置寄存器2(MACCFG2):帧处理策略
MACCFG2(偏移量:0x2_4504/0x2_5504)控制帧的格式处理和操作模式。
- Preamble Length (Bits 16-19):前导码长度,默认7字节。除非有特殊兼容性需求,否则不要修改。前导码用于同步时钟,长度为0不受支持。
- I/F Mode (Bits 22-23):接口模式。这是最容易配置错误的地方之一。
01:Nibble模式,用于标准MII接口(10/100Mbps)。10:Byte模式,用于GMII或TBI接口(1000Mbps)。- 必须根据实际硬件连接的PHY类型和当前速率准确设置。如果千兆PHY配置成了MII模式,数据根本无法正确收发。
- Huge Frame (Bit 26):巨帧使能。置1后允许收发超过标准以太网最大帧长(1518字节,不含VLAN)的帧,用于Jumbo Frame。需要与MAXFRM寄存器配合使用。如果使能,必须确保网络中的所有设备都支持巨帧,否则会导致帧被丢弃。
- Length check (Bit 27):长度字段检查。使能后,MAC会检查帧头中的长度/类型字段是否与实际数据长度匹配。对于IP等使用类型字段的帧,此检查可能不适用,通常保持禁用(0)。
- PAD/CRC 与 CRC EN (Bits 29-30):这两个位共同控制帧的填充和CRC生成/校验,是发送路径的关键配置。
- 场景1:CPU提供完整帧(含CRC):
PAD/CRC=0,CRC EN=0。MAC直接发送缓冲区中的数据,不进行任何修改。这是最高效的模式,但要求上层协议栈或驱动保证帧格式正确(短帧已填充至64字节,并计算好了CRC)。 - 场景2:CPU提供原始数据,MAC负责填充和加CRC:
PAD/CRC=1。MAC会自动将短于64字节的帧填充至该长度,然后计算并附加CRC。这是最常用的模式,简化了驱动开发。 - 场景3:CPU提供原始数据,MAC只加CRC(不填充):
PAD/CRC=0,CRC EN=1。MAC仅计算并附加CRC,不进行填充。适用于已知数据长度大于等于最小帧长的场景。 - 注意:如果
PAD/CRC=1,则CRC EN被忽略。接收路径的CRC校验是自动进行的,与这些配置位无关。
- 场景1:CPU提供完整帧(含CRC):
3.3 半双工控制寄存器(HAFDUP)与碰撞处理
HAFDUP(偏移量:0x2_450C/0x2_550C)专门用于配置半双工模式下的CSMA/CD行为。在全双工模式下,此寄存器大部分设置无效。
- Retransmission Maximum (Bits 16-19):最大重传次数。默认15次,符合802.3标准。在噪声较大的环境中,可以适当减小此值,以避免一个坏包过长时间占用信道。例如,设置为7,则在7次碰撞后即丢弃该帧。
- Collision Window (Bits 26-31):碰撞窗口(时隙时间)。这个值定义了帧发送开始后,在多长时间内可能检测到碰撞。默认值0x37(55字节时间)。它需要根据网络的最大往返延时来设置。在较大的网络(如多中继器)中,可能需要增大此值,以确保远端发生的碰撞能在窗口期内被检测到。设置过小会导致迟来碰撞(Late Collision),被视为错误,且不会重传。
- Alt BEB 与 Alternate BEB Truncation (Bits 8-12):替代二进制指数退避。标准BEB在10次碰撞后,退避窗口上限固定在1023个时隙。此功能允许你自定义一个更早的截断点(如7),使得站在多次碰撞后表现得“更具侵略性”。在特定竞争激烈的网络环境中,调整此参数可以优化吞吐,但属于非标准行为,需确保网络内设备行为兼容。
- Excess Defer (Bit 15):过度延迟。如果信道一直繁忙,导致一个帧的发送被过度延迟,标准规定应丢弃此帧。将此位置1可以允许发送,但可能违反标准。
实操心得:半双工调试:在现代网络中,全双工已占绝对主流。但如果你调试的是一个旧的半双工网络设备(如某些工业HUB),HAFDUP的配置就至关重要。首先确保
MACCFG2[Full Duplex]=0。然后,重点观察碰撞和延迟错误计数。如果IEVENT中频繁出现LC(迟来碰撞)标志,尝试逐步增大Collision Window值。如果吞吐量极低且重传计数高,可以尝试启用Alt BEB并设置一个较小的Alternate BEB Truncation值(如5或6),观察性能是否改善。这些调整本质上是权衡公平性和效率。
4. 发送与接收控制寄存器实战
MAC配置好比制定了交通规则,而发送(TCTRL)和接收(RCTRL)控制寄存器则是路口红绿灯的控制器,直接指挥每一个数据包的放行与检查。
4.1 发送控制寄存器(TCTRL)与状态寄存器(TSTAT)
虽然输入材料中未详细列出TCTRL/TSTAT,但其逻辑与接收侧类似。TCTRL通常包含发送使能、帧间隔调整等控制位。TSTAT则反映发送队列状态,例如THLT(发送暂停)位,当发送描述符用尽或遇到错误时,此位会被置位,DMA停止。软件需要检查错误原因(如IEVENT中的TXE、XB、LC等),处理完毕后,清除错误并重新设置TBPTR指向一个有效的空闲描述符,最后清除TSTAT[THLT]来重启发送队列。
4.2 接收控制寄存器(RCTRL):过滤与模式设置
RCTRL(偏移量:0x2_4300/0x2_5300)是接收路径的“安检规则”。
- PROM (Bit 28):混杂模式。置1后,TSEC将接收所有经过物理链路的帧(除了PAUSE帧),无论其目的MAC地址是否与本机匹配。这是网络抓包和协议分析的基础。在调试阶段,开启混杂模式可以确认物理链路是否通畅,数据是否到达MAC层。在生产代码中,除非是网桥或监控设备,否则应关闭此模式以降低CPU负载。
- BC_REJ (Bit 27):广播帧拒绝。置1后,目的地址为全FF的广播帧将被拒绝,除非
PROM模式同时开启。在安全的网络环境中,可以启用此功能来减少不必要的广播流量处理。但请注意,许多网络协议(如ARP、DHCP)依赖广播,启用前需确认应用兼容性。 - RSF (Bit 29):短帧接收模式。标准以太网帧(不含前导码和SFD)最小为64字节。置1后,MAC可以接收短于此长度的帧,但前提是帧的目的地址必须匹配(即DA命中)。这个功能主要用于接收某些特定协议的控制帧或残帧。在普通IP通信中应关闭,以避免处理错误帧。
4.3 接收状态寄存器(RSTAT)与队列恢复
RSTAT(偏移量:0x2_4304/0x2_5304)中最重要的位是QHLT(队列暂停,Bit 8)。
- 何时置位:当接收DMA在处理包时遇到严重错误,例如系统总线错误(
IEVENT[EBERR]),或者读取到一个RxBD但其Empty位为0(即软件未及时释放缓冲区,DMA无可用描述符)时,RSTAT[QHLT]会被硬件自动置1。 - 后果:一旦
QHLT=1,该接收队列的所有活动将停止,当前帧及后续指向该队列的帧都会被丢弃。网络接收功能完全中断。 - 如何恢复:
- 诊断:首先读取
IEVENT寄存器,检查是EBERR(总线错误)还是BSY(忙超时)等错误标志被置位。总线错误需要检查内存访问地址和权限。 - 清理:处理错误原因。如果是描述符用尽,则需要检查并补充可用的接收描述符到链表中。
- 重启:向
RSTAT寄存器的QHLT位写入1(注意,是写1清零,这是一种常见的“写1清0”或“写1恢复”逻辑),即可重新使能接收队列。
- 诊断:首先读取
避坑指南:QHLT死锁:这是驱动开发中最常见的陷阱之一。如果驱动中接收中断服务程序(ISR)处理太慢,或者软件未能及时回收并重置描述符,导致DMA用完了所有描述符,就会触发
QHLT。如果ISR中没有包含恢复QHLT的逻辑,接收功能将永久挂起。最佳实践:在接收ISR中,除了处理数据,最后一定要检查并清除RSTAT[QHLT]位。可以将其作为ISR的固定收尾步骤。
4.4 接收缓冲区长度寄存器(MRBLR)与对齐
MRBLR(偏移量:0x2_430C/0x2_530C)定义了每个接收缓冲区的大小。
- MRBL (Bits 16-25):最大接收缓冲区长度。此值必须是64的倍数。低6位(Bit 0-15和26-31)必须为0。例如,如果你想设置缓冲区为2048字节,应写入
(2048 « 16),即0x0800 0000。 - 为什么必须是64的倍数?这与TSEC内部DMA的突发传输效率和对齐要求有关。违反此规则可能导致不可预测的行为或性能下降。
- 缓冲区分配:驱动中分配的内存缓冲区,其大小���须至少等于
MRBL设置的值。TSEC保证写入的字节数不会超过MRBL,但可能更少(例如收到短帧)。因此,缓冲区宁大勿小。
5. 缓冲区描述符与指针寄存器:DMA引擎的导航系统
这是TSEC高效运作的核心。描述符(BD)是软件和硬件之间的契约,指针寄存器则是硬件DMA的“眼睛”。
5.1 发送描述符指针与乱序缓冲区(OSTBDP)
发送描述符通常通过TBASE(基址)和TBPTR(当前指针)管理。一个特殊的寄存器是乱序发送数据缓冲区指针寄存器(OSTBDP)。
- 作用:当使能了发送校验和卸载(Checksum Offload)或VLAN标签插入等高级功能时,TSEC可能需要修改帧头。修改操作可能在DMA开始传输数据后才进行。
OSTBDP和OSTBD寄存器一起,为这种“乱序”修改提供了一个临时的数据缓冲区指针和描述符。 - 工作原理:当需要修改帧头时,TSEC会将原始帧头数据复制到
OSTBDP指向的缓冲区,修改后再发送。这保证了DMA引擎能连续、高效地传输主体数据,而不会因等待头处理而停顿。 - 配置要点:
- 在初始化时,需要为
OSTBDP分配一个小的、对齐的内存缓冲区(例如64字节)。 - 将缓冲区物理地址写入
OSTBDP寄存器。 - 在发送使能前,确保该区域已被清零(手册要求)。
- 如果不使用校验和卸载等高级功能,可以忽略此寄存器,但为了安全起见,最好也将其指向一个有效内存并清零。
- 在初始化时,需要为
5.2 接收描述符基址与指针(RBASE, RBPTR, CRBPTR)
接收侧有三个关键指针寄存器:
- RBASE:软件写入的接收描述符环形队列的起始地址。必须8字节对齐(即地址低3位为0)。驱动初始化时,将分配好的描述符数组首地址写入此寄存器。
- RBPTR:DMA内部使用的指针,指向下一个将要被使用的描述符。当TSEC需要一个新的缓冲区来存放接收到的帧时,它会读取
RBPTR指向的描述符,使用后根据描述符大小(8字节)自动递增RBPTR。当RBPTR到达队列末尾时,硬件会自动绕回(Wrap)到RBASE(如果描述符的Wrap位被设置)。 - CRBPTR:指向当前正在处理或刚刚处理完的描述符。软件在中断服务程序中,可以通过读取
CRBPTR来快速定位哪些描述符已经被数据填充(Empty位由硬件清零),进而处理数据。
驱动中的典型工作流:
- 初始化:分配N个接收描述符,组成一个环,每个描述符指向一个数据缓冲区。将所有描述符的
Empty位置1,Wrap位仅在最后一个描述符置1。将环的首地址写入RBASE。 - 接收中断:进入ISR后,软件从“软件维护的当前处理指针”开始,遍历描述符,检查
Empty位是否为0(表示有数据)。 - 数据处理:对于
Empty=0的描述符,读取数据长度,从对应缓冲区取出数据包进行处理。 - 描述符回收:处理完数据后,将该描述符的
Empty位置1,并更新缓冲区指针(如果需要重用缓冲区)。然后更新软件的维护指针。 - 队列恢复:检查
RSTAT[QHLT],若置位则清除之。 - 关键点:硬件(
RBPTR)和软件维护的指针是异步的。硬件RBPTR总是指向下一个可用的空描述符。软件需要处理所有Empty=0的描述符,直到遇到一个Empty=1的描述符(表示硬件还没用到它)。必须确保在硬件追上软件之前(即硬件RBPTR即将指向一个尚未被软件回收的描述符),软件已经回收并重置了该描述符,否则会导致QHLT。
6. 高级功能与性能调优寄存器
6.1 接收中断聚合寄存器(RXIC)
在高流量场景下,每个数据包都产生一个中断会给CPU带来巨大负担。中断聚合(Interrupt Coalescing)功能可以将多个事件合并为一个中断,显著降低中断频率。
- ICEN (Bit 0):中断聚合使能。
- ICFCT (Bits 3-10):帧数阈值。当接收的帧数量达到此阈值时,触发一个中断。有效值1-255。设置为1等同于禁用聚合。如何设置:这需要在低延迟和高吞吐之间权衡。对于实时性要求高的应用(如音视频流),设置较小的值(如2-4)。对于后台大数据传输,可以设置较大的值(如32-64)。
- ICTT (Bits 16-31):定时器阈值。单位是64个TSEC接口时钟周期。如果在帧数阈值达到之前,定时器超时了,也会触发一个中断。这确保了即使流量很小,数据包也不会在DMA缓冲区中停留过久。设置建议:通常设置为一个能容忍的最大延迟。例如,如果希望每秒至少处理一次中断,假设TSEC时钟为125MHz,则
ICTT = (125e6 / 64) / 1 ≈ 1.95e6,远超出16位范围,所以需要根据实际时钟和延迟需求计算。
性能调优实战:假设我们有一个日志服务器,对延迟不敏感,但希望最大化吞吐。TSEC接口时钟为125MHz。我们可以这样配置:
ICEN=1,ICFCT=64(每64个帧一个中断),ICTT = (125e6 / 64) * 0.001 = 1953(约1ms超时)。这样,在高负载时,每64个包产生一次中断;在低负载时,最多等待1ms,数据就会被处理。这比每包一中断的模式,能将中断频率降低几十到上百倍。
6.2 帧间隔寄存器(IPGIFG)
IPGIFG控制帧与帧之间的时间间隔,对于流量整形和网络兼容性很重要。
- Back-to-Back Inter-Packet-Gap (Bits 25-31):背靠背包间隔。全双工模式下,以及半双工模式下连续发送多个包时使用的间隔。默认96比特时间(0x60)。一般无需修改,除非需要与某些对间隔有特殊要求的旧设备兼容。
- Non-Back-to-Back Inter-Packet-Gap, Part 1/2 (Bits 1-7, 9-15):非背靠背包间隔,分为两部分。这是半双工CSMA/CD机制的一部分。
IPGR1是载波侦听窗口,IPGR2是剩余的IPG时间。默认IPGR1=64,IPGR2=96,遵循“2/3 - 1/3”规则,即在IPG的前2/3时间内侦听到载波会延迟,后1/3则忽略载波直接发送,以保证公平性。通常不需要修改。 - Minimum IFG Enforcement (Bits 16-23):最小帧间隔强制。如果接收到的帧与前帧的间隔小于此值,该帧会被丢弃。默认80比特时间。这可以过滤掉一些非法的、间隔过短的帧,增强鲁棒性。
6.3 MII管理接口寄存器(MIIMCFG, MIIMCOM)
TSEC通过MIIM接口管理外部PHY芯片。虽然硬件上只有TSEC1能驱动MDC/MDIO线,但每个TSEC都有自己的一套MIIM寄存器,用于访问其直连的PHY。
- Mgmt Clock Select (Bits 29-31):管理时钟分频选择。MDC时钟由核心总线时钟分频得到。必须根据PHY芯片的数据手册要求来设置。标准IEEE 802.3规定MDC时钟不能超过2.5MHz。例如,如果核心总线时钟为100MHz,选择分频因子28(
111b),则MDC约为100MHz / 8 / 28 ≈ 446kHz,是安全的。过高的MDC时钟可能导致PHY通信失败。 - No Pre (Bit 27):前导码抑制。如果确认PHY支持前导码抑制(通过读取PHY的扩展寄存器),可以将此位置1,将MIIM帧从64个时钟周期缩短到32个,提升管理接口效率。
- Scan Cycle (MIIMCOM Bit 29):扫描周期使能。置位后,TSEC会自动、连续地读取指定PHY寄存器(通常是状态寄存器)。这对于监控链路状态变化非常高效,软件无需轮询,只需在MIIMSTAT寄存器数据有效时读取即可。在驱动中,通常上电初始化PHY后,就开启对PHY状态寄存器(如Reg 1)的扫描,以便及时检测链路通断。
7. 寄存器编程常见问题与调试技巧
7.1 初始化序列:避免硬件处于未知状态
一个健壮的TSEC驱动初始化序列至关重要,错误的顺序可能导致控制器无法工作或行为异常。
- 全局复位:可选,通过DMACTRL或MACCFG1的Soft_Reset进行。
- 停止DMA:确保DMACTRL[GRS]和[GTS]被设置,等待IEVENT[GRSC]和[GTSC]置位。
- 配置MAC:设置MACCFG1、MACCFG2、IPGIFG、HAFDUP、MAXFRM等。注意,在MACCFG1中使能Rx_EN/Tx_EN之前,不要设置这些细节配置。
- 配置MII:设置MIIMCFG(时钟分频),然后通过MIIMCOM/MIIMADD/MIIMCON读写PHY寄存器,配置PHY工作模式(速度、双工、自协商等)。
- 设置缓冲区描述符:在内存中初始化TxBD和RxBD环,确保所有描述符的
Empty位(RxBD)或Ready位(TxBD)状态正确。将环的基址写入TBASE和RBASE。 - 配置DMA参数:设置MRBLR(接收缓冲区大小)。
- 使能中断:配置IMASK寄存器,开启所需的中断源(如RXF, TXF, EBERR等)。
- 启动接收:设置RCTRL(如混杂模式等),然后设置MACCFG1[Rx_EN] = 1。
- 启动发送:设置MACCFG1[Tx_EN] = 1。
- 启动DMA:清除DMACTRL[GRS]和[GTS],让DMA引擎开始工作。
7.2 中断服务程序(ISR)处理要点
- 读取并保存IEVENT:第一时间读取IEVENT值并保存到局部变量,然后立即向IEVENT写入相同的值以清除中断标志(写1清0)。
- 判断中断源:根据保存的IEVENT值,判断是接收中断(RXF)、发送中断(TXF)、错误中断(EBERR, LC等)还是优雅停止完成中断(GRSC, GTSC)。
- 处理接收:遍历RxBD环,处理所有数据已就绪(
Empty=0)的描述符。处理完后,必须将描述符的Empty位置1,并更新缓冲区指针(如果需要)。最后,务必检查并清除RSTAT[QHLT]。 - 处理发送:遍历TxBD环,回收所有发送完成(
Ready=0)的描述符,释放或重用其数据缓冲区。 - 处理错误:对于错误中断,需要根据具体错误位进行相应处理(如记录日志、复位队列等),这是系统稳定性的关键。
7.3 调试技巧:利用寄存器状态诊断问题
- 链路不通:检查MIIMSTAT寄存器,读取PHY的状态寄存器,确认链路是否已建立(Link Up),自协商是否完成。检查MACCFG2的I/F Mode是否与PHY速率匹配。
- 能发不能收,或能收不能发:检查MACCFG1的Rx_EN/Tx_EN是否已使能。检查对应的
TSTAT或RSTAT寄存器,看THLT或QHLT是否被置位。检查IEVENT是否有错误标志。 - 数据错乱或CRC错误:首先在回环模式(MACCFG1[Loop Back]=1)下测试,如果回环正常,则问题可能在PHY或外部链路上。如果回环也有问题,检查缓冲区地址和长度在描述符中设置是否正确,内存缓存一致性操作(如
dcbst,icbi)是否执行到位。 - 性能低下:检查是否因中断过于频繁导致CPU负载高。考虑调整RXIC寄存器进行中断聚合。检查描述符环大小是否足够,环太小会导致频繁的
QHLT/THLT。对于发送,可以尝试调整IPGIFG寄存器(非标准情况)。对于半双工,观察碰撞计数,考虑调整HAFDUP中的退避参数。
理解并熟练运用MPC8540 TSEC的寄存器,是解锁其强大网络性能的钥匙。这个过程需要结合理论、手册和大量的实践调试。记住,寄存器配置没有一成不变的“最佳值”,都需要根据具体的应用场景、网络环境和性能需求进行细调。最好的学习方法就是动手写一个简单的驱动,从回环测试开始,逐步添加功能,并用逻辑分析仪或调试器观察关键寄存器的变化,你会在解决一个个具体问题的过程中,对这些寄存器的理解越来越深刻。
