1. 项目概述与SCI模块核心价值
在嵌入式开发的世界里,串行通信接口(SCI)就像设备之间的“通用语言”,是微控制器与传感器、存储器、显示屏乃至另一颗MCU进行对话的基石。无论是调试信息的打印、传感器数据的采集,还是复杂的总线通信,都离不开SCI的稳定工作。瑞萨电子的RA8T1微控制器,作为一款面向高性能实时控制应用的芯片,其内置的SCI模块功能之丰富、配置之灵活,堪称同类产品中的佼佼者。它不仅仅是一个简单的UART,更是一个集成了异步(UART)、同步(SPI)、I2C乃至LIN、智能卡等多种协议的多面手。
然而,强大的功能往往伴随着复杂的配置。面对动辄数十页的数据手册和密密麻麻的寄存器位域,很多开发者容易陷入“知其然,不知其所以然”的困境:照着例程代码配置或许能通,但一旦通信出现时序不稳、数据错位或中断响应不及时等问题,排查起来就异常困难。其根本原因在于,没有真正理解那些关键控制寄存器——如CCR3、CCR4、ICR和FCR——每一位背后所代表的物理意义和时序逻辑。
本文将以RA8T1的SCI模块为例,抛开枯燥的寄存器列表,从实际工程应用的角度,深入剖析这几个核心控制寄存器的设计哲学与配置精髓。我们将重点关注它们如何协同工作,塑造出不同的通信模式,并解决实际开发中常见的时序、效率和可靠性问题。理解这些,你不仅能写出更健壮的驱动代码,更能具备快速定位和解决复杂通信故障的能力。
2. 核心寄存器功能全景与设计思路拆解
在深入每个寄存器之前,我们有必要先建立一个全局视图。RA8T1的SCI模块是一个高度可配置的通信引擎,其设计核心在于通过寄存器将复杂的通信协议分解为一系列可控的硬件行为。
2.1 寄存器分工与协同逻辑
SCI模块的配置寄存器众多,但CCR3、CCR4、ICR和FCR是其中控制“行为模式”和“数据流”的关键。
- CCR3(通用控制寄存器3):这是SCI的“模式选择器”和“基础参数设定器”。它决定了通信的“根本大法”:是采用异步的UART、同步的SPI,还是基于时钟的I2C?数据是高位先传(MSB)还是低位先传(LSB)?时钟极性和相位如何?是否启用FIFO?它设定了通信的骨架。
- CCR4(通用控制寄存器4):这是SCI的“时序微调师”。在骨架搭建好后,CCR4负责精细的“化妆”。在高速或长距离通信中,信号可能会产生畸变或偏移。CCR4提供的发送时序调整(ATEN, ATT, AET)和接收采样点调整(ASEN, AST, AJD)功能,允许开发者对信号波形进行纳秒级的校准,从而极大提升通信的鲁棒性。此外,它还包含地址匹配比较数据(CMPD),用于多机通信中的硬件地址过滤。
- ICR(简单I2C控制寄存器):当CCR3将模式选定为“简单I2C模式”后,ICR就成为了I2C协议的执行指挥官。它专门用于生成I2C协议特有的起始(START)、重复起始(ReSTART)、停止(STOP)条件,控制SDA/SCL线的输出状态(高阻、拉低、数据),并管理ACK/NACK响应。它是硬件实现I2C协议状态机的核心。
- FCR(FIFO控制寄存器):这是SCI的“数据流量控制器”。在启用FIFO模式(CCR3.FM=1)后,FCR决定了何时触发中断(TTRG, RTRG),如何复位FIFO(TFRST, RFRST),以及在硬件流控制中,RTS信号何时被置位(RSTRG)。合理配置FCR可以大幅降低CPU中断负载,优化系统实时性。
它们之间的关系可以这样理解:CCR3定义了“我们要进行何种对话”,CCR4确保了“对话的时机精准无误”,ICR(在I2C模式下)规定了“对话的特殊礼仪”,而FCR则管理着“对话内容的缓冲与调度”。
2.2 关键配置路径与依赖关系
配置SCI时,必须遵循一定的顺序和依赖,否则可能导致模块无法正常工作或行为异常。一个稳健的配置流程通常如下:
- 全局使能与复位:首先确保模块时钟已开启,然后对SCI模块进行软件复位(如果支持),使其进入已知的初始状态。
- 模式与基础配置(CCR3):这是第一步。在收发器禁用(CCR0.TE=0, RE=0)的情况下,设置CCR3中的
MOD[2:0]选择通信模式,配置CHR[1:0](字长)、STP(停止位)、LSBF(字节序)等。特别注意:CPHA和CPOL(用于SPI/同步模式)也必须在此阶段设置。 - 波特率生成器配置:根据CCR3选择的模式(如同步/异步)和时钟源(CKE[1:0]),去配置波特率寄存器(BRR, MDDR等)。这是通信速率的基础。
- 高级功能与微调(CCR4):在基础通信能工作后,根据实际物理链路情况,考虑是否启用CCR4的时序调整功能。例如,在115200bps以上的异步通信中,启用接收采样点调整(ASEN)并微调
AST值,可以补偿线路延迟,提高容错率。 - 协议特定配置(ICR):如果工作在I2C模式,则需要配置ICR寄存器,设置SDA输出延迟(
IICDL)、选择中断模式(IICINTM)等。注意:I2C的起始/停止条件生成(IICSTAREQ,IICSTPREQ)是动态操作的,不属于初始化静态配置。 - 数据流与中断配置(FCR及其他):如果使用FIFO,则配置FCR中的触发阈值(
TTRG,RTRG)。然后配置中断使能寄存器(如CCR0中的TIE, RIE, ERIE等),最后才使能收发器(CCR0.TE=1, RE=1)。
关键经验:永远记住“先静后动”的原则。所有影响硬件时序和模式的位(主要在CCR3),必须在收发器禁用时配置。而像FIFO触发阈值、中断使能这类控制“软件交互”的位,可以在模块使能前或使能后动态调整,但调整时需注意可能产生的瞬时状态。
3. CCR3寄存器:通信模式的基石与深度解析
CCR3寄存器是SCI模块的“总开关”和“模式盘”,其每一位的选择都深刻影响着数据收发的硬件行为。我们逐位拆解其背后的工程考量。
3.1 通信模式选择(MOD[2:0]):奠定协议基础
MOD[2:0]这三位是CCR3的灵魂,它决定了SCI硬件将按照哪种协议规则来解读和生成信号。
- 000b (异步模式):这是最经典的UART模式。通信双方依靠预定义的波特率进行自同步,无需时钟线。其核心价值在于简单、可靠、仅需两根线(TX, RX),广泛应用于调试日志、GPS模块、蓝牙模组等。RA8T1的异步模式还支持多处理器通信(MP位)和可变数据长度。
- 010b (时钟同步模式) / 011b (简单SPI模式):这两种模式都需时钟线(SCK)。同步模式更通用;而简单SPI模式则硬件实现了SPI协议中CPOL和CPHA的四种组合,并自动管理SS(片选)信号(需配合其他功能)。选择依据:如果你的外设是标准的SPI设备,优先使用“简单SPI模式”,硬件处理更高效;如果是自定义的同步协议,则用“时钟同步模式”更灵活。
- 100b (简单I2C模式):此模式下,SCI硬件将遵循I2C协议,通过ICR寄存器生成START/STOP条件,并管理ACK。这极大地减轻了CPU用GPIO模拟I2C时序的负担,尤其在高波特率下优势明显。
- 其他模式:如智能卡模式(001b)、曼彻斯特编码模式(101b)、LIN模式(110b),针对特定行业应用,提供了硬件级的编解码支持,提升了集成度和可靠性。
配置陷阱:
MOD[2:0]的改变会直接影响SCKn引脚的功能(时钟输入/输出/GPIO)。如果在通信过程中动态切换模式,必须首先禁用收发器(TE=RE=0),否则可能导致引脚冲突或总线竞争。
3.2 时钟与相位控制(CPOL, CPHA, CKE[1:0]):同步通信的节拍器
在同步模式(SPI/时钟同步)下,时钟的极性和相位决定了数据采样的边缘,这是SPI设备匹配的关键。
- CPOL (时钟极性):决定SCK空闲时的电平。
0: SCK空闲为低电平。数据在SCK上升沿或下降沿变化/采样(由CPHA决定)。1: SCK空闲为高电平。这是另一种常见配置。
- CPHA (时钟相位):决定数据在时钟的哪个边沿被采样。
0: 数据在第一个时钟边沿(若CPOL=0则为上升沿,CPOL=1则为下降沿)被采样,在第二个边沿变化。1: 数据在第二个时钟边沿变化,在第一个边沿被采样。
CPOL和CPHA的组合构成了SPI的四种模式(Mode 0-3)。你必须查阅外设数据手册,确保主从设备的模式完全一致,否则数据会完全错乱。
- CKE[1:0] (时钟使能):此位决定了时钟的来源和SCK引脚的角色,与
MOD[2:0]紧密耦合。- 在异步模式下:
00b使用内部波特率发生器,SCK引脚可作为GPIO;01b则会将内部波特率时钟输出到SCK引脚,可用于调试或作为其他设备的时钟源;10b/11b选择外部时钟或GPT时钟输入,适用于需要高精度或特殊时钟源的场景。 - 在同步/SPI主模式下:
00b/01b选择内部时钟,SCK作为输出;10b/11b选择外部时钟,SCK作为输入(从模式)。 - 在I2C模式下:此位设置无效,SCK(SCLn)引脚功能由ICR寄存器控制。
- 在异步模式下:
3.3 数据格式与控制(CHR, LSBF, SINV, STP):帧结构的塑造者
这部分配置定义了单个数据帧的形态。
- CHR[1:0] (字符长度):选择7/8/9位数据位。9位数据常用于多处理器通信或带奇偶校验的扩展模式。
- LSBF (字节序):
0为MSB-first(最高位先发),这是最常见设置;1为LSB-first。特别注意:有些古老的设备或特定协议(如某些LIN总线)可能要求LSB-first,务必核对。 - SINV (数据反转):这是一个非常实用的功能。当
SINV=1时,发送和接收的数据位会进行逻辑取反。应用场景:如果你的硬件电路上TX/RX线接反了,或者电平转换芯片导致信号反相,你可以通过设置此位在软件层面进行纠正,而无需改动硬件。它不影响校验位,校验位反转需通过CCR1.PM位控制。 - STP (停止位长度):
0为1位停止位,1为2位停止位。增加停止位长度可以给接收端更多的时间处理数据,在较低波特率或噪声较大的环境中有助于提高可靠性。注意:在接收时,硬件只检查第一个停止位,第二个停止位若为0会被视为下一帧的起始位。
3.4 高级功能使能(MP, FM, DEN):扩展应用场景
- MP (多处理器模式):在异步模式下启用后,硬件会检查接收数据的第9位(当CHR选择9位时)。如果第9位为1,则该数据被视为地址帧,所有从机都会接收并比对地址;如果第9位为0,则为数据帧,只有地址匹配的从机才会接收。这为构建一主多从的异步总线网络提供了硬件支持。
- FM (FIFO模式):这是提升CPU效率的关键。当
FM=1时,发送和接收缓冲区变为FIFO(先入先出队列),深度通常为多个字节(具体深度需查数据手册)。结合FCR寄存器的触发阈值配置,可以做到“攒够一批数据”或“缓冲区快空时”才触发一次中断,极大减少中断频率,适合高速数据流。 - DEN (驱动器使能):用于RS-485半双工通信。置1后,SCI可以控制一个额外的DE(驱动器使能)引脚,在发送数据时自动使能外部RS-485收发器,发送完毕后自动关闭,实现自动方向控制,简化软件设计。
4. CCR4寄存器:时序微调与可靠性保障
如果说CCR3搭建了舞台,那么CCR4就是负责灯光和音效的精细调整师,尤其在高速或严苛的通信环境中,它的作用至关重要。
4.1 接收采样时序调整(ASEN, AST[2:0], AJD):捕捉最佳数据点
在异步通信中,接收端会在每个数据位的中间点进行采样,以获得最稳定的值。然而,时钟误差、传输线延迟、噪声干扰都可能导致发送端的位中心与接收端的采样点发生偏移。当偏移超过半个位周期时,就会发生采样错误。
CCR4的接收采样调整功能就是为了纠正这个偏移。
- ASEN:使能此功能。
- AST[2:0]:调整量。调整时间 = 基础时钟周期 × AST值。基础时钟通常是波特率时钟的16倍或8倍(取决于CCR2.ABCS)。
- AJD:调整方向。
0向后调整(延迟采样),1向前调整(提前采样)。
如何使用:
- 首先,在稳定的通信环境下,发送一个特定的测试模式(如0x55或0xAA,它们会产生0101交替的方波)。
- 通过示波器同时观察发送端的TX和接收端的RX信号,测量RX信号相对于TX的延迟。
- 计算需要调整的采样点数量。例如,若波特率时钟为16分频(即16个基础时钟周期对应1个数据位),测量到RX延迟了2个基础时钟周期。为了让采样点回到位中心,我们需要将采样点向后延迟2个周期。此时应设置
AJD=0(向后),AST=2。 - 在软件中配置ASEN=1,并设置AST和AJD。重新测试,观察误码率是否降低。
实操心得:这个功能在波特率高于115200bps、通信线缆较长或存在电平转换电路时特别有用。通过示波器进行实测校准,可以将通信误码率降低一个数量级。如果没有示波器,可以尝试发送大量数据并统计误码,通过二分法试探AST的最佳值。
4.2 发送时序调整(ATEN, ATT[2:0], AET):优化信号完整性
与接收调整类似,发送调整允许你微调TX引脚上数据边沿(上升沿或下降沿)的出现时刻。这主要用于匹配特定接收设备的建立时间(Setup Time)和保持时间(Hold Time)要求,或者用于补偿驱动电路本身的延迟。
- ATEN:使能发送时序调整。
- ATT[2:0]:调整量。调整时间 = 基础时钟周期 × ATT值。
- AET:选择调整哪个边沿。它与
CCR1.TINV(发送数据反转)位联合决定。简单来说,它允许你独立调整数据帧起始位边沿(通常是下降沿)或数据位跳变沿的位置。
应用场景:某些老旧的设备或特定标准的接收器对数据边沿的时序有非常严格的要求。通过微调发送边沿,可以确保数据在接收设备的采样窗口内是稳定的。这在驱动高速LED显示屏或某些定制串行协议时可能会遇到。
4.3 地址匹配比较数据(CMPD[8:0]):硬件级多机过滤
在异步多处理器模式(CCR3.MP=1)下,从机需要判断接收到的地址帧是否与自身地址匹配。CCR4.CMPD寄存器用于存储本机的比较地址。
- 当CCR0.DCME(数据比较匹配使能)置1时,硬件会自动将接收到的数据(长度由CHR[1:0]决定,取7/8/9位)与CMPD寄存器中相应的位进行比较。
- 如果匹配,则后续的数据帧(第9位为0)会被正常接收。
- 如果不匹配,则硬件会自动忽略后续的数据帧,直到下一个地址帧到来。
优势:将地址过滤任务从软件(需要中断处理每个字节)转移到硬件,极大地降低了CPU开销,特别适合从机节点众多的网络。
4.4 主模式接收时钟选择(SCKSEL):同步模式下的灵活性
在时钟同步模式或SPI主模式下,通常SCK由主机产生。SCKSEL位提供了一个特殊选项:当SCKSEL=1时,即使在主模式下,接收数据也可以使用内部产生的时钟。这主要用于某些需要主设备同时收发,但对接收时钟有独立要求的特殊场景。在绝大多数标准SPI应用中,此位应保持为0。
5. ICR寄存器:I2C协议的硬件引擎
当CCR3.MOD[2:0]设置为100b(简单I2C模式)时,ICR寄存器便接管了I2C协议的状态控制。它让MCU以“命令”的方式操作I2C总线,而非直接翻转GPIO。
5.1 总线控制与条件生成(IICSTAREQ, IICRSTAREQ, IICSTPREQ)
这是ICR最核心的功能,用于产生I2C总线特有的起始、重复起始和停止条件。
- 操作流程:
- 确保总线空闲(对于START)或忙(对于ReSTART/STOP,且SCL为低)。
- 将
IICSDAS[1:0]和IICSCLS[1:0]同时设置为01b(生成条件模式)。 - 向
IICSTAREQ(或IICRSTAREQ、IICSTPREQ)位写1。 - 硬件会自动在SDA和SCL线上产生符合I2C规范的时序波形。
- 通过查询状态标志位(如IICSTIF)或等待中断,确认条件已生成完成。
关键注意事项:数据手册中明确警告,不能同时设置多个条件生成位为1。操作必须遵循“查询-设置-等待完成”的严格顺序。在条件生成过程中(相应REQ位为1时),不能向其写0,否则会中止生成过程,可能导致总线状态异常。
5.2 引脚输出控制(IICSDAS[1:0], IICSCLS[1:0])
除了生成协议条件,这两个位域还可以直接控制SDA和SCL线的输出状态,这在某些底层操作或总线恢复时非常有用。
- 00b: 串行数据/时钟输出。这是正常数据传输时的状态。
- 10b: 强制输出低电平。可用于在异常时主动拉低总线。
- 11b: 高阻态。释放总线,由上拉电阻拉高。
5.3 SDA输出延迟(IICDL[4:0]):应对高速与容性负载
I2C标准要求SDA的数据变化必须在SCL为低电平时完成,并在SCL高电平期间保持稳定。IICDL位允许你在SDA输出变化和SCL下降沿之间插入一个可编程的延迟(0-31个波特率发生器时钟周期)。
为什么需要这个?在高速I2C(如400kHz Fast-mode 或 1MHz Fast-mode Plus)下,或者总线上挂载了较多设备(容性负载大)时,SDA信号从低到高的上升沿可能变得缓慢。如果SCL下降沿到来时,SDA还未稳定到高电平,就可能被误认为是起始条件(SDA下降沿 while SCL高)或数据错误。通过增加SDA输出延迟,可以确保SCL下降沿时,SDA已经稳定了一段时间,满足了数据建立时间的要求。
配置建议:通常从一个小值(如0x04,延迟4-5个周期)开始测试。在示波器上观察SDA相对SCL下降沿的时序,确保SDA在SCL变低前已稳定。延迟过大会压缩数据有效窗口,延迟过小则可能不稳定,需要根据实际波形调整。
5.4 其他控制位
- IICINTM:选择I2C中断模式。
0为ACK/NACK中断,1为收/发完成中断。根据你的程序流程选择。 - IICCSC:时钟同步控制。强烈建议在正常使用时设置为1。这样,当作为主设备驱动SCL为低时,如果从设备拉低SCL以插入等待(Clock Stretching),主设备的硬件时钟会自动暂停并等待,完全符合I2C协议。仅在调试时可能设为0以强制时钟输出。
- IICACKT:设置ACK应答数据。在主机发送完地址或一字节数据后,设置此位以决定是发送ACK(0)还是NACK(1)。
6. FCR寄存器:高效数据流管理的中枢
在现代嵌入式系统中,CPU时间非常宝贵。频繁的串口中断(每收/发一个字节就中断一次)会严重消耗系统资源。FIFO(先进先出)缓冲区和FCR寄存器正是为了解决这个问题。
6.1 FIFO触发阈值配置(TTRG[4:0], RTRG[4:0])
这是FCR最常用的功能,用于设置中断触发的“水位线”。
- TTRG[4:0] (发送触发值):当发送FIFO中剩余的数据量小于或等于此阈值时,TDRE(发送数据寄存器空)标志置位,若TIE中断使能,则触发发送中断(SCIn_TXI)。这意味着你可以在中断服务程序中一次性填充多个数据到FIFO,直到填满或超过阈值。
- 例:发送FIFO深度为16字节,设置
TTRG=7。当CPU向FIFO写入数据后,只要FIFO中数据量>7,就不会触发发送中断。只有当硬件不断发送导致FIFO数据量降至7或以下时,才触发中断,通知CPU可以补充数据了。这避免了每发送一个字节就中断一次。
- 例:发送FIFO深度为16字节,设置
- RTRG[4:0] (接收触发值):当接收FIFO中积累的数据量大于或等于此阈值时,RDRF(接收数据寄存器满)标志置位,若RIE中断使能,则触发接收中断(SCIn_RXI)。这意味着你可以等收到一批数据后再处理,而不是来一个字节处理一次。
- 例:接收FIFO深度为16字节,设置
RTRG=8。只有当接收到的数据达到或超过8字节时,才触发一次接收中断,CPU可以一次性读取多个字节。
- 例:接收FIFO深度为16字节,设置
阈值设置策略:
- 低延迟优先:对于要求快速响应的场景(如控制指令),设置较小的阈值(如1或2),但中断会频繁。
- 高吞吐量优先:对于大数据量传输(如文件、图像),设置较大的阈值(接近FIFO深度的一半或更多),以减少中断次数,提升整体吞吐率。但单个数据包的响应延迟会变长。
- 动态调整:在复杂的应用中,可以根据通信阶段动态调整阈值。例如,在传输大量数据时用大阈值,在传输关键命令时临时改为小阈值。
6.2 FIFO复位(TFRST, RFRST)
这两个只写位用于软件复位FIFO缓冲区。
- TFRST=1:立即清空发送FIFO。所有尚未发送的数据都将丢失。这在需要紧急中止发送或重新初始化发送通道时使用。
- RFRST=1:立即清空接收FIFO。所有已接收但尚未被CPU读取的数据都将丢失。这在通信协议出错、需要清空缓冲区重新同步时使用。
重要警告:使用复位功能前,最好先禁用相应的中断(TIE/RIE),并在复位操作完成后,重新初始化FIFO指针和状态。有些MCU的FIFO复位操作可能需要几个时钟周期才能生效,操作后应稍作延迟再写入新数据。
6.3 RTS硬件流控制触发(RSTRG[4:0])
当启用RTS/CTS硬件流控制(CCR1.CTSE=0 且 CCR0.SSE=0)并处于FIFO模式时,此位域控制RTSn信号的行为。
- 功能:当接收FIFO中存储的数据量大于或等于
RSTRG设定的阈值时,RTSn引脚输出高电平(无效),通知发送方“暂停发送”。 - 目的:防止接收FIFO溢出。当接收方处理速度跟不上时,RTS信号会告知发送方暂停,从而实现自动的流量控制。
- 设置建议:通常设置为略小于接收FIFO的深度。例如,FIFO深度为16,可设置
RSTRG=12。这样当FIFO有12个数据时,就发出“暂停”信号,为接收方处理预留了4个字节的缓冲时间。
6.4 接收数据就绪错误选择(DRES)
这是一个有趣的位,它改变了“接收数据就绪”这一事件的错误中断归属。
DRES=0(默认):当接收FIFO中有数据(FRSR.DR=1)时,触发接收中断(SCIn_RXI)。DRES=1:当接收FIFO中有数据时,触发接收错误中断(SCIn_ERI)。
应用场景:在某些安全关键或高可靠性的应用中,开发者可能希望将所有“非正常数据接收”的事件都统一到错误中断服务程序(ERI)中进行集中、严格的处理。而将正常的、预期的数据接收流程放在RXI中断中。这提供了另一种中断管理的策略。
7. 实战配置案例与常见问题排查
理解了原理,我们通过两个典型场景来串联这些寄存器的配置。
7.1 案例一:配置115200bps UART,8N1,启用FIFO与RTS/CTS流控
目标:实现一个高速、可靠的全双工UART通信,使用硬件流控制防止数据丢失。
配置步骤:
禁用收发器,配置CCR3:
MOD[2:0]=000b(异步模式)CHR[1:0]=10b(8位数据)STP=0(1位停止位)LSBF=0(MSB先发)SINV=0(数据不反转)FM=1(启用FIFO模式)MP=0(禁用多处理器模式)CKE[1:0]=00b(内部波特率发生器,SCK为GPIO)
配置波特率寄存器:
- 根据系统时钟频率(如PCLKD=50MHz)和所需波特率(115200),查表或计算BRR和MDDR的值。从输入材料中的表格可知,对于50MHz时钟,115200bps可设置
n=0, N=7, M=151(误差0%)。
- 根据系统时钟频率(如PCLKD=50MHz)和所需波特率(115200),查表或计算BRR和MDDR的值。从输入材料中的表格可知,对于50MHz时钟,115200bps可设置
配置CCR4(本例暂不使用时序调整):
ASEN=0,ATEN=0(关闭调整)CMPD根据是否需要多机通信设置。
配置FCR:
TTRG=7(发送FIFO深度假设16,阈值设为7)RTRG=8(接收FIFO深度假设16,阈值设为8)RSTRG=12(RTS触发阈值,用于流控)TFRST=1; TFRST=0(可选,复位发送FIFO)RFRST=1; RFRST=0(可选,复位接收FIFO)
配置流控制和中断:
- 配置CCR1:
CTSE=0(使能CTS输入流控),CRTS=0? (注意:CRTS控制RTS输出,在FIFO+RSTRG模式下,RTS由硬件自动控制,通常CRTS应置为0或根据手册配置)。 - 配置CCR0:
SSE=0(禁用单线半双工),TIE=1(使能发送中断),RIE=1(使能接收中断),ERIE=1(使能错误中断)。
- 配置CCR1:
使能收发器:
- 最后,设置
CCR0.TE=1,CCR0.RE=1。
- 最后,设置
7.2 案例二:配置SPI主模式,Mode 0,CPOL=0, CPHA=0
目标:驱动一个SPI从设备,如Flash或ADC。
配置步骤:
禁用收发器,配置CCR3:
MOD[2:0]=011b(简单SPI模式)CPOL=0,CPHA=0(对应SPI Mode 0)LSBF=0(MSB先发,最常见)FM=1(启用FIFO提升效率)CKE[1:0]=00b(内部时钟,主模式)
配置波特率寄存器:根据从设备支持的最高时钟频率和系统时钟,设置SPI的SCK速率(通过BRR等寄存器)。
配置FCR:类似UART案例,设置合适的TTRG和RTRG。
配置GPIO:将MISO, MOSI, SCK, SS引脚配置为SCI功能。注意:简单SPI模式可能硬件管理SS,也可能需要软件控制GPIO作为SS,需查阅具体章节。
使能收发器:设置
CCR0.TE=1,CCR0.RE=1。
7.3 常见问题排查速查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 完全无通信 | 1. 时钟未使能 2. 引脚复用未配置 3. 收发器未使能(TE/RE) | 1. 检查系统控制器中为该SCI模块提供时钟的位是否开启。 2. 检查GPIO控制器,确认TX/RX/SCK等引脚已配置为SCI功能,而非普通GPIO。 3. 确认CCR0.TE和RE位已置1。 |
| 能发送,不能接收(或反之) | 1. 单方向使能位错误 2. 硬件流控导致阻塞 3. 中断未正确配置 | 1. 检查CCR0.TE和RE位。 2. 检查RTS/CTS流控引脚连接和配置。如果不使用流控,确保CCR1.CTSE和CRTS位配置正确(通常禁用)。 3. 检查CCR0中的TIE/RIE中断使能位,以及NVIC中的中断通道是否开启。 |
| 通信数据错乱 | 1. 波特率不匹配 2. 数据格式不一致(字长/停止位/校验) 3. 时钟相位/极性(CPOL/CPHA)错误(SPI) 4. 字节序(LSBF)错误 | 1. 双方面定波特率,并检查时钟源频率计算是否正确。 2. 确认双方数据位、停止位、奇偶校验位设置完全相同。 3.SPI专属:务必确认主从设备CPOL和CPHA设置一致。 4. 检查CCR3.LSBF位,大多数设备是MSB-first。 |
| 高速通信误码率高 | 1. 信号完整性差(过冲、振铃) 2. 采样点偏移 3. FIFO溢出或触发不当 | 1. 检查PCB走线,必要时串联小电阻(如22Ω)阻尼。 2.对于UART:尝试启用CCR4.ASEN,并用示波器校准AST值。 3. 检查FCR.RTRG/TTRG设置是否过小导致中断过于频繁,或过大导致FIFO溢出。检查中断服务程序处理是否及时。 |
| SPI通信时序不对 | 1. SS片选信号时序问题 2. 时钟极性与相位错误 3. 从设备速度跟不上 | 1. 确认SS信号在数据帧开始前拉低,结束后拉高。检查硬件SS控制或软件GPIO操作时序。 2.最可能原因:用逻辑分析仪抓取SCK、MOSI、MISO波形,与从设备数据手册的时序图对比,确认CPOL/CPHA。 3. 降低SCK时钟频率(调整BRR)测试。 |
| I2C通信卡住,SCL被拉低 | 1. 从设备繁忙(Clock Stretching) 2. 总线冲突或从设备无应答 3. IICDL延迟设置不当 | 1. 确保ICR.IICCSC=1,使主设备支持时钟延长。 2. 检查从设备地址是否正确,电源和上拉电阻是否正常。用逻辑分析仪检查ACK位。 3. 在高速模式下,尝试增加IICDL值,改善SDA建立时间。 |
调试串行通信,一个逻辑分析仪是必不可少的工具。它能直观地展示每一位数据、每一个时钟边沿、每一个协议条件(如I2C的START),是定位上述所有时序和协议问题的最强利器。寄存器配置是骨架,而通过工具观察到的真实波形,才是检验配置正确与否的唯一标准。