1. MPC8560 SPI与I2C控制器嵌入式通信的基石在嵌入式系统开发尤其是网络通信和工业控制领域飞思卡尔现恩智浦的PowerQUICC III系列处理器如MPC8560一直是中高端应用的主力。这类处理器集成了强大的通信处理模块CPM其中SPI和I2C控制器是连接外部传感器、存储器、显示模块等众多外设的“咽喉要道”。很多工程师在初次接触其驱动开发时往往会被手册中大量的寄存器、参数RAM和缓冲区描述符BD表搞得晕头转向。配置不当轻则通信不稳定数据丢包重则系统死锁调试起来犹如大海捞针。我经历过不少这样的项目从早期的摸索到后来的驾轻就熟深刻体会到理解并正确配置SPI/I2C的参数RAM与BD表是让这些通信接口稳定、高效跑起来的关键。这不仅仅是照着手册填几个十六进制数那么简单你需要真正理解每个参数背后的设计意图、数据在内存中的流动路径以及CPM通信处理器与核心CPU是如何协同工作的。本文将结合MPC8560的参考手册为你彻底拆解SPI和I2C控制器的配置精髓特别是参数RAM和BD表的编程细节并分享那些手册上不会写的实战经验和避坑指南。2. 核心架构与设计思路拆解2.1 CPM与核心CPU的分工协作MPC8560的通信子系统设计非常经典其核心思想是卸载。核心PowerPC e500 CPU负责高层的协议栈和应用程序逻辑而繁重的、周期性的通信数据搬移工作则交给独立的CPM模块。CPM内部集成了多个通信控制器如SPI、I2C、UART、以太网等和一个SDMA串行DMA引擎。关键点在于当SPI或I2C需要收发数据时并不是由CPU通过软件循环去读写数据寄存器。而是由CPM内的控制器配合SDMA通道直接通过参数RAM中配置的BD表在双端口RAMDPRAM或外部内存中存取数据缓冲区。数据搬移完成后CPM通过中断或轮询方式通知CPU。这种设计极大地解放了CPU使其能够并行处理其他任务特别适合需要高吞吐量或低延迟通信的场景。因此我们的配置工作本质上是在为CPM和SDMA引擎“铺路”。参数RAM定义了通信的“规则”如缓冲区长度、数据总线而BD表则指明了数据的“仓库地址”和“搬运状态”。CPU初始化好这些“路标”后启动传输剩下的就交给硬件自动完成了。2.2 参数RAM通信控制器的“配置中心”参数RAM是CPM为每个通信控制器分配的一块专用内存区域用于存放该控制器的运行时参数。对于SPI和I2C控制器这块区域在系统内存中有固定的基址偏移例如SPI参数RAM的指针存放在CCSRBAR 0x89FC。我们需要在控制器使能前将必要的参数写入这块区域。为什么需要参数RAM而不是一堆独立的寄存器这主要是为了灵活性和效率。将一系列相关的控制参数集中存放在连续的内存中便于CPM的微码microcode快速、批量地访问和更新。同时这也为不同通信模式如不同的BD表结构提供了统一的配置模型。初始化时机至关重要手册反复强调参数RAM中的关键字段如RBASE, TBASE, MRBLR, RFCR/TFCR必须在控制器使能SPMODE[EN]或I2MOD[EN]置位之前由用户即我们的驱动代码完成初始化。一旦控制器开始运行大部分参数就不应再被修改除非先禁用控制器。随意在运行时修改活跃控制器的参数RAM是导致通信异常甚至CPM锁死的常见原因。2.3 缓冲区描述符BD表数据流的“调度清单”BD表是CPM架构的精髓所在它实现了链式缓冲区管理。你可以把它想象成一个任务队列。每个缓冲区描述符BD是一个数据结构描述了一个数据缓冲区一块内存的状态和信息。对于接收RxCPU准备一系列空缓冲区并用RxBD描述它们告诉CPM“数据来了请放到这里”。CPM接收数据填满一个缓冲区后更新对应BD的状态位如将E位清零然后自动跳转到下一个BD指向的缓冲区继续接收形成一个接收环。对于发送TxCPU准备一系列装满待发送数据的缓冲区并用TxBD描述它们告诉CPM“请把这些数据发出去”。CPM发送完一个缓冲区的数据后更新对应BD的状态位如将R位清零然后自动处理下一个BD形成一个发送环。BD表的“环”结构通过设置BD中的WrapW位可以指定某个BD是环表的最后一个。当CPM处理完这个BD后会自动跳回由RBASE或TBASE指向的环表头部从而实现循环利用无需CPU频繁干预重新初始化。这种设计完美适配了持续流式数据的收发。核心协作流程CPU初始化参数RAM和BD表。CPU设置控制器的命令寄存器如SPCOM[STR]或I2COM[STR]启动传输。CPM控制器与SDMA协作根据当前BD指针RBPTR/TBPTR找到BD再根据BD中的缓冲区指针找到数据内存进行DMA操作。数据搬运完成或达到特定条件如缓冲区满、遇到BD[L]标志CPM更新BD状态位并可能产生中断。CPU响应中断或轮询BD状态处理已满的接收缓冲区或准备新的发送缓冲区然后重新“武装”对应的BD对RxBD置E对TxBD置R将其交还给CPM。3. SPI控制器参数RAM与BD表深度解析3.1 SPI参数RAM关键字段详解SPI参数RAM的映射表是配置的蓝图。我们逐项分析那些必须由用户初始化的关键字段1. RBASE / TBASE (偏移 0x00 / 0x02):这是Rx和Tx BD表在双端口RAM中的基地址。它告诉SPI控制器“你的Rx/Tx任务清单从这里开始找”。注意RBASE和TBASE的值必须是8的倍数即地址低3位为0。这是为了满足CPM内部的内存对齐要求违反此规则可能导致不可预知的行为。在分配内存时务必使用对齐的内存分配函数如memalign(8, size)。2. RFCR / TFCR (偏移 0x04 / 0x05):功能代码寄存器。它定义了SDMA通道访问外部内存时的总线事务属性。对于大多数嵌入式应用系统内存和本地总线可能具有不同的访问特性。GBL位位2全局访问内存窥探使能。在多核或带有缓存一致性的系统中如果SPI DMA的目标缓冲区会被多个CPU核心共享或需要缓存一致性维护则需要置位此位。在简单的单核或无一致性要求的系统中可以禁用。BO位位3-4字节序。必须根据你的CPU架构和内存数据布局来设置。MPC8560是PowerPC架构默认大端Big-Endian。如果你的应用软件或外设期望小端数据则需要在这里或后续数据处理中进行转换。设置为01表示大端。DTB位位6数据总线指示器。0表示SDMA使用系统总线1表示使用本地总线。这取决于你的硬件设计中将SPI数据缓冲区放在哪类总线的内存上。需要查阅板级硬件手册来确定。设置错误会导致DMA访问错误地址或触发总线错误。一个常见的配置值0x10二进制0001_0000解读GBL0禁用窥探BO01大端DTB0使用系统总线。这适用于缓冲区位于系统内存SDRAM且无需缓存一致性的典型场景。3. MRBLR (偏移 0x06):最大接收缓冲区长度。这是SPI接收端一个非常重要的约束。作用它定义了CPM在一次接收操作中向一个Rx缓冲区最多写入的字节数。CPM可以写入少于MRBLR的字节例如遇到帧结束或错误但绝不会超过。对驱动的影响你为每个RxBD分配的缓冲区内存必须至少等于MRBLR。如果你分配了256字节的缓冲区但MRBLR设置为512那么当接收数据超过256字节时CPM会写入越界导致内存损坏这是极其危险的。动态修改手册指出MRBLR可以在SPI运行时修改但必须在一个16位总线周期内完成即原子操作。修改将在CPM切换到下一个RxBD时生效。为了精确控制最佳实践是在SPI接收器禁用时修改MRBLR。数据位宽如果SPI通信的字符长度超过8位例如16位数据MRBLR应设置为偶数以确保对齐。4. RBPTR / TBPTR (偏移 0x10 / 0x20):Rx/Tx BD指针。这些指针由CPM维护指向当前正在处理或下一个将要处理的BD。绝大多数应用不应直接修改它们。在初始化或复位后CPM会自动将其设置为RBASE/TBASE。只有在非常特殊的情况下比如你想在运行时手动跳转BD表通常不推荐才需要在控制器禁用时修改它们。3.2 SPI缓冲区描述符BD的配置艺术每个BD长度为8字节64位包含状态控制、数据长度和缓冲区指针三部分。SPI接收BDRxBD关键位解析E (Empty, 位0)核心状态位。1表示缓冲区为空CPM“拥有”此BD可以往里填充数据。0表示缓冲区已满或接收因错误停止CPU可以读取数据。驱动流程初始化时CPU将所有RxBD的E位置1交给CPM。CPM填满一个缓冲区后将其E位清0并可能产生中断。CPU中断服务程序ISR处理数据后必须再次将该BD的E位置1并将其重新链接到BD环中通常通过更新下一个BD的地址或利用环结构CPM才能再次使用它。W (Wrap, 位2)1表示此BD是BD环表中的最后一个。处理完此BD后CPM会将BD指针重置为RBASE对于Rx或TBASE对于Tx。这是形成环状队列的关键。I (Interrupt, 位3)中断使能位。1表示当此BD被关闭即缓冲区满时触发SPIE[RXB]中断事件。根据实际需求选择是否每个缓冲区都产生中断。高吞吐量场景下可能每几个缓冲区产生一次中断以减少CPU开销。L (Last, 位4)仅用于从机模式。当SPI配置为从机且片选信号SPISEL被取消断言时CPM会设置此位表示当前缓冲区包含消息的最后一个字符。这对于处理不定长数据包很有用。CM (Continuous Mode, 位6)仅用于主机模式。连续模式。1是一个强大但需谨慎使用的功能。在此模式下CPM在关闭此BD后不会清除E位。这意味着同一个缓冲区会被反复覆盖使用。这适用于主机连续扫描一个ADC从设备等场景可以实现“零CPU开销”的数据采集。使用时务必确保你的应用程序能及时处理数据否则新数据会覆盖旧数据。SPI发送BDTxBD关键位解析R (Ready, 位0)核心状态位。1表示缓冲区已准备就绪数据可以被发送。CPM发送完该缓冲区后会清除R位除非CM位被设置。驱动流程CPU准备好数据并设置好TxBD其他字段后最后将R位置1提交发送任务。CPM发送完毕后在ISR中CPU需要重新填充数据并再次置R位以发送下一帧。L (Last, 位4)对于发送此位由CPU设置。1告诉CPM这个缓冲区包含要发送消息的最后一个字符。发送完此缓冲区后CPM会停止并等待新的STR命令。如果不设置LCPM在发送完当前缓冲区后会继续处理环中的下一个TxBD。CM (Continuous Mode, 位6)仅用于主机模式。1表示连续发送模式。CPM发送完此BD后不会清除R位允许自动重新发送同一个缓冲区。适用于需要持续发送相同数据如测试信号的场景。数据长度与缓冲区指针数据长度偏移2对于TxBD这里填写要发送的字节数。对于超过8位的字符长度必须是字符数乘以每个字符的字节数例如3个16位字符长度应为6。缓冲区指针偏移4指向数据缓冲区的物理地址。对于RxBD地址必须是偶数对齐。对于TxBD如果字符长度≤8位可以是任意地址如果8位则必须是偶数地址。3.3 SPI主从模式配置实例与实操要点手册给出了主从模式的编程示例序列但我们需要理解每一步的深层含义。主机模式初始化序列深度解读配置端口D将相应引脚功能复能为SPI信号SPIMISO, SPIMOSI, SPICLK, SPISEL。这一步高度依赖具体的板级设计需参考硬件原理图和引脚复用表。配置SPI参数RAM指针向地址0x89FC写入参数RAM在内存中的基地址。这建立了CCSR空间到参数RAM的链接。设置RBASE/TBASE假设我们在DPRAM起始处分配了1个RxBD和1个TxBD。每个BD 8字节所以RxBD在0x0000TxBD在0x0008。因此RBASE0x0000,TBASE0x0008。务必计算好偏移避免BD表重叠或越界。设置RFCR/TFCR示例中使用0x10即我们之前分析的标准配置。设置MRBLR示例为16字节 (0x0010)。这意味着每个Rx缓冲区至少需要16字节。初始化RxBD状态控制字0xB000二进制 1011 0000 0000 0000E1 (空CPM可写入)W0 (非环尾)I1 (缓冲区满时产生中断)L0 (非最后)CM0 (非连续模式)数据长度初始化为0x0000CPM接收后会更新为实际长度。缓冲区指针指向主存地址0x0000_1000。初始化TxBD状态控制字0xB800二进制 1011 1000 0000 0000R1 (就绪可发送)W0I1 (发送完成后产生中断)L1 (这是关键表示发送完这5个字节后停止)CM0数据长度0x0005(5字节)。缓冲区指针指向0x0000_2000其中应已存放5字节待发送数据。执行初始化命令向CPCR写入0x2541_0000发送INIT RX AND TX PARAMETERS命令。这个命令会重置参数RAM和内部状态到默认值必须在所有参数配置完成后、使能控制器前执行。配置中断清除SPIE设置SPIM以启用所需中断。配置SPMODE并启动0x0370使能主机模式、SPI、8位字符等。最后设置SPCOM[STR]启动传输。关键实操心得顺序是铁律参数RAM配置 - BD表初始化 - 发送CPM初始化命令 - 使能中断 - 设置工作模式 - 启动传输。这个顺序不能乱尤其不能在控制器使能后随意修改RBASE/TBASE或BD内容。中断处理在中断服务程序中首要任务是读取SPIE寄存器确定中断源RXB, TXB, TXE等并及时清除相应标志位。然后处理对应的BD对于RxBD读取数据后置E位对于TxBD如果需要发送新数据填充缓冲区后置R位。最后执行rfi返回。从机模式注意从机模式的配置与主机非常相似主要区别在于SPMODE中设置为从机模式且其时钟由外部主机提供。特别需要注意的是在从机模式下传输的启动和停止完全由主机控制通过SPISEL信号。从机的SPCOM[STR]更像是一个“使能准备接收”的信号。手册示例中提到如果主机只发送了3字节就取消SPISELRxBD会关闭因为L位可能被设置或缓冲区未满但传输终止TxBD可能仍处于打开状态这需要驱动程序根据SPIE的事件标志进行妥善处理。4. I2C控制器配置要点与多主通信考量4.1 I2C参数配置与BD表应用I2C控制器也使用BD表机制其概念与SPI类似但细节有所不同。I2C的参数配置相对简单主要通过几个寄存器控制。I2C模式寄存器I2MOD关键位EN (位7)I2C控制器使能位。必须在配置完所有参数后再置位。PDIV (位4-6)预分频器。与BRGCLK一起决定I2C的SCL时钟频率。计算公式需要参考手册的BRG章节。时钟配置是I2C稳定的基础频率过高可能导致通信失败。FLT (位4)时钟滤波。在电气噪声较大的环境中建议置位以过滤SCL线上的毛刺增强抗干扰能力。GCD (位3)通用呼叫禁止。如果设备不需要响应广播地址可以置位以忽略通用呼叫减少不必要的处理。REVD (位2)数据反转。强烈建议保持为0默认即MSB先发送以确保与绝大多数I2C设备兼容。I2C的BD表使用其BD结构状态、长度、指针与SPI类似但状态位的含义针对I2C协议做了调整。例如在发送BDTxBD中L位表示发送完此缓冲区后是否产生停止条件。配置流程同样是设置参数RAM指针、初始化RBASE/TBASE、配置RFCR/TFCR、初始化BD、发送初始化命令、配置I2C模式、启动传输。4.2 主从读写操作流程解析I2C的通信流程比SPI更复杂因为它包含了地址帧、读写位、应答位等。主机写操作Master Write主机准备TxBD第一个数据字节必须是7位从机地址 写位R/W0。主机设置I2COM[STR]启动传输。主机产生START条件发送地址帧写位。从机应答ACK后主机继续发送数据字节每个字节后从机都应答。传输结束主机产生STOP条件。如果从机在某字节后不应答NACK主机会提前终止并产生STOP。主机读操作Master Read 这是容易出错的地方。主机读操作需要两个阶段“伪写”阶段主机首先发起一个写操作发送从机地址读位R/W1。这实际上是一个“读请求”。这个操作占用一个TxBD数据内容就是地址帧。真正读阶段从机应答地址后主从角色在数据线上反转。主机变为接收器从机变为发送器。主机需要预先准备好RxBD来接收数据。主机在接收完最后一个字节后回应一个NACK然后产生STOP条件。因此在代码实现中一次完整的读操作通常需要一个TxBD用于发送地址读命令和至少一个RxBD用于接收数据。手册示例中提到Tx缓冲区大小为n1字节其中第一个字节是地址后n个字节是“占位符”因为实际上主机在第二阶段并不发送这些数据但CPM的流程需要它们来维持时序。4.3 多主通信与实战避坑指南I2C支持多主但这引入了总线仲裁和冲突问题。MPC8560的I2C控制器在硬件上支持仲裁但软件上必须谨慎处理。核心问题角色冲突。假设MPC8560作为主机A正准备读取从机X的数据。它配置好了TxBD发送读地址和RxBD准备接收。与此同时外部主机B也想向MPC8560此时作为从机写入数据。两者几乎同时发起传输总线仲裁发生。情景1MPC8560的主机请求赢得仲裁。通信正常进行MPC8560读取从机X的数据并产生I2CER[RXB]中断。软件在中断中处理接收到的数据来自X。情景2外部主机B赢得仲裁。MPC8560的主机请求失败其控制器会检测到仲裁丢失并可能产生中断。但同时MPC8560作为从机收到了主机B发来的地址帧恰好是MPC8560自己的I2C地址它会应答并准备接收数据。这也会触发I2CER[RXB]中断。问题来了在情景2的中断服务程序中如果你不加以判断可能会误以为接收到的数据是你之前请求的从机X的数据从而发生数据错乱。避坑策略中断源甄别在I2C中断服务程序中不能只看RXB事件。必须检查I2CER寄存器的所有位特别是TXE传输错误、AL仲裁丢失等标志。如果检测到仲裁丢失那么本次RXB很可能是由作为从机接收数据触发的而非之前主机读操作的响应。软件协议层握手这是更可靠的方案。在许多I2C设备应用中读操作并非简单的“地址读”。而是先进行一次短的写操作告诉从机要读哪个寄存器地址然后再发起读操作。这种“写-读”组合本身就需要软件进行两次独立的I2C传输序列管理自然就能区分不同阶段的数据。MPC8560的驱动应当支持这种分段操作。超时机制I2C协议本身没有硬件超时。如果从机设备故障一直拉低SCL总线会挂死。必须在软件驱动中实现超时监控。可以在启动传输后启动一个定时器如果在预期时间内未完成未收到中断则进行总线恢复操作如模拟发送几个时钟脉冲。环回测试Loopback这是一个宝贵的调试功能。将I2C控制器设置为主机模式并向自己的从机地址I2ADD寄存器中设置发送数据。主机发送的数据会被自己的接收器收到。这可以在不连接外部设备的情况下完整地测试整个I2C驱动栈BD表处理、中断响应、数据通路是否正常极大地方便了驱动开发的前期验证。5. 常见问题排查与调试技巧实录即使严格按照手册配置在实际项目中依然会遇到各种问题。以下是我总结的一些典型故障场景和排查思路。5.1 SPI通信故障排查现象可能原因排查步骤与解决方案完全无数据收发1. 时钟或引脚复用未正确配置。2. 控制器未使能SPMODE[EN]0。3. 参数RAM指针0x89FC未设置或设置错误。4. BD表的E位Rx或R位Tx未正确设置。1. 使用示波器或逻辑分析仪检查SPICLK、SPIMOSI、SPIMISO、SPISEL引脚是否有信号。确认端口配置寄存器设置正确。2. 检查SPMODE寄存器确认EN位已置1。3. 检查CCSRBAR0x89FC处的值确认它指向正确初始化的参数RAM区域。4. 在调试器中查看BD表内存确认第一个RxBD的E位为1第一个TxBD的R位为1如果准备发送。只能发送不能接收或反之1. RBASE或TBASE配置错误指向了非法内存或彼此重叠。2. RFCR/TFCR配置错误导致SDMA访问缓冲区失败。3. MRBLR设置大于实际分配的Rx缓冲区大小。1. 检查RBASE/TBASE值确保它们指向DPRAM内有效的、对齐的地址且两个BD表区域没有重叠。2. 检查RFCR/TFCR的DTB位确认与缓冲区所在的内存总线类型一致系统总线/本地总线。3. 核对MRBLR和每个RxBD缓冲区指针所指向的内存块大小。确保缓冲区长度 MRBLR。数据错位或字节序错误1. RFCR/TFCR中的BO字节序位设置与数据格式不匹配。2. 数据位宽如16位与MRBLR/Data Length的奇偶性不匹配。3. 从设备与MPC8560的时钟相位(CPHA)和极性(CPOL)不匹配。1. 确认BO位设置。大端PowerPC通常设为01。如果外设是小端可能需要软件进行字节交换。2. 对于超过8位的字符确保MRBLR和TxBD数据长度为偶数。缓冲区指针对于RxBD和8位的TxBD必须是偶数地址。3.这是SPI调试中最常见的问题之一仔细检查外设数据手册的时序图正确配置SPMODE中的CPHA和CPOL位。用逻辑分析仪捕获波形进比对。中断不触发1. BD中的I位未置位。2. 中断屏蔽寄存器SPIM未正确使能对应中断源。3. CPU全局中断或CPM中断未开启。4. 中断事件标志SPIE未及时清除导致后续中断被屏蔽。1. 检查使用的BD中控制字的I位是否为1。2. 检查SPIM寄存器确保RXB、TXB等需要的中断源已解除屏蔽对应位写1使能。3. 检查CPU的MSR[EE]位和CPM的CIMR等全局中断控制寄存器。4.在中断服务程序开头必须读取SPIE以清除事件标志。这是硬性规定。5.2 I2C通信故障排查现象可能原因排查步骤与解决方案总线死锁SCL被拉低1. 从机设备故障或未正确响应。2. 主从设备时钟BRG配置差异过大。3. 软件缺乏超时恢复机制。1. 用示波器检查SDA和SCL线。如果SCL被持续拉低是典型的总线锁死。2. 检查主机的I2C BRG配置确保时钟频率在从设备支持的范围内通常100kHz或400kHz。3.必须实现软件超时。在传输启动函数中设置一个定时器超时后尝试将I2C控制器先禁用再重新初始化或者通过GPIO模拟SCL时钟脉冲9个以上来尝试复位总线上的设备。从机无应答NACK1. 从机地址错误。2. 从机设备忙或未上电。3. 总线上下拉电阻值不合适导致上升沿太慢违反时序。1. 用逻辑分析仪解码I2C波形确认发送的7位地址是否正确。注意地址通常是7位左对齐最低位是R/W位。2. 检查从机设备电源、复位信号。3. 检查SDA和SCL线的上拉电阻。阻值太大会导致上升沿缓慢在高速模式下容易出错。根据总线电容和所需速度计算合适的阻值通常3.3V系统用4.7kΩ5V系统用2.2kΩ。多主系统中数据混乱1. 仲裁失败处理不当误判数据来源。2. 软件协议层缺乏事务ID或序列号。1. 在I2C中断服务程序中首要检查I2CER[AL]仲裁丢失标志。如果置位则本次接收到的数据很可能不是对主动发起读操作的响应应丢弃或按从机接收流程处理。2. 在应用层协议中为每次读写事务加入唯一标识或序列号在数据解析时进行校验。连续读写大量数据出错1. BD表环未正确闭合W位设置错误。2. 中断处理速度跟不上数据速率导致缓冲区覆盖或丢失。3. 缓冲区内存未缓存一致如果使能了缓存。1. 检查BD环中最后一个BD的W位是否设置为1。确保环中BD数量计算正确没有遗漏或重叠。2. 优化中断服务程序减少处理时间。或者使用BD的连续模式CM并配合DMA将数据搬运到更大的中间缓冲区进行批处理。3. 如果使能了CPU缓存且DMA操作的缓冲区在缓存范围内必须在DMA操作前执行缓存回写Write-Back或无效化Invalidate操作或者使用非缓存内存区域。RFCR/TFCR中的GBL位也与缓存一致性相关。5.3 通用调试技巧与心得从静到动从简到繁初始调试时先配置最简单的模式单次发送几个字节不接收不中断。用逻辑分析仪抓取SPI/I2C波形确认最基本的时钟、数据信号是否正确。然后再逐步加入接收、中断、BD表环、连续传输等复杂功能。善用内存查看工具在调试器如Lauterbach Trace32, DS-5等中实时查看参数RAM和BD表的内存内容。观察RBPTR/TBPTR的移动、BD状态位E/R的变化这是判断CPM是否在正确工作的最直接证据。模拟器与硬件结合如果有条件先在指令集模拟器如QEMU with PowerPC support上运行驱动代码排除基本的编程逻辑和内存访问错误。然后再上真实硬件聚焦于硬件时序和信号完整性问题。打印日志在驱动关键节点初始化完成、BD提交、中断进入/退出添加日志输出。虽然会影响实时性但在初期排查逻辑错误时非常有用。可以使用一个简单的串口打印或者利用处理器的ITAG接口输出调试信息。理解“所有权”概念这是CPM BD机制的核心。牢记“E/R1CPM拥有E/R0CPU拥有”。在CPU处理完数据后必须及时将BD所有权交还给CPM置E/R1否则通信链会断裂。这是很多“通信突然停止”问题的根源。