SPI协议极简指南:STC8H的四种时钟模式详解(含代码示例)
如果你曾经在嵌入式项目中尝试连接一块SPI Flash、一个显示屏或者一个传感器,大概率遇到过这样的场景:硬件连接看起来没问题,代码逻辑也反复检查过,但设备就是“沉默不语”,数据死活读不出来。很多时候,问题的根源并非硬件损坏或代码错误,而是那个看似不起眼的时钟配置——CPOL和CPHA。这两个参数决定了数据在时钟的哪个边沿被采样和输出,一旦与从设备的要求不匹配,通信就会彻底失败。对于使用STC8H这类增强型8051内核单片机的开发者来说,虽然其硬件SPI模块已经大大简化了配置,但深入理解这四种时钟模式的底层时序,依然是解决疑难杂症、优化通信稳定性的关键。这篇文章将抛开复杂的理论堆砌,直接从实战角度切入,为你拆解SPI时钟的四种组合模式,并结合STC8H的寄存器配置与软件模拟实现,提供即拿即用的代码示例,让你不仅能“配得对”,更能“懂得透”。
1. 拨开迷雾:重新认识SPI的时钟极性(CPOL)与相位(CPHA)
很多人初次接触SPI协议时,会被CPOL和CPHA这两个术语绕晕。教科书式的定义往往过于抽象,我们不妨换一种更直观的理解方式:把SPI通信想象成两个人(主机和从机)在按照固定的节奏传递纸条。时钟信号(SCK) 就是这个节奏的指挥棒,它决定了“什么时候递出纸条”以及“什么时候接收纸条”。CPOL和CPHA就是定义这个节奏规则的两个核心参数。
时钟极性 CPOL (Clock Polarity):它定义了指挥棒(SCK)在“休息”(空闲状态)时的姿势。
- CPOL = 0:指挥棒在休息时是“放下”的(低电平)。当它开始挥动(有效状态)时,会从“放下”变为“举起”(上升沿)。
- CPOL = 1:指挥棒在休息时是“举起”的(高电平)。当它开始挥动时,会从“举起”变为“放下”(下降沿)。
时钟相位 CPHA (Clock Phase):它定义了纸条(数据)传递和接收的具体时机,是紧跟着指挥棒挥动的第一个动作还是第二个动作。
- CPHA = 0:数据在指挥棒挥动的第一个边沿被采样(接收),在下一个边沿被改变(发送)。注意,对于CPHA=0,数据输出会提前半个周期准备好。
- CPHA = 1:数据在指挥棒挥动的第二个边沿被采样(接收),在同一个边沿被改变(发送)。
将这两个参数组合,就得到了SPI的四种工作模式,通常被称为 Mode 0, 1, 2, 3。它们的对应关系如下表所示:
| 模式名称 | CPOL | CPHA | SCK空闲电平 | 数据采样边沿 | 数据输出边沿 |
|---|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低电平 | 上升沿 | 下降沿 |
| Mode 1 | 0 | 1 | 低电平 | 下降沿 | 上升沿 |
| Mode 2 | 1 | 0 | 高电平 | 下降沿 | 上升沿 |
| Mode 3 | 1 | 1 | 高电平 | 上升沿 | 下降沿 |
提示:记忆窍门——采样边沿是关键。Mode 0和Mode 3都是在SCK的上升沿采样数据;而Mode 1和Mode 2则是在下降沿采样数据。区分它们看的是空闲电平(CPOL)。
为什么需要四种模式?这源于不同半导体厂商在早期设计SPI设备时的不同选择。例如,Microchip的某些EEPROM偏爱Mode 0,而TI的某些ADC可能使用Mode 3。因此,在初始化任何SPI从设备前,第一要务就是查阅其数据手册,确认它支持哪种时钟模式。STC8H作为主机,其硬件SPI模块可以灵活配置这四种模式,以适应各种外设。
5467



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



