#申请原创#
@21小跑堂
SPI是我们在工作中会经常使用到的一种串行外设总线,MCU和很多外置芯片的通信都是基于SPI总线进行的。在SPI中有两个特别重要的概念决定了SPI的工作模式,即时钟极性(Clock Polarity,CPOL)和时钟相位Clock Phase,CPHA),很多初学者可能对这两个概念的具体含义和代码如何配置等方面不是很清楚,之前面试软件工程师时,能完全回答清楚的也寥寥无几,鉴于此,作者就通过这篇文章给大家详细阐述一下CPOL和CPHA。 CPOL: 指的是时钟空闲时的电平状态,即0表示空闲时低电平,1表示空闲时高电平; CPHA: 指的是数据采样边沿,即0表示第一个边沿采样,1表示第二个边沿采样。 这样的话,CPOL和CPHA的取值就决定了SPI具有四种工作模式,如下表所示: 工作模式 | | | | | Mode0 | | | | | Mode1 | | | | | Mode2 | | | | | Mode3 | | | | |
我们随便找个32位MCU来看下SPI外设库的这两个参数的配置信息: SPI外设初始化信息的结构体里就有这两个参数,并且直接定义为枚举类型:
再看下每个参数的枚举信息,也会有对应的注释,说的很清楚:
也与前文描述的完全一致,其他MCU的配置基本上大同小异。 因此,SPI主从设备必须配置相同的CPOL和CPHA才能确保通信时序一致和数据传输正常。 那如果刚接触一个新的使用SPI进行通信的芯片,要如何配置MCU的SPI的CPOL和CPHA呢? 我们在做嵌入式软件开发时,更多的场景应该都是MCU作为SPI主机使用,因此这个时候SPI的CPOL和CPHA究竟要怎么配置?那就需要你去解读SPI从机,即外置芯片的数据手册了(一定要学会“会看”芯片收据手册datasheet),从中获取到CPOL和CPHA的相关信息。 先用最简单的方式: 尝试用以下的关键词进行搜索: SPI Mode,CPOL,CPHA,Serial Interface,Clock Polarity/Phase等等; 比如作者现在用的一款ADC芯片,其数据手册里就有关于这方面的说明:
那MCU按如下配置为工作模式Mode1即可:
再用高级的方式: 如果以上方式不能解决问题,那可以尝试通过解读SPI通信时序的方式来确定SPI工作模式: 如何判断CPOL:CLK的空闲时候的电平决定了CPOL是0还是1,即CLK空闲时为0,则CPOL就为0,否则CPOL就为1; 如何判断CPHA:数据采样时刻对应着的CLK的电平,是第一个边沿还是第二个边沿,决定CPHA为0还是1; 比如下面这个芯片的时序图,SCLK空闲时为低电平,数据采样时刻在第一个上升沿,因此CPOL为0,CPHA为0,即SPI工作模式为Mode0。
不过有些芯片的数据手册里即没有明确的文字说明,其时序图也不明显,比如下面这个时序图就很难判断SPI的工作模式,这个时候你只能尝试其他方式来识别了。
其他方式: 可以直接咨询芯片FAE,获取官方的demo驱动代码,这种方式其实是比较好的,一步到位; 如果是常用芯片,网上一般都有驱动代码资料可以下载; 实在不行,还可以尝试逐个工作模式,偏向于学习和研究。 以上作者介绍了SPI的时钟极性和时钟相位,以及实际应用时如何根据芯片来配置SPI的工作模式。
|
详解SPI总线通信中的极性和相位,带你看懂SPI的时序图。
@21小跑堂 管理员,你好,求原创审核哦!