1. 项目概述:为什么总线异常与仲裁是嵌入式系统的“交通警察”
在任何一个复杂的嵌入式系统里,CPU、内存、外设和各种协处理器都通过一条共享的“高速公路”——系统总线——进行通信。想象一下,如果这条高速公路上没有交通规则和事故处理机制,会是什么景象?设备之间会争抢路权,一旦某个设备“抛锚”或响应超时,整个交通就会陷入瘫痪,系统崩溃只是时间问题。
MC68340,这颗诞生于上世纪90年代的经典32位微控制器,其设计精髓之一就在于它内置了一套极其完备和灵活的总线“交通管理系统”。这套系统的核心,就是总线异常控制和总线仲裁机制。前者负责处理总线访问过程中的“意外事故”,比如外设无响应、数据校验错误;后者则负责协调多个潜在“司机”(总线主设备)对总线的使用权,确保有序通行。
我当年第一次在工控项目里用MC68340做主机控制器时,就深刻体会到了这套机制的重要性。项目里挂接了多个从属的智能I/O模块,它们都可能主动请求总线来上报数据。如果没有可靠的仲裁,数据冲突和系统锁死是家常便饭。而总线异常处理,更是帮我定位了无数个隐蔽的硬件故障和软件Bug,从内存芯片接触不良到DMA配置错误,都逃不过BERR(总线错误)信号的“法眼”。
本文将带你深入MC68340的数据手册,但不止于手册。我会结合自己踩过的坑和实际调试经验,把那些干巴巴的信号时序图,翻译成你能直接用在设计里的“实战守则”。我们会从最基础的DSACKx(数据传输应答)信号说起,弄明白一次正常的总线访问是如何完成的。然后,当事情不如预期时,BERR和HALT信号如何介入,形成四种截然不同的总线周期终止模式。最后,我们会剖析多主系统中的总线仲裁流程,看MC68340如何“礼貌地”让出总线控制权。无论你是正在学习经典微控制器架构的学生,还是需要维护或升级老旧嵌入式系统的工程师,理解这些底层机制,都将让你对系统稳定性的把控提升一个维度。
2. 总线周期终止的“信号语言”:DSACKx、BERR与HALT
在MC68340的世界里,CPU发起一次总线读写,就像是一次问询。它发出地址和控制信号后,便进入等待。外部设备(或内存)必须用一种明确的“语言”来回应,告诉CPU“我收到了,数据在这儿”或者“我出问题了”。这套语言由三个关键信号构成:DSACKx、BERR和HALT。它们的组合,直接决定了当前总线周期的命运。
2.1 核心信号角色解析
首先,我们必须清楚每个信号的“职责”:
DSACKx (Data Transfer and Size Acknowledge):这是正常终结的信号。当外部设备成功接收到地址并准备好数据(读周期)或已接收数据(写周期)时,它通过拉低DSACKx来告知CPU:“任务完成,可以结束这个周期了。” MC68340支持DSACK0和DSACK1两个信号,它们的不同组合还能动态指示外设的数据端口宽度(8位或16位),这就是动态总线 sizing 的基础。
BERR (Bus Error):这是异常终结的信号。当发生严重问题时,例如访问了不存在的物理地址(由外部总线监视定时器触发),或者内存校验电路发现读取的数据有误,外部逻辑可以断言BERR。它告诉CPU:“这次访问失败了,别等了,赶紧处理错误吧。” BERR的优先级高于DSACKx。
HALT (Halt):这个信号功能多样。单独断言时,它请求CPU在完成当前总线周期后暂停外部总线活动,用于硬件调试的单步执行。与BERR同时断言时,它表示“这次访问出错了,但请你重试一次”,即重试终止。
注意:这三个信号都是低电平有效(信号名后的“≈”符号通常表示低有效)。在阅读时序图或设计电路时,务必牢记“断言”通常意味着拉低电平,“否定”意味着拉高电平。
2.2 四种终止模式详解
根据这三个信号在总线周期结束时的状态组合,MC68340定义了四种终止模式,如数据手册中的表3-4所总结。理解这张表是掌握总线异常控制的关键。
表2-1:MC68340总线周期终止模式速查表
| 案例编号 | DSACKx | BERR | HALT | 结果与后续动作 |
|---|---|---|---|---|
| 1 | 断言 | 否定 | 否定 | 正常终止:周期成功完成,CPU继续执行下一条指令。 |
| 2 | 断言 | 否定 | 断言 | 暂停终止:周期成功完成,但CPU停止外部总线活动,进入暂停状态。用于调试。 |
| 3 | 否定/断言 | 断言 | 否定 | 总线错误终止:周期异常终止,CPU将立即或延迟触发总线错误异常处理。 |
| 4 | 断言 | 断言 (晚于DSACKx) | 否定 | 总线错误终止 (延迟):周期先被DSACKx正常结束,但BERR紧随其后。CPU仍会触发总线错误异常。 |
| 5 | 否定/断言 | 断言 | 断言 | 重试终止:周期异常终止,CPU将在HALT信号撤销后,自动重试刚刚失败的总线周期。 |
| 6 | 断言 | 断言 (晚于DSACKx) | 断言 | 重试终止 (延迟):周期先被DSACKx正常结束,但BERR和HALT紧随其后。CPU将自动重试该周期。 |
注:NA/A 表示“未断言或断言”,即两种情况都可能。
案例1(正常终止)是最常见的流程,无需赘述。我们从案例3(总线错误终止)开始深入。这是最直接的错误处理。例如,你的系统地址空间是0x00000000到0x00FFFFFF,但程序错误地跳转到了0x02000000。连接在高端地址线上的“地址译码与监视定时器”电路在超时后仍未见到任何设备响应DSACKx,便会断言BERR。CPU收到BERR后,会终止当前周期,并视情况启动异常处理程序。
这里有个关键细节:异常处理可能是立即的,也可能是延迟的。为什么?因为MC68340有指令预取机制。如果这个错误发生在预取指令时,而CPU的流水线还没执行到这条指令,那么异常会被“挂起”,直到CPU真正要执行这条错误指令时,才会触发异常。这个设计避免了不必要的异常中断,提升了效率,但也给调试带来了一点复杂性——你看到的异常触发点可能不是错误发生的第一个总线周期。
案例5和6(重试终止)是MC68340提供的一个非常强大的错误恢复机制。它需要外部硬件(如带ECC校验的内存控制器)的配合。当内存控制器检测到可纠正的单比特错误时,它不会简单地报告错误,而是同时断言BERR和HALT。CPU看到这个组合,就会明白:“哦,这次访问有问题,但你让我等会儿再试一次。” 于是CPU进入暂停状态,等待HALT信号撤销。在此期间,内存控制器可以悄悄地纠正内存中的错误位。当HALT撤销后,CPU会自动地、完全透明地重新发起一次完全相同的总线访问(相同的地址、功能码、数据大小)。对于软件来说,就像什么都没发生过一样,极大地增强了系统的容错能力。
案例2(暂停终止)和案例4(延迟总线错误)是另外两种有用的组合。案例2是纯调试功能,让工程师可以一个总线周期一个总线周期地观察系统行为。案例4则用于那些需要先尝试访问,再根据结果判断对错的场景。例如,一个先读后验证的系统中,可以快速返回DSACKx以释放总线,然后在下一个时钟周期内完成验证,若数据无效则立即断言BERR。
2.3 实战经验:信号时序是生命线
手册里反复强调一点:BERR和HALT的断言与撤销,必须严格满足建立和保持时间的要求,并且最好与MC68340的时钟上升沿同步。这不是建议,是铁律。
我早期设计的一块扩展板就栽在这里。当时用CPLD实现外部总线监视器,BERR信号由组合逻辑生成,没有用时钟寄存器同步。在实验室常温下测试一切正常,但到了高温环境,偶尔就会出现系统跑飞。用逻辑分析仪抓取信号发现,BERR信号有时在时钟边沿附近出现了毛刺,导致CPU有时识别为错误,有时没识别,状态机错乱。教训是:所有反馈给CPU的异步控制信号(DSACKx, BERR, HALT),必须经过CPU时钟的同步寄存器处理后再输出。最简单的做法是在CPLD或FPGA中,用CLKOUT的上升沿来采样和驱动这些信号。
另一个容易忽略的点是信号撤销时机。手册明确指出,如果DSACKx或BERR在下一个总线周期的S2状态仍然保持断言,可能会导致下一个周期被意外提前终止。这意味着你的外部逻辑必须在当前周期结束后,及时撤销这些信号。一个稳健的设计是,在检测到AS(地址选通)信号撤销后,立即在下一个时钟边沿撤销本地的DSACKx/BERR响应逻辑。
3. 总线错误(BERR)的深入处理与“双总线故障”
总线错误(BERR)是系统最后的防线,但处理不当,它本身也可能成为系统崩溃的推手。MC68340对BERR的处理逻辑非常严谨,甚至定义了“双总线故障”这种终极错误状态。
3.1 BERR的生效条件与优先级
BERR要想被CPU有效识别,必须在特定的时间窗口内断言。手册中列出了三种情况:
- DSACKx和HALT均未断言,BERR被断言。
- HALT和BERR未断言,DSACKx先断言,但BERR在一个时钟周期内紧随其后断言。
- BERR和HALT同时被断言(即重试请求)。
这里的关键是BERR的优先级高于DSACKx。一旦BERR在满足时序要求的情况下被识别,无论DSACKx状态如何,当前周期都会以错误终止。图3-17和图3-18的时序图清晰地展示了“无DSACKx的错误”和“DSACKx之后晚到的错误”两种场景。在第二种“延迟错误”场景中,数据可能已经被读取到CPU内部,但BERR告诉CPU:“这个数据是脏的,别用。” CPU会丢弃这些数据,并转入异常处理。
3.2 异常处理流程与堆栈操作
当BERR导致异常发生时,MC68340的CPU32内核会启动一套复杂的现场保存操作。它会将当前程序计数器(PC)、状态寄存器(SR)以及一些内部信息压入系统堆栈。这个过程本身,就需要多次访问内存(堆栈通常位于内存中)。
这就引出了一个致命的问题:如果保存现场的过程中,再次发生总线错误怎么办?比如,堆栈指针(SP)指向了一个无效的内存区域,或者保存数据时内存芯片恰好故障。这就是MC68340定义的“双总线故障”(Double Bus Fault)。
3.3 双总线故障:系统的“心脏骤停”
双总线故障是异常处理过程中的异常,属于最严重的硬件错误之一。当MC68340在处理一个总线错误(或地址错误,或复位)的异常序列时,如果在这个序列中又发生了新的总线错误或地址错误,处理器就会认定发生了双总线故障。
此时,处理器认为系统已经处于一个不可恢复的混乱状态。它会采取最极端的措施:停止一切操作,并断言HALT信号,使自己进入完全的停机状态。从外部看,就是CPU“死”了,时钟可能还在跑,但地址线、数据线停止活动,或者保持在高阻态。只有外部的一个复位(RESET)信号,才能让CPU从这种状态中恢复过来,重新启动。
实操心得:在设计高可靠性系统时,必须为双总线故障做好准备。我们的做法是:
- 确保堆栈区域的绝对可靠:将系统堆栈放在访问速度最快、最稳定的内存中(如片内SRAM),并做好上电初始化校验。
- 设计硬件看门狗:即使CPU因双总线故障而停机,一个独立的硬件看门狗定时器应在超时后,产生一个复位信号,强制系统重启。MC68340内部有软件看门狗,但在这种极端故障下,内部模块可能也已失效,外部看门狗是最后保障。
- 谨慎使用“延迟BERR”:案例4和6的延迟错误模式虽然灵活,但增加了时序设计的复杂性。在非必要的情况下(如无ECC内存),尽量使用案例3和5的即时响应模式,降低风险。
3.4 复位(RESET)操作与总线异常的关系
复位是应对包括双总线故障在内各种严重错误的终极手段。MC68340的复位源有多种:上电复位、外部复位引脚、内部软件看门狗、双总线故障监视器以及RESET指令。
这里有一个重要的时序概念:同步复位与异步复位。像外部复位引脚、时钟模块复位这类“有计划”的复位,属于同步复位。CPU会等待当前总线周期完成(即使它可能被RMC信号延长)后再执行复位操作。如果当前周期无法正常结束,内部总线监视器会强制终止它。
而像上电、双总线故障这类“灾难性”复位,属于异步复位。复位控制逻辑会立即行动,终止任何进行中的总线周期,就像DSACKx或BERR被瞬间断言了一样,然后初始化寄存器,启动复位异常向量获取流程。
手册中图3-27和图3-28的复位时序需要仔细研读。特别是外部设备驱动RESET引脚时,需要保持至少590个时钟周期的低电平,以确保MC68340内部可靠复位。复位结束后,CPU会从0x00000000(或MBAR重定位后的地址)开始读取初始堆栈指针和程序计数器,这是一个标准的异常处理入口流程。
4. 总线仲裁机制:多主系统中的“礼貌谦让”
当系统中有多个设备都需要主动发起总线传输时(例如MC68340作为主机,还有一个DMA控制器或另一个处理器作为潜在主设备),就需要一套规则来决定谁在什么时候使用总线。这套规则就是总线仲裁。MC68340将自身设计为最低优先级的总线主设备,主动“礼让”其他设备,通过三个信号实现仲裁:BR(Bus Request)、BG(Bus Grant)、BGACK(Bus Grant Acknowledge)。
4.1 仲裁信号与基本流程
这三个信号构成了一个经典的三线握手协议:
- BR (Bus Request, 总线请求):由希望获得总线控制权的外部设备断言。它可以被多个设备“线或”在一起,只要有一个设备请求,MC68340就能看到BR有效。
- BG (Bus Grant, 总线授权):由MC68340断言,作为对BR的响应。它表示:“我收到你的请求了,等我手头这个‘原子操作’做完,就把总线让给你。” 这里的关键是“原子操作”,主要指不可分割的读-修改-写(RMC)周期。在RMC周期期间,即使BR被断言,BG也不会被响应,这是为了保证数据的一致性。
- BGACK (Bus Grant Acknowledge, 总线授权应答):由最终获得总线控制权的外部设备断言。该设备在检测到BG有效、且当前没有其他设备在驱动总线(即BGACK无效)后,才可断言BGACK,正式接管总线。一旦断言BGACK,该设备就成为新的总线主设备,可以驱动地址、数据和控制线。
图3-22的流程图清晰地描述了这个过程。对于单一请求设备的系统,流程相对简单。外部设备请求(BR)、CPU授权(BG)、设备应答并接管(BGACK),然后设备在完成传输后释放总线(撤销BGACK),CPU收回控制权。
4.2 多主仲裁与优先级处理
在实际的多主系统中(比如MC68340 + DMA + 另一个CPU),情况更复杂。多个设备的BR信号会通过“线或”接到MC68340的BR引脚。当MC68340发出BG信号后,哪个设备能最终断言BGACK呢?
MC68340本身不处理优先级。BG信号就像一面“授权旗”,被传递到一个外部的仲裁器电路中(可以是菊花链或优先级编码器)。这个外部仲裁器根据预设的优先级,决定将总线授予哪个请求设备。获得授权的设备才会去断言BGACK。
这里有一个精妙的设计:MC68340会在BGACK断言后的几个时钟周期撤销BG。但如果此时还有其他的BR请求 pending,CPU会在撤销BG后很快再次断言BG。这使得外部仲裁器可以在当前主设备还在使用总线时,就提前决定出下一个主设备是谁,实现总线所有权的“流水线”式传递,最大化总线利用率。图3-24(活跃总线情况下的仲裁时序)就展示了这种重叠操作。
4.3 仲裁过程中的特殊状态与注意事项
1. 操作数一致性(Operand Coherency)这是MC68340总线仲裁的一个核心原则。CPU在传输一个多字节的操作数(比如一个32位的长字)时,可能需要多个总线周期。为了保证这个操作数的完整性不被其他主设备打断,MC68340必须等到整个操作数传输完成后,才会响应总线请求(即断言BG)。这个“完成”的标志,就是最后一个周期的DSACKx被返回。设计外部仲裁逻辑时,必须尊重这一特性。
2. 读-修改-写(RMC)周期的特殊性RMC周期用于实现信号量等需要原子访问的操作。在此期间,RMC信号会一直保持有效。MC68340在RMC周期内完全忽略BR请求。如果某个外部设备急需在RMC期间获得总线,它不能使用正常的仲裁流程,而必须使用总线异常控制:即断言BERR(或BERR+BR,但不能包含HALT)来中止当前的RMC周期。这给了软件一个处理此类竞争条件的机会。
3. HALT状态下的仲裁即使CPU因为HALT信号而暂停了外部总线活动,它仍然会响应并处理总线仲裁请求。当仲裁发生时,CPU的地址、数据和控制线会进入高阻态,将总线让出。一旦总线控制权交还给CPU,如果HALT信号仍然有效,这些信号又会恢复到暂停前的状态。这个特性使得在单步调试时,依然可以允许DMA等设备进行后台数据传输。
4. 片选信号(CS3-CS0)的特殊性手册特别强调了一个容易出错的点:MC68340的片选信号在总线授予外部主设备时,不会进入高阻态。这与地址线、数据线的行为不同。这意味着,如果你的外部设备需要驱动与片选信号复用的线路,必须做好隔离(例如使用三态缓冲器),否则会发生总线冲突。
4.4 实战设计:构建一个可靠的多主仲裁电路
基于MC68340设计一个多主系统,外部仲裁器是必不可少的。这里分享一个使用通用逻辑芯片(如74HC148优先级编码器)和触发器实现的简单但可靠的仲裁方案。
设计目标:系统包含MC68340(最低优先级)、一个高速DMA控制器(高优先级)和一个通信协处理器(中优先级)。
思路:
- 将DMA和协处理器的BR信号接入优先级编码器。编码器输出代表当前最高优先级请求的二进制码。
- MC68340的BG信号作为仲裁器的使能信号。当BG有效时,仲裁器工作,将当前最高优先级的请求编码锁存。
- 被锁存的编码经过译码,产生对应设备的“本地授权”信号。
- 每个设备在收到“本地授权”且检测到BGACK无效(总线空闲)后,才能断言自己的BGACK信号,并开始总线操作。
- 每个设备的BGACK信号通过“线或”连接到MC68340的BGACK引脚。
- 当设备释放总线时,先撤销自己的BGACK,然后撤销BR。
关键点:
- 必须确保在任何时刻,只有一个设备在驱动BGACK。这需要仲裁逻辑保证“本地授权”的唯一性,并在设备间实现互锁。
- 仲裁逻辑的时钟最好与MC68340的CLKOUT同步,以减少亚稳态风险。
- 要为每个外部主设备设计类似MC68340的总线异常响应逻辑(DSACKx/BERR生成),确保它们也能规范地结束总线周期。
5. 调试利器:HALT单步与Show Cycles
除了处理错误和仲裁,MC68340的总线架构还为系统调试提供了强大的硬件支持,主要体现在HALT单步操作和Show Cycles(显示周期)功能上。
5.1 HALT信号与单步调试
如之前所述,当外部调试器(或一个简单的拨码开关电路)断言HALT信号且BERR无效时,MC68340会在完成当前外部总线周期后,停止所有外部总线活动。此时,地址、数据、控制信号会保持在上一个周期的状态(数据总线为高阻态),CPU内部状态则被“冻结”。
调试器可以在此状态下,读取CPU的寄存器、内存内容。当调试器撤销HALT信号后,CPU会继续执行一个总线周期,然后再次因HALT有效而暂停。这就实现了总线周期级的单步执行。对于调试与硬件紧密交互的底层驱动(如操作某个外设寄存器),这比指令级单步更直观,因为你可以清晰地看到每个总线周期上发生了什么。
注意事项:在HALT单步模式下,如果发生总线错误(BERR被断言),MC68340会将其解释为重试请求(因为HALT也有效)。这意味着你在单步跟踪时,可能会意外触发重试周期,导致你看到的执行流与实际不同。调试时需要留意这一点。
5.2 Show Cycles:窥探内部总线活动
MC68340的许多数据访问发生在片内模块之间(如CPU访问片内RAM或定时器寄存器),这些访问不经过外部总线,传统的逻辑分析仪无法捕捉。Show Cycles功能就是为了解决这个问题而生的。
当通过模块配置寄存器(MCR)中的SHEN位启用Show Cycles后,MC68340在进行内部访问时,会将地址、功能码、读写方向、数据大小等信息**“展示”** 到外部总线上。关键的区别在于:此时AS(地址选通)信号不会被断言,取而代之的是DS(数据选通)信号被用来指示地址信息的有效时刻。外部数据总线也会被使能,以便观察内部读出的数据。
图3-26展示了Show Cycles的时序。它就像一个“内部总线的镜像”,让工程师能够非侵入性地观察CPU的所有内存访问活动,无论是片内还是片外。这对于调试复杂的、涉及大量片内资源交互的软件(如实时操作系统内核)来说,是无价之宝。
启用Show Cycles的代价:它会增加功耗,并且由于驱动外部总线,可能会引入额外的电磁干扰。在最终产品中,务必禁用此功能。通常的做法是在调试版本的程序初始化阶段启用SHEN,在发布版本中禁用它。
6. 系统集成模块(SIM40)的配置要点
MC68340的总线异常与仲裁机制并非孤立存在,它们与芯片内部的系统集成模块(SIM40)紧密相关。SIM40是配置和管理这些功能的控制中心。要灵活运用前述机制,必须理解几个关键寄存器。
6.1 模块基地址寄存器(MBAR)
这是所有内部寄存器访问的起点。MC68340的内部寄存器(包括SIM40、DMA、定时器、串口等所有模块的寄存器)都被映射到一个4KB的连续地址空间内。MBAR寄存器存储的就是这个4KB空间的基地址。上电复位后,你需要通过一条特殊的MOVES指令(在CPU空间$7中操作)来设置MBAR,之后才能访问其他内部寄存器。这提供了极大的灵活性,可以将内部寄存器映射到任何对齐的4KB边界,避免了与外部设备地址冲突。
6.2 模块配置寄存器(MCR)与Show Cycles控制
在SIM40的寄存器中,模块配置寄存器(MCR)里包含了控制Show Cycles的SHEN1-SHEN0位。如前所述,通过设置这两位,可以精确控制Show Cycles的启用与禁用。需要注意的是,当Show Cycles被禁用时,内部总线活动仍然会反映在地址、功能码等引脚上,但AS和DS不会被断言,外部数据总线为高阻态。
6.3 芯片选择与等待状态配置
SIM40提供了4个可编程的片选信号(CS0-CS3)。每个片选都与一个基地址寄存器(BAR)和一个地址掩码寄存器(AMR)关联。通过配置BAR和AMR,你可以为外部存储器或外设划定精确的地址范围,并指定该区域的访问特性,如是否可缓存、是否写保护等。
更重要的是,AMR还可以配置最多3个等待状态。对于访问速度较慢的设备(如低速Flash、某些外设),你可以在硬件上不依赖外部的DSACKx信号来插入等待,而是直接通过AMR配置固定的等待周期数。这简化了低速外设的接口设计。当然,DSACKx的动态等待插入方式仍然可用,且优先级高于AMR的固定等待设置。
6.4 内部总线监视器
SIM40内部还集成了一个总线监视器(Bus Monitor)。这是一个硬件定时器,从AS信号断言开始计时。如果在预设的超时时间内没有收到DSACKx或BERR响应,总线监视器会自动为CPU生成一个BERR信号,从而终止挂起的总线周期,防止CPU因外设故障而永远等待。这个功能对于构建高可靠性的系统至关重要,它确保了即使外部硬件完全失效,系统也能通过异常处理机制进行恢复。超时时间可以通过SIM40的寄存器进行配置。
7. 常见问题排查与设计陷阱规避
基于MC68340设计系统时,总线相关的问题往往最难调试。以下是我总结的一些典型问题及其排查思路。
问题一:系统随机性死机,有时能复位恢复,有时必须断电。
- 排查思路:这极有可能是“双总线故障”的典型表现。首先检查堆栈指针(SP)的初始化是否可靠,堆栈区域(通常是SRAM)的电源、地线和片选信号是否稳定。用示波器观察在死机瞬间,是否有异常的毛刺打在地址或数据线上,导致CPU在异常处理时再次访问非法地址。务必启用内部总线监视器,并设置一个合理的超时值,这能拦截大部分外设无响应导致的挂起。
问题二:使用DMA时,偶尔发生数据错乱或丢失。
- 排查思路:重点检查总线仲裁逻辑。确认DMA控制器在请求总线(BR)和获得授权(BGACK)之间的逻辑是否符合协议。用逻辑分析仪同时抓取BR、BG、BGACK以及DMA访问的地址/数据线,观察在控制权切换的瞬间,是否有两个设备同时驱动总线的现象(冲突)。特别留意在RMC周期期间,DMA是否错误地尝试获取总线。
问题三:外设响应不稳定,有时读写正常,有时读回全FF或00。
- 排查思路:首先检查硬件连接和时序。用示波器测量该外设片选信号(CSx)和DSACKx信号的时序,确保满足MC68340数据手册中关于建立和保持时间的要求。特别注意DSACKx的生成逻辑:它是否严格在地址有效、且设备被选中后才发出?是否在AS撤销后及时撤销?一个常见的错误是DSACKx信号被持续拉低,导致后续总线周期被提前终止。可以尝试在AMR中为该外设地址区域增加1-2个等待状态,看问题是否消失,这有助于判断是速度问题还是逻辑问题。
问题四:在调试模式下使用HALT单步,程序行为与全速运行不一致。
- 排查思路:这很可能是因为系统中存在对时序敏感的部件,或者中断被意外屏蔽。记住,在HALT状态下,MC68340不响应中断请求。如果你的系统依赖定时器中断来维持某个状态机,那么在单步时,这个状态机就会停止。此外,检查是否有外部设备依赖严格的、连续的总线周期时序(如某些串行存储器)。单步执行打破了这种连续性,可能导致设备状态异常。对于这类问题,需要结合软件断点、变量观察和选择性代码执行来调试,而非完全依赖硬件单步。
问题五:启用Show Cycles功能后,系统功耗明显增大,且在某些频段电磁辐射超标。
- 排查思路:这是正常现象。Show Cycles强制驱动外部总线引脚,增加了输出级的负载和开关活动。在产品开发阶段,可以仅在需要调试时通过跳线或调试接口命令临时启用SHEN位。在最终产品中,必须确保软件将SHEN位禁用。可以在系统初始化代码的最后部分,明确地向MCR寄存器写入禁用Show Cycles的值。
MC68340的总线架构设计体现了早期32位微控制器在复杂性和灵活性之间的经典权衡。它没有现代处理器中那些高度集成的、黑盒式的总线控制器,而是将控制信号清晰地暴露给开发者,允许我们通过外部逻辑实现高度定制化的错误处理、仲裁和调试功能。这种“可见性”和“可控性”,正是深入理解计算机体系结构和构建坚固嵌入式系统的绝佳练兵场。尽管这颗芯片已不是市场主流,但其中蕴含的设计思想,特别是对可靠性和可调试性的考量,在今天依然具有极高的参考价值。当你下次面对一个复杂的系统稳定性问题时,不妨回想一下BERR、HALT和仲裁协议这些底层机制,它们很可能就是解开谜题的关键钥匙。