【SPI】SPI学习之SPI硬件相关

关联内容:

【SPI】SPI学习之SPI硬件相关

【SPI】SPI学习之SPI驱动相关

【SPI】SPI学习之SPI调试相关


目录

SPI硬件知识

SPI相关的缩写或说法

SPI外部信号描述

SPI硬件寄存器映射

SPI硬件特性

SPI相位和极性

SPI数据传输


SPI硬件知识

SPI相关的缩写或说法

SPI的极性Polarity和相位Phase,最常见的写法是CPOL和CPHA,不过也有一些其他写法,简单总结如下:

  • (1) CKPOL (Clock Polarity) = CPOL = POL = Polarity = (时钟)极性
  • (2) CKPHA (Clock Phase) = CPHA = PHA = Phase = (时钟)相位
  • (3) SCK=SCLK=SPI的时钟
  • (4) Edge=边沿,即时钟电平变化的时刻,即上升沿(rising edge)或者下降沿(falling edge)

对于一个时钟周期内,有两个edge,分别称为:Leading edge=前一个边沿=第一个边沿,对于开始电压是1,那么就是1变成0的时候,对于开始电压是0,那么就是0变成1的时候;Trailing edge=后一个边沿=第二个边沿,对于开始电压是1,那么就是0变成1的时候(即在第一次1变成0之后,才可能有后面的0变成1),对于开始电压是0,那么就是1变成0的时候;


SPI外部信号描述

这一部分列出所有连接或断开芯片的输入/输出引脚的名称与描述。SPIV3模块共有4个外部信号。

  • MOSI——主机输出/从机输入

SPI模块配置为主机时,该引脚用于发送数据;当SPI配置为从机时,该引脚用于接收数据。

  • MISO——主机输入/从机输出

SPI模块配置为主机时,该引脚用于接收数据;当SPI配置为从机时,该引脚用于发送数据。

  • CS———从机选择引脚

SPI配置为主机时,该引脚用于向其它进行数据传输的外设输出一个片选信号。SPI作为从机时,该引脚作为输入用于接收从机选择信号。

注:SS脚是从机选择输入。在数据传输开始前,从机的SS脚必须为低电平。SS必须保持低电平,直到数据传输完成。如果SS变为高电平,SPI将被迫进入空闲模式。

  • SCLK——串行时钟引脚

该引脚用于输出传输数据的时钟,作为从机时,为接收时钟。

SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。


SPI硬件寄存器映射

随便列一个SPI寄存器,参考下

【SPI】SPI学习之SPI硬件相关_第1张图片


SPI硬件特性

  • 全双工
  • 主-从模式

SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCLK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作

SPI只有主模式和从模式之分,没有读和写的说法,因为实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。

  • 相位与极性可以配置

SPI Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse), 时钟脉冲组成了时钟信号(Clock Signal) , 时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样, 来保证数据在两个设备之间是同步传输的.

SPI的相位和极性可以配置(极性比较简单就是CLK空闲时的电平,相位主要是体现什么时候进行数据采集);

SPI总线四种工作方式 SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果 CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设备时钟相位和极性应该一致。

  • 波特率(传输速率)可以调节

SPI的波特率是可以调节的,最大传输速率也可以在dts中进行配置(如果SPI使用适配器,波特率的设置就比较简单通过写入寄存器就好,如果SPI使用GPIO模拟,设置比特率需要通过计算,来等待CLK的变化。);

  • 片选脚的有效电平可以选择

SPI的片选脚(CS)的有效电平可以选择(驱动应提供高电平或者低电平,常见使用SPI协议的设备都是低电平选择有效,在发送msg时选择发送下一个msg可以选择的是否变化片选。);

  • 传输数据的位宽可以调节

SPI的传输数据位宽可以配置(2~32位可调,存在无效位,无效位根据系统的是大端或者小端进行放置。);


SPI相位和极性

【SPI】SPI学习之SPI硬件相关_第2张图片

CPOL和CPHA,分别都可以是0或时1,对应的四种组合就是:

工作模式 \ 相位

CPOL

 CPHA

 mode 0

 0

 0

 mode 1

 0

 1

 mode 2

 1

 0

 mode 3

 1

 1

四种模式对应的应用场景:

【SPI】SPI学习之SPI硬件相关_第3张图片

  • CPOL极性

先说什么是SCLK时钟的空闲时刻,其就是当SCLK在数发送8个bit比特数据之前和之后的状态,于此对应的,SCLK在发送数据的时候,就是正常的工作的时候,有效active的时刻了。

先说英文,其精简解释为:Clock Polarity = IDLE state of SCK。

再用中文详解:

SPI的CPOL,表示当SCLK空闲idle的时候,其电平的值是低电平0还是高电平1:

CPOL=0,时钟空闲idle时候的电平是低电平,所以当SCLK有效的时候,就是高电平,就是所谓的active-high;

CPOL=1,时钟空闲idle时候的电平是高电平,所以当SCLK有效的时候,就是低电平,就是所谓的active-low;

  • CPHA相位

首先说明一点,capture strobe = latch = read = sample,都是表示数据采样,数据有效的时刻。相位,对应着数据采样是在第几个边沿(edge),是第一个边沿还是第二个边沿,0对应着第一个边沿,1对应着第二个边沿。

对于:

CPHA=0,表示第一个边沿:

对于CPOL=0,idle时候的是低电平,第一个边沿就是从低变到高,所以是上升沿;

对于CPOL=1,idle时候的是高电平,第一个边沿就是从高变到低,所以是下降沿;

CPHA=1,表示第二个边沿:

对于CPOL=0,idle时候的是低电平,第二个边沿就是从高变到低,所以是下降沿;

对于CPOL=1,idle时候的是高电平,第一个边沿就是从低变到高,所以是上升沿;

综上,可以列出总共SPI传输的四种时序:

【SPI】SPI学习之SPI硬件相关_第4张图片

注:如何去选项SPI的相位和极性?

关于SPI从设备,在空闲的时候,是高电平还是低电平,即决定了CPOL是0还是1;

然后再找到关于设备是在上升沿还是下降沿去采样数据,这样就是,在定了CPOL的值的前提下,对应着可以推算出CPHA是0还是1了。

如果从设备也是一个SPI控制器,4种模式都支持,此时只要自己设置为某种模式即可。

实际应用:

【SPI】SPI学习之SPI硬件相关_第5张图片

根据波形图,黄色是SCLK、绿色是MISO/MOSI。

SCLK空闲时是高电平,即CPOL=1;

SCLK第二个边沿采样(上升沿),即CPHA=1;

对这幅波形图的SPI数据传输描述:

在下降沿转换数据,在上升沿采样数据


SPI数据传输

spi数据传输框图:

【SPI】SPI学习之SPI硬件相关_第6张图片

在一个SPI时钟周期内,会完成如下操作:

1) 主机通过MOSI线发送1位数据,从机通过该线读取这1位数据;

2) 从机通过MISO线发送1位数据,主机通过该线读取这1位数据。

这是通过移位寄存器来实现的。如下图所示,主机和从机各有一个移位寄存器,且二者连接成环。随着时钟脉冲,数据按照从高位到低位的方式依次移出主机寄存器和从机寄存器,并且依次移入从机寄存器和主机寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。


参考:

文档:linux spi驱动开发学习(一)-----spi子系统架构

http://blog.chinaunix.net/uid-21501855-id-5211900.html

参考:

文档:SPI通信简介

https://blog.csdn.net/firefly_cjd/article/details/51935079#t17

 

你可能感兴趣的:(深入理解Linux内核,Linux设备驱动,linux,嵌入式,驱动,SPI)