MPC857T/857DSL通信处理器:双核架构与通信外设实战解析
1. 项目概述:为什么MPC857T/857DSL是通信系统的“瑞士军刀”
在嵌入式网络设备开发领域,尤其是面对xDSL、电缆调制解调器、接入路由器这类需要同时处理多种网络协议和高速数据流的设备时,工程师们常常面临一个核心矛盾:既要一颗强大的通用CPU来运行复杂的操作系统和应用,又需要一系列专用、高效的通信外设来处理以太网、ATM、HDLC等协议。早期的解决方案要么是“通用CPU+一堆分立芯片”,导致PCB面积大、功耗高、软件协调复杂;要么是性能捉襟见肘,无法满足高吞吐量需求。
MPC857T/857DSL的出现,正是为了解决这个矛盾。它不是一颗简单的微控制器,而是一个高度集成的“片上系统”(SoC),更准确地说,是一个“集成通信控制器”。其核心价值在于,它将一个成熟的32位PowerPC架构处理器(MPC8xx核心)与一个功能强大的通信处理器模块(CPM)无缝整合在单颗芯片上。这种双处理器架构的精妙之处在于分工:通用CPU(核心)专心处理路由表计算、协议栈上层、用户界面等复杂任务;而专用的CPM则像一位高效的“通信协处理器”,接管了所有通信接口的数据搬运、协议封装/解封装等耗时且重复性高的工作,两者通过高速内部总线和共享内存协同工作。
我接触过不少基于MPC860系列的老项目,升级到MPC857T/857DSL时,最直观的感受就是“清爽”。以前需要外接的以太网MAC、多个UART控制器、甚至部分ATM处理逻辑,现在都集成进去了。尤其是它对ATM的增强支持(ESAR模式)和内置的快速以太网控制器(FEC),让设计DSLAM用户端设备或小型接入网关变得非常直接。这颗芯片就像为通信领域量身定做的“瑞士军刀”,该有的工具一应俱全。接下来,我们就从里到外,拆解这把“军刀”的每一个部件,看看它如何在实际项目中发挥威力。
2. 核心架构深度解析:双引擎如何协同工作
理解MPC857T/857DSL,绝不能把它看成是CPU加一堆外设的简单拼凑。它的高性能源于其精密的“双核”架构设计,这里的“双核”并非指两个对称的通用CPU核心,而是指嵌入式MPC8xx核心与通信处理器模块(CPM)的异构协同。这种架构是摩托罗拉(后飞思卡尔)PowerQUICC系列的精髓。
2.1 大脑:嵌入式MPC8xx核心
MPC8xx核心是一个完全兼容PowerPC用户指令集架构(UISA)的32位RISC处理器。虽然以今天的标准看,其主频(最高100MHz)和缓存(4KB指令+4KB数据)不算高,但在当时的通信处理器领域,其设计非常务实高效。
- 整数单元与加载/存储单元:所有整数运算和内存访问操作都由硬件直接执行,确保了指令执行的高效性。32个通用寄存器(GPRs)为编译器优化提供了充足的空间。
- 内存管理单元(MMU):这是运行像VxWorks、Linux这类现代嵌入式操作系统的关键。它提供32项全关联的TLB,支持4KB、16KB、512KB和8MB多种页面大小。在实际开发中,合理的MMU配置(如将频繁访问的外设寄存器地址空间设置为缓存禁用、写穿透)能极大提升系统实时性和确定性。
- 缓存设计:4KB指令缓存为4路组相联,4KB数据缓存为2路组相联,均采用LRU替换算法。一个关键细节是,数据缓存支持按页配置为写回或写穿透模式。对于映射到内存控制器的外设寄存器区域,我们必须设置为“缓存禁用”或“写穿透”,以确保CPU对外设的写操作能立即生效,而不是滞留在缓存里。误配置此选项是很多驱动调试中“寄存器写入无效”问题的根源。
- 调试接口:内置的8个硬件比较器(4个指令地址、2个数据地址、2个数据值)支持条件断点,这对于在没有昂贵仿真器的条件下进行复杂实时软件的调试至关重要。你可以设置当程序访问某个特定内存地址(比如一个队列指针)或该地址的数据等于某个特定值时触发断点。
实操心得:缓存配置陷阱在板级支持包(BSP)或早期启动代码中配置MMU时,一定要仔细规划内存映射。通常,我们会将SDRAM区域设置为“缓存使能、写回”以获得最佳性能;将CPM的双端口RAM、各个通信控制器的寄存器区域设置为“缓存禁用”。对于MPC857T/857DSL,其内部外设寄存器通常映射在0xF0000000开始的地址空间,务必在MMU页表项中将其属性标记为
CI(Cache Inhibit)和W(Write-Through)。
2.2 专职通信引擎:通信处理器模块(CPM)
CPM是这颗芯片的灵魂所在,它本身就是一个基于RISC的微控制器,但指令集专门为通信任务优化。它独立于主CPU运行,通过内部总线与核心和系统接口单元(SIU)交互。
- CPM RISC控制器:它运行来自芯片内部ROM或双端口RAM的微码,处理通信相关的底层任务,如缓冲区描述符(BD)处理、协议自动机、CRC计算等。主CPU只需要配置好参数并下达命令,具体的数据搬移和协议处理就交给CPM,极大解放了主CPU的负担。
- 双端口RAM(8KB):这是核心与CPM之间共享数据的关键桥梁。主CPU将待发送的数据缓冲区描述符(BD)列表放在这里,CPM读取并处理;反之,CPM将接收到的数据BD更新后放在这里,通知主CPU。其双端口特性允许两边同时访问,效率很高。
- 串行DMA(SDMA)通道:这是CPM高效性的直接体现。MPC857T有10个,MPC857DSL有8个。每个SCC、SMC、SPI、I2C通道都配有专用的SDMA通道。这意味着当以太网口在持续收发数据包时,UART(SMC)也在通过自己的DMA通道收发数据,彼此互不阻塞,实现了真正的并行通信处理。
- 独立DMA通道:除了串行DMA,CPM还提供两个通用的BDMA通道,可用于内存到内存、内存到外设(如PCMCIA)的高速数据传输,进一步分担主CPU的负载。
双引擎协同工作流程示例(以太网数据接收):
- 主CPU初始化以太网控制器(SCC1配置为以太网模式),并在双端口RAM中设置好一系列空的接收缓冲区描述符(Rx BD)。
- CPM的RISC控制器和SCC1的SDMA通道开始工作,监听网络。
- 数据包到达后,SCC1的MAC层进行地址过滤和CRC校验,然后通过SDMA将数据直接存入主CPU预设的缓冲区(在SDRAM中)。
- SDMA更新对应的Rx BD状态位(如
R置位,E清零),并可选地触发一个中断到CPM或主CPU。 - 主CPU轮询或通过中断获知数据包就绪,从描述符中获取数据包长度和位置,进行上层协议(如IP、TCP)处理。
- 处理完毕后,主CPU重置该BD,将其重新链接到接收队列,供CPM下次使用。
整个过程,主CPU仅在配置初始化和处理协议栈时介入,繁重的数据搬运和链路层处理均由CPM完成,系统效率自然大幅提升。
3. 关键通信外设与接口实战指南
MPC857T/857DSL集成了丰富的通信外设,理解并正确配置它们是项目成功的关键。我们挑几个最常用和最具特色的来讲。
3.1 快速以太网控制器(FEC)与SCC1
虽然芯片有一个SCC(串行通信控制器)可以配置为以太网模式,但MPC857T/857DSL还集成了一个独立的快速以太网控制器(FEC)。这里有一个重要区别:
- SCC1以太网:这是传统的SCC模块配置成的10Mbps以太网控制器,功能完备。
- 快速以太网控制器(FEC):这是一个独立的、支持10/100Mbps的以太网MAC控制器,性能更强。它最大的特点是支持与UTOPIA接口复用引脚,实现同时工作。
配置选择建议:
- 如果项目只需要一个以太网口,且对速率要求是10/100Mbps,优先使用FEC。它的性能更优,驱动也更标准(很多操作系统BSP都直接支持)。
- 如果项目需要多个以太网口(MPC857T只有一个FEC),那么可以将SCC1也配置为以太网模式,但注意SCC1只支持10Mbps。
- 如果项目同时需要ATM(UTOPIA)和以太网,那么使用FEC与UTOPIA复用的方案是最佳选择,可以节省引脚。
FEC驱动初始化关键步骤:
- 时钟与引脚复用配置:首先在SIU的引脚控制寄存器中,将相关引脚配置为FEC功能(而非GPIO或其他功能)。配置FEC的时钟源和速率。
- MII接口配置:FEC通过MII接口连接外部PHY芯片。需要配置MII管理接口(MDIO/MDC)的时钟频率,并通过MDIO读取PHY ID,配置PHY的工作模式(速度、双工、自协商等)。
- 初始化描述符环:这是核心。为发送和接收分别初始化一个缓冲区描述符环(通常是多个BD组成的链表)。每个BD指向SDRAM中的一个实际数据缓冲区,并包含状态和控制信息。
// 伪代码示例:初始化一个发送BD typedef struct buffer_descriptor { uint16_t status; // 状态位:R(就绪)、L(最后)、TC(发送CRC)... uint16_t length; // 数据长度 uint8_t *buffer; // 指向数据缓冲区的指针 struct buffer_descriptor *next; // 指向下一个BD的指针 } BD_t; BD_t tx_bd_ring[NUM_TX_BD]; for(int i=0; i<NUM_TX_BD; i++) { tx_bd_ring[i].status = 0; // 初始状态为空闲 tx_bd_ring[i].buffer = &tx_buffer[i][0]; tx_bd_ring[i].next = &tx_bd_ring[(i+1) % NUM_TX_BD]; } FEC->TX_DESC_BASE = (uint32_t)&tx_bd_ring[0]; // 告诉FEC发送环的起始地址 - 配置FEC寄存器:设置接收/发送控制寄存器(如使能接收、设置混杂模式等)、中断掩码、MAC地址等。
- 启动:使能FEC的发送和接收引擎。之后,CPM和FEC便会自动处理数据包的收发。
3.2 ATM与UTOPIA接口解析
对于需要处理ATM信元的设备(如DSLAM线卡、IAD),MPC857T/857DSL的ATM功能是其王牌。它基于MPC860SAR,但增加了“增强型SAR”(ESAR)模式。
- UTOPIA接口:这是连接ATM物理层芯片(PHY)的标准接口。MPC857T支持UTOPIA Level 2多PHY主/从模式,MPC857DSL支持Level 2最多4个PHY(仅主模式)。Level 2相比Level 1增加了地址相位,可以寻址多个PHY。配置时需要注意时钟极性、数据有效信号极性等,必须与对端PHY芯片严格匹配。
- ESAR模式增强功能:
- OAM支持:便于进行ATM层的操作、管理和维护。
- 端口到端口交换:无需外部RAM和微码,芯片内部即可实现ATM信元在不同UTOPIA端口间的快速交换,这对于构建小型ATM交换机核心非常有用。
- AAL2/VBR支持:AAL2常用于语音等可变比特率业务,其支持被固化在ROM中,节省了开发时间。
- 配置流程简述:
- 配置SIU,将相关引脚设置为UTOPIA功能。
- 配置CPM的SCC1为“ATM模式”(注意,这与以太网模式是互斥的)。
- 配置UTOPIA接口参数:时钟速率、主/从模式、Level 1/2、收发FIFO深度等。
- 配置ATM参数:VPI/VCI表、流量整形参数(PCR, SCR等)。
- 初始化ATM接收和发送的BD环,过程与以太网类似,但BD的结构和状态位含义是针对ATM信元设计的(固定53字节长度)。
- 使能ATM控制器和UTOPIA接口。
3.3 多协议串行通道:SCC与SMC
除了以太网和ATM,SCC和SMC提供了极大的灵活性。
- SCC(串行通信控制器):这是一个高度可编程的串行接口,通过加载不同的微码,可以支持众多协议。在MPC857T上,SCC1可以配置为:
- HDLC/SDLC:广域网链路经典协议,用于路由器串行口。
- UART:通用异步串口,但通常我们用SMC来实现UART。
- 同步UART/透明传输:用于某些专有工业协议。
- 在MPC857DSL上,SCC1仅支持以太网模式,这是一个重要的型号区别。
- SMC(串行管理通道):这是一个更轻量级的串行控制器,主要用于:
- UART:这是SMC最常用的模式。MPC857T有两个SMC,MPC857DSL只有一个(SMC1)。对于调试串口(Console)、管理串口,强烈建议使用SMC而非SCC,因为它更简单,占用CPM资源更少。
- 透明传输:用于传输原始比特流。
- GCI控制器:用于ISDN S/T接口。
SMC配置为UART的要点:
- 选择SMC1或SMC2,并配置对应的引脚为SMC功能。
- 为该SMC分配一个波特率发生器(BRG)。芯片有4个独立的BRG,可以灵活分配给SCC或SMC。计算BRG分频值:
BRG Divisor = (系统时钟频率 / (16 * 期望波特率)) - 1。 - 在CPM参数RAM中设置SMC的协议特定参数块(SMC基址),配置为UART模式。
- 初始化SMC的发送和接收BD环。
- 配置SMC模式寄存器(设置字符长度、停止位、奇偶校验等)。
- 使能SMC的发送器和接收器。
3.4 其他实用外设
- 时间槽分配器(TSA):仅MPC857T具备。这是一个强大的硬件时分复用(TDM)总线控制器。它可以从一个同步串行流(如E1/T1线路)中,提取或插入特定的时隙,并将其路由到指定的SCC或SMC通道。这对于实现数字中继接口、E1/T1链路捆绑等功能至关重要。配置TSA需要理解帧结构、时钟同步和时隙映射表。
- SPI与I2C:这两个常用的同步串行总线用于连接外部的EEPROM、传感器、ADC/DAC、其他控制器等。它们的驱动实现相对标准,注意配置时钟极性和相位(对于SPI)以及从机地址(对于I2C)。
- PCMCIA接口:用于扩展存储卡或网卡。MPC857T支持两个插座,857DSL支持一个。使用时需要配置属性内存、通用内存和I/O空间的访问时序,这部分配置较为复杂,需要仔细对照PCMCIA卡的数据手册。
4. 系统设计与内存控制器配置
一颗芯片能否稳定高效运行,系统级设计,尤其是内存子系统的配置,是基础中的基础。
4.1 内存控制器(SIU部分)
MPC857T/857DSL的内存控制器支持8个独立的存储块(Bank),每个Bank可以独立配置为各种类型的存储器接口。
支持的存储器类型:
- DRAM(SDRAM/EDO/Page Mode):这是主程序运行和数据存储的区域。控制器支持CAS Latency、行预充电时间等关键时序的编程。
- SRAM/Flash/ROM:用于存储Bootloader、不常更改的代码或数据。可以通过配置作为启动存储块(Boot Bank)。
- 外部外设:通过配置为GPCM(通用片选)模式,可以连接FPGA、ASIC或其他慢速设备。
Bank配置关键参数(以SDRAM为例):
- 基地址(BR[BA])与地址掩码(OR[AM]):这两个寄存器共同决定Bank的地址范围。
OR[AM]掩码决定了Bank的大小。例如,要配置一个64MB的Bank(0x0000_0000 - 0x03FF_FFFF),OR[AM]需要设置为0xFC00_0000(掩码掉低26位地址,2^26 = 64MB)。 - 存储器类型(BR[MS]):设置为SDRAM模式。
- 时序参数(在特定SDRAM控制寄存器中设置):
- 行预充电时间(TRP):从预充电命令到激活命令的延迟。
- 行到列延迟(TRCD):从激活命令到读/写命令的延迟。
- CAS延迟(CL):从读命令到数据输出的延迟。
- 写恢复时间(TWR)、**行周期时间(TRC)**等。 这些参数必须严格匹配你所使用的SDRAM芯片的数据手册。一个常见的错误是时序设置过于激进,导致系统在低温或电压波动时不稳定。
- 刷新控制:配置刷新间隔(根据SDRAM芯片的刷新周期要求计算),使能自动刷新。
避坑指南:SDRAM初始化序列上电后,SDRAM必须经过一个严格的初始化序列才能使用,这个序列通常由Bootloader完成:
- 提供稳定时钟(至少200us)。
- 发送预充电所有Bank命令。
- 发送多个(通常8个)自动刷新命令。
- 设置模式寄存器(MR),配置CAS延迟、突发长度、突发类型等。
- 再次发送预充电命令,然后进入正常操作模式。 MPC857T/857DSL的内存控制器在硬件上支持部分序列,但通常需要在启动代码中通过写特定的寄存器地址来触发这些命令。务必参考官方参考手册的示例代码。
4.2 时钟与电源管理
芯片的时钟由外部晶振输入,经过锁相环(PLL)倍频后产生系统核心时钟(CCLK)和各种外设时钟。PLL的配置(倍频系数、分频系数)必须在系统启动早期完成,且配置期间系统会不稳定,代码必须从本地缓存或SRAM中运行。
电源管理提供了多种模式以适应不同功耗场景:
- 全速模式:所有单元全速运行。
- 打盹模式:核心功能单元关闭,但CPM处于低功耗待机,可以快速唤醒。适合CPU空闲但需要监听网络事件的场景。
- 睡眠/深度睡眠:关闭更多单元,唤醒时间更长。
- 低功耗停止:功耗最低,仅保持最基本逻辑,唤醒相当于一次软复位。
使用建议:在操作系统(如Linux)中,可以通过CPU Idle驱动和CPM驱动协同工作,在系统空闲时自动进入低功耗模式。需要仔细评估唤醒延迟是否满足应用需求。
5. 开发环境搭建与启动流程
5.1 硬件设计要点
- 电源与滤波:芯片需要3.3V核心电压和I/O电压。模拟PLL电源引脚(AVDD)必须使用干净的电源,并紧靠芯片引脚放置滤波电容(通常0.1uF和10uF组合),这是系统时钟稳定的关键。
- 复位电路:需要保证上电复位和手动复位信号满足最小脉宽要求。复位期间,配置引脚(如
MODCK1,MODCK2)的电平状态决定了芯片的启动模式(从哪个Bank启动、时钟初始模式等)。 - 调试接口:务必引出JTAG接口(TCK, TMS, TDI, TDO, TRST)。这是连接仿真器(如Lauterbach Trace32)进行底层调试和程序烧写的唯一途径。
- SDRAM布线:这是高速信号,必须作为总线处理。等长控制(特别是时钟与数据选通信号DQS)、阻抗匹配、参考平面完整至关重要。建议参考官方评估板的布线。
5.2 软件启动流程(Bootloader视角)
系统上电后,CPU从复位向量(默认在Boot Bank的0xFFF00100)开始执行。典型的Bootloader(如U-Boot)启动流程如下:
汇编启动阶段:
- 设置机器状态(MSR),禁用中断和缓存。
- 配置栈指针。
- 配置PLL,将系统时钟提升到工作频率。此时代码在Flash中运行,速度慢,配置过程需谨慎。
- 配置内存控制器,初始化SDRAM。这是将代码从Flash搬运到SDRAM运行的前提。
- 执行代码搬运:将Bootloader的后续部分(通常是C语言代码)从Flash复制到SDRAM的指定地址。
- 清空BSS段。
- 跳转到SDRAM中的C语言入口函数。
C语言初始化阶段:
- 初始化更复杂的外设:串口(用于打印调试信息)、以太网(用于网络引导)、CPM等。
- 初始化MMU,建立虚实地址映射,启用缓存。
- 检测内存大小、存储设备。
- 根据环境变量或用户输入,决定是进入命令行交互,还是直接加载并启动操作系统内核(如Linux)。
向内核传递参数:对于Linux,Bootloader需要准备好ATAGs或Device Tree Blob(DTB),并将内核启动地址、ramdisk地址、命令行参数等通过寄存器(r0-r2)传递给内核。
5.3 驱动开发注意事项
- 寄存器访问:所有外设寄存器都是内存映射的。访问时要注意字节序(PowerPC是大端序)。对于可能被CPM和CPU同时访问的寄存器(如CPM的双端口RAM中的BD),要使用适当的同步机制(如关中断、内存屏障指令
eieio)。 - 中断处理:中断源众多(外部IRQ、内部定时器、CPM各通道等)。需要正确初始化中断控制器,编写中断服务程序(ISR)。在ISR中,要快速判断中断源、清除中断标志、进行必要的处理,然后返回。避免在ISR中进行耗时操作,可以通过任务队列或信号量通知主任务处理。
- BD环操作:这是CPM编程的核心。务必理解BD中每个状态位的含义(如
R-就绪,E-空,W-回绕,L-最后一个缓冲区)。操作BD环时,要确保CPU和CPM的访问不会冲突。通常的规则是:CPU初始化BD环,CPM消费(发送)或生产(接收)BD;CPU在检查状态并处理完数据后,必须将BD重新置为“空”或“就绪”状态,并确保E或R位被正确设置,CPM才能继续使用它。
6. 常见问题排查与调试技巧
在实际项目中,踩坑是难免的。以下是一些基于经验的常见问题及排查思路:
问题1:系统上电后毫无反应,JTAG也连不上。
- 排查:
- 电源和复位:首先用万用表和示波器检查所有电源引脚电压是否稳定在3.3V,复位引脚在上电后是否从低电平跳变到高电平。
- 时钟:用示波器测量外部晶振引脚是否有波形,幅度和频率是否正确。检查PLL滤波电容是否焊接良好。
- 启动模式:检查
MODCK[1:2]等启动配置引脚的上拉/下拉电阻是否正确,是否与设计的启动设备(如Flash)匹配。 - Flash连接:检查Boot Bank的Flash芯片片选、读写使能、地址数据线连接是否正确。尝试读取Flash的ID,看是否能识别。
问题2:SDRAM初始化失败,系统在启动阶段卡住。
- 排查:
- 时序参数:这是最常见的原因。逐一核对内存控制器中配置的
TRP、TRCD、CL、TWR、TRC等参数,是否与SDRAM芯片数据手册的最小值要求一致(通常要留有一定余量)。可以尝试放宽时序。 - 布线质量:用示波器测量SDRAM时钟线和数据选通(DQS)信号的质量,看是否有过冲、振铃或边沿过于缓慢。检查地址/控制信号的等长是否在要求范围内。
- 初始化序列:确认Bootloader中的SDRAM初始化序列完整且正确,特别是预充电和自动刷新命令的次数。
- 时序参数:这是最常见的原因。逐一核对内存控制器中配置的
问题3:以太网(FEC)无法链接或丢包严重。
- 排查:
- PHY芯片:首先确认PHY芯片本身是否正常工作(是否有链接指示灯)。通过MDIO接口读取PHY的状态寄存器,确认链接状态、速度、双工模式。
- MII接口:检查TXD、RXD、TX_EN、RX_DV、TX_CLK、RX_CLK这几组信号线连接是否正确,有无短路/断路。用示波器看TX_CLK和RX_CLK是否有时钟。
- BD环配置:检查发送和接收BD环的初始化是否正确,
next指针是否形成了闭环。确认缓冲区地址是物理地址(在启用MMU前)或正确的虚拟地址(在启用MMU后)。 - 中断与轮询:确认FEC的中断是否使能,中断服务程序是否正确清除中断标志。或者,如果使用轮询方式,轮询频率是否足够高。
- 缓冲区对齐:确保数据缓冲区在内存中是缓存行对齐的(通常是32字节边界)。未对齐的访问在某些配置下会导致数���一致性问题。
问题4:串口(SMC UART)只能发送不能接收,或接收乱码。
- 排查:
- 波特率:计算BRG分频值的公式是否正确?系统时钟频率是否准确?可以用示波器测量串口TX引脚,计算实际输出的波特率。
- 引脚复用:确认使用的SMC引脚是否已正确配置为UART功能,而非GPIO。
- 流控:如果硬件流控(RTS/CTS)被意外使能,但电路未连接,会导致无法接收。检查SMC模式寄存器中流控的设置。
- BD环:接收BD环是否已正确初始化并激活(
E位被清除)?CPM只有在找到E=0的BD时才会将数据存入。
问题5:系统运行一段时间后死机。
- 排查:
- 看门狗:检查是否开启了软件看门狗(SIU中的SWT)。如果开启了,主程序必须在超时前定期“喂狗”。
- 栈溢出:在启动文件中分配的栈空间是否足够?可以在栈顶和栈底放置魔数(如
0xDEADBEEF),定期检查是否被改写。 - 内存越界:检查是否有数组越界、指针错误访问了非法内存区域。可以使用MMU的内存保护功能,将未使用的地址空间设置为禁止访问,一旦访问即触发异常。
- 中断风暴:某个中断源被持续触发,而中断服务程序未能有效清除中断标志,导致CPU不断进入中断,无法执行主程序。用调试器查看中断控制器的状态寄存器。
- 散热与电源:长时间运行后芯片温度是否过高?电源电压是否下降?这些硬件问题也会导致不稳定。
调试这类高度集成的芯片,一个强大的仿真器(如Trace32)和熟练使用示波器、逻辑分析仪是必不可少的。同时,养成在代码关键路径添加日志、在内存中设置调试环缓冲区的习惯,能在问题发生时提供第一手线索。MPC857T/857DSL虽然是一颗有些年头的芯片,但其设计经典,资料丰富,一旦掌握了其架构精髓和调试方法,构建稳定可靠的通信系统便有了坚实的基础。
