1. 项目概述:MC9S08SE8的通信与定时控制核心
在嵌入式开发,尤其是工业控制、电机驱动和智能传感器节点这类对实时性和可靠性要求苛刻的领域,微控制器(MCU)的片上外设配置与底层驱动开发是决定项目成败的关键。Freescale(现NXP)的MC9S08SE8系列MCU,作为经典的8位HCS08内核产品,以其高性价比和丰富的外设资源,至今仍在许多成本敏感且要求稳定的项目中占据一席之地。这次,我们不谈空洞的理论,直接切入两个最常用也最考验工程师功底的模块:串行通信接口(SCI)和定时器/脉宽调制模块(TPM)。SCI负责让MCU“开口说话”与“侧耳倾听”,实现与上位机、传感器或其他控制器稳定可靠的数据交换;而TPM则是MCU的“心跳”和“指挥棒”,精准地生成定时信号、捕获外部事件,特别是产生驱动电机、调节LED亮度或控制电源的核心信号——PWM。理解这两个模块的寄存器级操作逻辑、时序细节以及那些手册上可能一笔带过但实践中却至关重要的“坑”,是摆脱库函数依赖、写出高效稳定底层代码的必经之路。本文将以MC9S08SE8的数据手册为蓝本,结合我多年在工控和电机驱动项目中的实际踩坑经验,为你深入解析SCI串口通信与TPM定时器PWM功能的实现精髓。
2. SCI串口通信:从帧格式到可靠传输的深度剖析
串口通信,看似简单,无非是TX(发送)、RX(接收)两根线,但要想在复杂的电磁环境中实现长时间、无差错的数据传输,就必须吃透其底层机制。MC9S08SE8的SCI模块(S08SCIV4版本)提供了一个全双工、异步的串行通信接口,支持多种可配置的工作模式。
2.1 发送器(Transmitter)工作机制与关键细节
发送器的核心任务是将并行数据装入发送数据寄存器(SCID),然后由硬件自动转换为包含起始位、数据位和停止位的串行比特流,从TXD引脚送出。使能发送(TE=1)后,一旦发送数据寄存器空(TDRE=1),我们就可以写入下一个要发送的字节。
2.1.1 发送Break字符与队列空闲(Idle)字符
这是两个用于通信协议控制的特殊功能,常用于多机通信或唤醒处于睡眠模式的接收器。
- 发送Break字符 :通过置位SCIC2寄存器中的SBK位来发起。Break字符是一个持续时间为完整字符帧长度的逻辑‘0’信号(通常为10个比特时间,包括起始位和停止位)。它的传统用途是引起老式电传打字机的注意,在现代协议中常作为帧错误或复位信号。手册中特别强调了一个关键操作顺序:通常,程序应等待TDRE置位(表示上一个数据字符已移入发送移位器),然后先写1再写0到SBK位。这个“1->0”的跳变会将一个Break字符 排队 ,一旦发送移位器空闲,就会立即发送。如果当排队的Break字符开始移入移位器时SBK位仍为1,则 会自动再排队一个Break字符 。这意味着如果软件不清零SBK,Break字符会连续发送。接收方(如果是另一颗Freescale SCI)会将Break字符识别为数据位全0并伴随一个帧错误(FE=1)。
- 队列空闲字符 :在采用空闲线唤醒(Idle-Line Wakeup)的多机通信中,需要在消息之间插入一个完整的字符时间的空闲状态(逻辑‘1’)来唤醒处于“睡眠”状态的接收器。操作流程是:等待TDRE置位,然后 先写0再写1到TE位 。这个“0->1”的跳变会排队一个空闲字符。这里有一个极易忽略的硬件细节:只要移位器中的字符没有发送完成,即使TE被临时清零,SCI发送器实际上 并未释放对TXD引脚的控制权 。但是,如果存在移位器在TE=0期间发送完毕的可能性(例如在极低波特率下),为了确保TXD线始终保持正确的空闲(高电平)状态, 必须预先将共享TXD功能的GPIO引脚配置为输出高电平 。这是一个重要的硬件防错设计。
2.1.2 关闭发送器(TE=0)的注意事项
直接清零TE位并不会立即将TXD引脚释放为通用IO。任何 正在进行中的发送活动都必须先完成 。这包括:正在移位发送的数据字符、已排队的空闲字符、已排队的Break字符。在关闭发送器前,务必通过查询TC(发送完成)标志位来确认所有排队任务均已结束,否则可能导致最后一个字符被截断。
2.2 接收器(Receiver)的数据采样与同步艺术
接收器的任务是从RXD引脚恢复出串行数据,其可靠性极大程度上依赖于精准的采样和抗噪声设计。
2.2.1 16倍过采样与起始位检测
SCI接收器使用一个16倍于波特率的时钟进行采样。它并非在每位中间只采样一次,而是采用了一套智能的同步和表决机制:
- 寻找下降沿 :接收器持续以16倍波特率采样RXD引脚,寻找起始位的下降沿。一个有效的下降沿定义为:在连续3个采样点为逻辑‘1’之后,出现一个逻辑‘0’的采样点。
- 起始位验证 :当检测到潜在下降沿后,接收器会在RT3、RT5、RT7时刻(将1个比特时间16等分后的第3、5、7个采样点)再次采样。如果这3个采样点中至少有2个是‘0’,接收器才确认这是一个真正的起始位,并与字符帧同步。
- 数据位判决 :对于每个数据位(包括起始位和停止位),接收器在RT8、RT9、RT10时刻进行采样。该位的最终逻辑值由这三个采样点的 多数表决 决定。这种“三取二”的机制能有效抑制线上的毛刺噪声。如果任何一个比特时间内(包括起始位和停止位)的采样值与该比特的最终判决值不一致,噪声标志(NF)会在该字符被移入接收数据缓冲区时置位。
2.2.2 接收错误处理与状态机
- 帧错误(FE) :当停止位被检测为‘0’时发生(Break字符也会导致FE)。发生帧错误后,接收器会被 禁止 接收新字符,直到FE标志被软件清除。这是一个关键的保护机制,防止在通信线缆断开或严重干扰下接收乱码。
- 溢出错误(OR) :当接收数据寄存器已满(RDRF=1),而移位器又准备好一个新字符时,新字符会丢失,OR标志置位。由于SCI接收器是双缓冲的,从RDRF置位到发生溢出,软件有 一整字符的时间 来读取数据寄存器(SCID)。在高速或中断服务程序中,必须高效处理接收数据以避免溢出。

264

被折叠的 条评论
为什么被折叠?



