
1. 项目概述MC68HC11A8的串行通信双雄在嵌入式开发的早期黄金时代Motorola后来的Freescale现为NXP的MC68HC11系列微控制器堪称一代经典。其中MC68HC11A8凭借其丰富的外设和稳定的性能被广泛应用于工业控制、汽车电子和各类教学实验平台。对于任何一位深入此领域的工程师或爱好者而言透彻理解其内置的两种串行通信接口——异步串行通信接口SCI和同步串行外设接口SPI是解锁其强大连接能力的关键。SCI像是两位约定好节奏的远距离信使依靠起始位和停止位来界定每一帧数据适合与PC、调制解调器或其他微控制器进行可靠但非实时的对话。而SPI则像一支纪律严明、步调一致的近卫军依靠一根独立的时钟线指挥数据同步进出专为高速、短距离的板级设备间通信而生。本文将带你穿越数据手册的密林不仅还原SCI和SPI的工作原理更会结合十多年一线调试的经验拆解寄存器配置的每一个比特位分享从零搭建通信链路时必然会踩的“坑”以及如何优雅地爬出来。无论你是正在学习经典架构的学生还是维护遗留系统的工程师这篇文章都将是一份不可多得的实战指南。2. SCI异步串行通信接口深度解析SCI是MC68HC11A8用于异步通信的核心模块。所谓“异步”意味着通信双方没有统一的时钟线完全依靠预先约定好的数据格式和波特率来同步。这就像两个人用摩斯电码发电报必须事先商定好每个“点”和“划”的时长才能正确解码。2.1 核心工作机制与数据帧格式SCI采用标准的NRZ非归零格式。一帧完整的数据由以下几部分组成空闲位Idle Line在通信开始前数据线TxD/RxD必须保持逻辑高电平1这标志着线路处于空闲状态。起始位Start Bit一个逻辑低电平0标志着数据帧的开始。接收端会持续检测这个下降沿。数据位Data Bits紧接起始位之后可以是8位或9位由寄存器控制从最低有效位LSB开始发送。停止位Stop Bit一个逻辑高电平1标志着数据帧的结束。它也为下一帧的起始位检测提供了必要的空闲时间。这种“起始位-数据位-停止位”的结构为每一帧数据提供了自同步能力。接收端只要检测到起始位就能以此为基准按约定的时间间隔对后续位进行采样。注意MC68HC11A8的SCI固定使用1位停止位不支持常见的1.5位或2位停止位配置。这在与其他设备如某些老式PC串口通信时需要特别注意必须确保对方也配置为1位停止位否则会产生持续的帧错误。2.2 关键寄存器详解与配置实战SCI的功能完全由一组内存映射寄存器控制。理解每个比特位的含义是进行可靠通信编程的基础。2.2.1 波特率寄存器BAUD - $102B波特率决定了数据传输的速度。MC68HC11A8的波特率由系统时钟E时钟经过两级分频得到提供了极高的灵活性。BAUD寄存器中的SCP[1:0]和SCR[2:0]位共同决定了分频系数。SCP[1:0] (位5-4) - 预分频器选择00: 除以 101: 除以 310: 除以 411: 除以 13SCR[2:0] (位2-0) - 波特率选择器000: 除以 1001: 除以 2010: 除以 4011: 除以 8100: 除以 16101: 除以 32110: 除以 64111: 除以 128波特率计算公式波特率 E_CLK / (预分频系数 * 选择器系数 * 16)这里的16是因为接收端采用16倍过采样。举个例子假设E时钟为2MHz8MHz晶振经4分频我们希望得到9600的波特率。首先计算所需的位时间分频总数2,000,000 Hz / 9600 baud ≈ 208.33这个总数需要等于预分频系数 * 选择器系数 * 16。尝试组合若选择SCP10(除以4)SCR011(除以8)则总分频系数为4 * 8 * 16 512得到的波特率为2,000,000 / 512 3906.25不符合。经过查表或计算SCP11(除以13)SCR100(除以16) 是一个常用组合13 * 16 * 16 3328波特率2,000,000 / 3328 ≈ 601.0这是标准600波特率并非9600。实操心得对于常见的2MHz E时钟直接查阅数据手册中的表格是最快最准确的方法。手册会列出在不同晶振频率下寄存器配置与标准波特率的对应关系。盲目计算容易出错且可能得不到精确值。对于8MHz晶振E2MHz配置SCP00(÷1)SCR110(÷64)可得2,000,000 / (1*64*16) 1953.125接近19200而SCR101(÷32)可得3906.25。MC68HC11A8的SCI在2MHz E时钟下无法产生精确的9600波特率最接近的是10416波特SCP00 SCR011或 5208波特SCP00 SCR100。这是选型时必须考虑的限制。2.2.2 串行通信控制寄存器1SCCR1 - $102C这个寄存器主要控制数据格式和唤醒模式。M (位4) - 字符长度0为8位数据1为9位数据。9位模式常用于多机通信其中第9位作为地址/数据标识位。WAKE (位3) - 唤醒方法选择0为空闲线唤醒1为地址位唤醒。这在多接收器系统中用于降低CPU开销后文会详细说明。R8/T8 (位7/6) - 数据位8当M19位模式时这两位分别用于存储接收和发送数据的第9位。2.2.3 串行通信控制寄存器2SCCR2 - $102D这是SCI的功能开关和中断控制中心。TE/RE (位3/2) - 发送/接收使能必须置1才能启动相应的发送或接收功能。TIE/TCIE/RIE/ILIE (位7/6/5/4) - 中断使能分别对应发送数据寄存器空、发送完成、接收数据寄存器满、空闲线检测中断。合理使用中断可以大大提高CPU效率。RWU (位1) - 接收器唤醒置1使接收器进入睡眠模式仅在特定的唤醒条件下退出。常见错误在单机通信中误置位RWU会导致接收器“装死”再也收不到任何数据。SBK (位0) - 发送中止置1会使TxD线持续输出低电平至少10或11个位时间构成一个“中止”帧用于通知对方通信错误或强制复位。注意发送完成后硬件会自动插入至少一个高电平位以保证下一个起始位能被识别。2.2.4 串行通信状态寄存器SCSR - $102E用于反映SCI的实时状态是编写健壮通信程序的关键。TDRE (位7) - 发送数据寄存器空为1表示SCDR发送侧已空可以写入下一个要发送的字节。最佳实践在中断服务程序中先读取SCSR这将清除TDRE再写入SCDR。RDRF (位5) - 接收数据寄存器满为1表示SCDR接收侧已从移位寄存器接收到一个新字节可以读取。FE/NF/OR (位1/2/3) - 错误标志FE帧错误未检测到有效的停止位即停止位为0。可能原因包括波特率不匹配、线路干扰或对方发送了“中止”信号。NF噪声标志在某个位的3次采样中第8、9、10个RT时钟出现了不一致非全0或全1。表明该位可能受到噪声干扰但通过“多数表决”逻辑数据仍可能被正确接收。OR超限错误当前字节尚未被读取RDRF1下一个字节已经接收完毕并准备移入SCDR导致新字节丢失。这是最常见的编程错误之一通常因CPU处理速度跟不上数据接收速度且未及时读取数据或中断服务程序过长导致。IDLE (位4) - 空闲线检测当RxD线保持高电平超过一个完整字符时间10或11位时置位。用于检测报文结束。2.3 接收器的精妙设计采样与错误处理MC68HC11A8的SCI接收器设计得非常稳健其核心在于16倍过采样和多数表决机制。接收器以16倍于波特率的频率RT时钟对RxD线进行采样。对于每个数据位包括起始位和停止位它会在该位的理论中点附近第8、9、10个RT周期进行三次采样。这三次采样的值通过一个“多数表决”逻辑来决定该位的最终值0或1。这种设计能有效抑制短时间的脉冲噪声。起始位检测流程接收器持续监测RxD线等待由高到低的跳变起始位前沿。检测到跳变后在接下来的第8、9、10个RT周期进行三次“起始位验证采样”。如果这三次采样中至少有两次是低电平则确认是一个有效的起始位开始接收数据帧。如果三次采样不全为低则视为噪声设置NF标志但仍可能将其作为一个有效的起始位开始接收。这是一个容错设计。帧错误后的特殊处理 这是MC68HC11A8 SCI一个非常巧妙且重要的特性。当发生帧错误未收到停止位但并非由“中止”信号连续10/11个0引起时接收器会执行“人工起始边沿”操作。原理硬件会将接收移位寄存器中最后一位数据取反变为1并在预期检测起始位的时间点强制向采样移位寄存器填入三个逻辑1作为“起始限定符”。效果这使得接收器不会早于预期时间“看到”下一个起始位防止了在噪声或短时低电平后立即错误地开始接收新帧给了线路一个恢复为高电平空闲状态的机会。对比如果帧错误是由“中止”信号引起的则不会产生人工起始边沿接收器必须实际检测到一个逻辑1空闲状态后才能识别下一个起始位。2.4 唤醒功能在多机通信中的应用唤醒功能Wake-Up是SCI用于构建多接收器一主多从网络的核心机制能显著降低从机CPU的负载。工作原理在多机系统中主机发送的报文通常包含目标从机的地址。如果不使用唤醒功能每个从机的SCI在收到任何数据时都会产生中断CPU需要进入中断服务程序检查地址如果不是发给自己的则丢弃数据。这造成了大量不必要的CPU中断。启用唤醒功能RWU1后从机SCI进入“睡眠”模式。在此模式下接收器仍在工作但不会因收到数据而置位RDRF标志或产生接收中断。它只在两种条件下被“唤醒”空闲线唤醒WAKE0当检测到RxD线空闲连续10/11个高电平时硬件自动清除RWU位唤醒接收器。这意味着主机必须在两个报文之间留出一段空闲时间至少一个字符时间作为唤醒所有从机的“广播信号”。地址位唤醒WAKE1当接收到的字符其最高位第8或第9位取决于M位为1时硬件自动清除RWU位唤醒接收器。在这种模式下主机将报文的第一个字节地址字节的最高位置1后续数据字节的最高位置0。从机只在收到地址字节时才被唤醒并产生中断检查地址是否匹配。如果匹配则保持唤醒状态接收后续数据如果不匹配软件可以立即将RWU再次置1继续睡眠忽略整个报文。配置示例地址位唤醒模式; 假设从机地址为0x02 LDAA #%00110000 ; M1 (9位模式), WAKE1 (地址位唤醒) STAA SCCR1 ; 配置SCCR1 LDAA #%00001100 ; RE1 (接收使能), RWU1 (进入睡眠) STAA SCCR2 ; 配置SCCR2 ; 中断服务程序SCI SCI_ISR: LDAA SCSR ; 读状态寄存器清除标志 BITA #%00100000 ; 检查RDRF BEQ NOT_RX ; 不是接收中断则跳转 LDAA SCDR ; 读取收到的数据9位模式的低8位 LDAB SCCR1 ; 读取SCCR1其R8位包含了第9位 BPL IS_DATA ; 如果R80数据字节跳转 ; 以下是地址字节处理R81 CMPA #$02 ; 检查地址是否匹配本机 BNE NOT_FOR_ME ; 地址匹配保持唤醒准备接收数据 LDAA SCCR2 ANDA #%11111101 ; 清除RWU位 (RWU0) STAA SCCR2 BRA ISR_EXIT NOT_FOR_ME: ; 地址不匹配保持睡眠状态 LDAA SCCR2 ORAA #%00000010 ; 设置RWU位 (RWU1) STAA SCCR2 BRA ISR_EXIT IS_DATA: ; 处理数据字节... ; ... (存储或处理数据) NOT_RX: ; 处理其他SCI中断标志TC, TDRE等 ISR_EXIT: RTI重要提示在地址位唤醒模式下从机必须在处理完地址字节后无论是否匹配立即根据情况重新配置RWU位否则会影响后续报文的接收。这是一个极易出错的细节。3. SPI同步串行外设接口实战指南如果说SCI是彬彬有礼的邮件通信那么SPI就是高效直接的电话会议。SPI是一种高速、全双工、同步的串行总线特别适合与ADC、DAC、存储器、传感器等板载外设通信。3.1 SPI总线基础与信号定义SPI通常需要四根线三线模式也可但较少用SCK (Serial Clock)串行时钟由主设备产生用于同步数据。MOSI (Master Out Slave In)主设备输出从设备输入。MISO (Master In Slave Out)主设备输入从设备输出。SS (Slave Select)从设备选择低电平有效。主设备通过拉低对应从机的SS线来选中它。在MC68HC11A8中这些信号线复用Port D的引脚PD2-SS(输入/输出)PD3-SCK(输出-主模式 输入-从模式)PD4-MOSI(输出-主模式 输入-从模式)PD5-MISO(输入-主模式 输出-从模式)关键特性全双工数据在主设备的MOSI输出和从设备的MISO输入同时进行主从设备各有一个8位移位寄存器连接成环。当主设备发送一个字节时也从从设备接收一个字节。主从模式通过MSTR位配置。一个SPI网络中只能有一个主设备但可以有多个从设备。时钟极性与相位可编程通过CPOL和CPHA位控制这提供了与不同时序要求的SPI设备兼容的极大灵活性。3.2 时钟模式CPOL与CPHA的深入理解这是SPI配置中最容易混淆的部分但也是确保与不同外设正确通信的基石。CPOL和CPHA共同定义了数据相对于时钟的采样和锁存时刻。CPOL (Clock Polarity)时钟空闲状态。CPOL0SCK在空闲时为低电平。CPOL1SCK在空闲时为高电平。CPHA (Clock Phase)时钟相位决定数据在哪个时钟边沿被采样。CPHA0数据在第一个时钟边沿SCK从空闲状态跳变到有效状态的边沿被采样。对于CPOL0第一个边沿是上升沿对于CPOL1第一个边沿是下降沿。CPHA1数据在第二个时钟边沿SCK从有效状态跳变回空闲状态的边沿被采样。组合成四种模式Mode 0 (CPOL0,CPHA0)时钟空闲低数据在SCK上升沿采样下降沿变化。这是最常用的模式适用于大多数SPI器件如EEPROM 25系列 SD卡初始化阶段。Mode 1 (CPOL0,CPHA1)时钟空闲低数据在SCK下降沿采样上升沿变化。Mode 2 (CPOL1,CPHA0)时钟空闲高数据在SCK下降沿采样上升沿变化。Mode 3 (CPOL1,CPHA1)时钟空闲高数据在SCK上升沿采样下降沿变化。一个至关重要的区别CPHA还影响了SS引脚的作用。当CPHA0时SS引脚必须在每个字节传输之前被拉低并在传输之间拉高。SS的下降沿实际上启动了传输并锁存了第一个数据位。因此对于连续的多个字节传输SS需要在字节间“闪烁”一下。当CPHA1时SS引脚可以在整个通信会话期间保持低电平只要是从设备被选中。第一个SCK边沿此时SS已为低才开始锁存数据。这使得CPHA1模式在传输长数据流时更高效。配置口诀“看数据手册”目标外设的数据手册会明确规定其所需的SPI模式。配置错误是导致SPI通信失败的最主要原因。3.3 SPI寄存器配置与数据传输流程3.3.1 串行外设控制寄存器SPCR - $1028SPE (位6)SPI系统总使能必须置1。MSTR (位4)主模式选择。1为主机0为从机。CPOL/CPHA (位3/2)如上所述配置时钟极性和相位。SPR1/SPR0 (位1/0)在主模式下选择SCK波特率对从模式无效。分频系数基于内部处理器时钟E时钟。00: E/201: E/410: E/1611: E/32 例如E2MHz时最高SPI时钟频率为1MHzSPR00最低为62.5kHzSPR11。3.3.2 串行外设状态寄存器SPSR - $1029SPIF (位7)SPI传输完成标志。当一次8位数据移入/移出完成后该位由硬件置1。清除该标志的方法非常特殊且重要必须先读取SPSR此时SPIF1然后再访问SPDR读或写均可。这个顺序是硬性要求。WCOL (位6)写冲突标志。如果在一次SPI传输尚未完成SPIF0时程序试图向SPDR写入新数据该位置1。写入的数据会丢失。同样通过先读SPSR再访问SPDR来清除。MODF (位4)模式错误标志。仅在主模式下有意义。当主设备的SS引脚被意外拉低例如总线冲突时该位置1。硬件会自动清除SPE和MSTR位将SPI强制设为从模式并将相关DDRD位清零。这是一个硬件保护机制。清除方法先读SPSR再写SPCR。3.3.3 主模式数据传输流程查询方式// 假设已正确初始化SPI为主模式CPOL0 CPHA0 void SPI_Master_Transmit(uint8_t data) { // 等待上一次传输完成 while(!(SPSR 0x80)); // 等待SPIF置位 // 清除SPIF标志读SPSR 写SPDR uint8_t dummy SPSR; // 读取SPSR此时SPIF1 SPDR data; // 写入要发送的数据同时清除SPIF // 等待本次传输完成 while(!(SPSR 0x80)); dummy SPSR; // 再次清除SPIF标志 // 此时接收到的数据已在SPDR中 uint8_t received_data SPDR; }注意上述代码中dummy SPSR; SPDR data;这两行顺序不可颠倒。这是清除SPIF标志并启动新传输的标准操作。3.3.4 从模式数据接收流程从设备的配置相对简单。设置MSTR0SPE1并正确配置CPOL和CPHA以匹配主机。数据传输完全由主设备的SCK驱动。当主设备拉低从设备的SS引脚并产生SCK时钟时从设备的移位寄存器开始工作。从设备将预先写入其SPDR的数据如果需要发送通过MISO线移出同时将主设备从MOSI线移入的数据存入移位寄存器。8个时钟后传输完成从设备的SPIF标志也会置1。从设备的CPU可以查询或通过中断如果SPIE使能来读取SPDR中的数据并准备下一个要发送的字节如果需要。3.4 常见问题与高级应用技巧3.4.1 多从机系统连接连接多个SPI从设备有两种主流方式独立片选Independent Slave Select主设备为每个从设备提供独立的SS线。通信时只拉低目标从机的SS线。这是最清晰、干扰最小的方式但需要占用更多主设备I/O口。菊花链Daisy-Chaining所有从设备的SS线连接在一起由主设备统一控制。从设备的MISO连接到下一个从设备的MOSI形成一个环。数据在主设备和从设备链中依次传递。这种方式节省I/O但要求所有从设备都支持菊花链模式且通信协议需要特殊设计例如发送N个字节才能让数据到达链末端的设备。3.4.2 模式错误MODF的处理在主模式下SS引脚必须被配置为输出并置高或通过上拉电阻保持高电平。如果它被意外拉低例如另一个设备试图成为主机或电路短路就会发生模式错误。; MODF错误处理例程 BRCLR SPSR, #%00010000, NO_MODF ; 检查MODF标志 ; 发生模式错误 LDAA SPSR ; 1. 读取SPSR清除MODF和SPIF LDAA SPDR ; 2. 读取SPDR可选清除可能的标志 ; 3. 重新配置SPI和端口 LDAA #%00000100 ; 设置PD2(SS)为输出 STAA DDRD LDAA #%00000100 ; PD2输出高电平 STAA PORTD LDAA #%01010000 ; 重新使能SPI为主模式 (MSTR1, SPE1) 根据实际设置CPOL/CPHA/SPR STAA SPCR NO_MODF: ; ... 其他处理3.4.3 提高SPI通信可靠性的技巧上拉电阻在SS、SCK、MOSI线上添加弱上拉电阻如10kΩ可以防止总线在空闲时浮空提高抗干扰能力。电源去耦在每个SPI设备的电源引脚附近放置一个0.1uF的陶瓷电容滤除高频噪声。阻抗匹配与线长对于高速SPI1MHz或长走线10cm需要考虑信号完整性问题可能需要在驱动端串联小电阻如22-100Ω以减小振铃。软件流控对于没有硬件SS控制的从设备或使用GPIO模拟SS确保在字节传输间隙正确处理SS信号特别是在CPHA0模式下。双缓冲读取MC68HC11A8的SPI接收是双缓冲的。这意味着当SPIF置位时数据已经从移位寄存器转移到了读缓冲区。你可以在处理当前数据的同时移位寄存器已经开始接收下一个字节。但是必须在下一个字节完全移入之前读取当前数据否则会发生覆盖类似于SCI的OR错误。在中断服务程序中应尽快读取SPDR。4. SCI与SPI的工程应用对比与选型理解了原理和配置在实际项目中如何选择SCI和SPI呢这完全取决于应用场景的需求。SCI异步串行适用于长距离通信通过RS-232、RS-485电平转换通信距离可达几十米甚至上千米。点对点或简单总线如连接上位机PC、调制解调器、GPS模块、蓝牙串口模块。对实时性要求不高由于有起始/停止位开销效率相对较低典型波特率在9600-115200之间。需要硬件流控可以通过RTS/CTS信号线实现MC68HC11A8需用其他I/O模拟。多机网络利用其唤醒功能构建简单的主从网络。SPI同步串行适用于板级短距离高速通信通常在同一块PCB上或通过排线连接距离一般不超过30厘米。与高速外设通信如Flash存储器NOR/NAND、SD卡SPI模式、高速ADC/DAC、显示屏控制器、数字传感器如IMU。全双工、高吞吐量需求没有起始/停止位时钟线同步效率接近100%时钟频率可达MHz级别。简单的主从控制连接多个外设通过片选信号管理。混合应用案例一个典型的数据采集系统可能这样设计MC68HC11A8作为主控制器通过SPI以高速读取本地的温度传感器如MAX6675和ADC芯片同时通过SCI以较低的波特率将汇总的数据发送给远端的工控PC或通过无线数传模块上传。SPI负责“快采”SCI负责“远传”各司其职。5. 调试经验与故障排查实录无论理论多么清晰实际调试中总会遇到问题。以下是一些血泪教训总结出的排查清单SCI通信失败排查双方波特率绝对一致吗这是最常见的问题。不仅数值要一致生成波特率的时钟源晶振频率也要计算准确。用示波器测量TxD引脚输出的位宽度计算实际波特率。数据格式匹配吗数据位8/9、停止位MC68HC11固定为1、有无奇偶校验MC68HC11不支持硬件奇偶校验需软件实现必须一致。电平兼容吗MC68HC11是TTL电平0V/5V直接连接PC的RS-232口±12V会损坏芯片必须使用MAX232之类的电平转换芯片。中断服务程序清除了标志吗读取SCSR后是否按照读SCSR - 读/写SCDR的顺序正确清除了RDRF/TDRE等标志标志未清除会导致后续中断无法触发。有没有超限错误OR如果RDRF置位的同时FE也置位可能是OR错误。检查接收中断服务程序是否执行时间过长或者是否在某些分支中漏读了SCDR。线路噪声大吗长距离通信时NF标志可能频繁置位。考虑使用屏蔽线、增加终端电阻、或降低波特率。SPI通信失败排查时钟模式CPOL, CPHA匹配吗用逻辑分析仪或示波器同时抓取SCK、MOSI和SS信号对照数据手册的时序图检查数据采样边沿是否正确。这是SPI调试的第一步也是最重要的一步。片选信号SS正确吗在从模式下SS必须在数据传输前拉低并保持。在主模式下SS必须配置为输出高电平或断开否则会触发MODF错误。主从设备初始化顺序对吗通常应先初始化从设备再初始化并启动主设备。避免主设备开始发时钟时从设备还未准备好。SPIF标志清除顺序对吗必须严格遵守“先读SPSR再访问SPDR”的铁律。是否存在写冲突WCOL在查询方式下向SPDR写数据前必须等待SPIF1。在中断方式下确保中断服务程序足够快避免在上一次传输未完成时再次进入中断并写SPDR。MISO/MOSI线接反了吗主设备的MOSI应接从设备的MOSI主设备的MISO应接从设备的MISO。听起来像废话但接反是常见错误。电源和地是否稳定SPI对电源噪声比较敏感确保所有设备共地良好电源干净。工具推荐逻辑分析仪调试SPI和SCI的终极利器。可以直观地看到每一位数据、时钟边沿和帧结构任何时序问题无所遁形。Saleae Logic系列是性价比之选。示波器测量波特率、观察信号质量过冲、振铃、检查噪声。串口调试助手对于SCI在PC端验证数据收发是否正确。掌握MC68HC11A8的SCI和SPI不仅仅是记住寄存器地址和比特位更是理解其设计哲学通过硬件机制如过采样、多数表决、双缓冲、模式错误保护来简化软件设计提高通信可靠性。在资源受限的8位单片机时代这些精妙的设计体现了极高的工程智慧。即使在今天许多现代MCU的串行通信控制器仍沿袭着类似的设计思路。透彻理解这些经典接口会让你在面对任何新的通信协议时都能快速抓住其本质。