关联内容:
【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的时候;
这一部分列出所有连接或断开芯片的输入/输出引脚的名称与描述。SPIV3模块共有4个外部信号。
SPI模块配置为主机时,该引脚用于发送数据;当SPI配置为从机时,该引脚用于接收数据。
SPI模块配置为主机时,该引脚用于接收数据;当SPI配置为从机时,该引脚用于发送数据。
SPI配置为主机时,该引脚用于向其它进行数据传输的外设输出一个片选信号。SPI作为从机时,该引脚作为输入用于接收从机选择信号。
注:SS脚是从机选择输入。在数据传输开始前,从机的SS脚必须为低电平。SS必须保持低电平,直到数据传输完成。如果SS变为高电平,SPI将被迫进入空闲模式。
该引脚用于输出传输数据的时钟,作为从机时,为接收时钟。
SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。
随便列一个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位可调,存在无效位,无效位根据系统的是大端或者小端进行放置。);
CPOL和CPHA,分别都可以是0或时1,对应的四种组合就是:
工作模式 \ 相位 |
CPOL |
CPHA |
mode 0 |
0 |
0 |
mode 1 |
0 |
1 |
mode 2 |
1 |
0 |
mode 3 |
1 |
1 |
四种模式对应的应用场景:
先说什么是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;
首先说明一点,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从设备,在空闲的时候,是高电平还是低电平,即决定了CPOL是0还是1;
然后再找到关于设备是在上升沿还是下降沿去采样数据,这样就是,在定了CPOL的值的前提下,对应着可以推算出CPHA是0还是1了。
如果从设备也是一个SPI控制器,4种模式都支持,此时只要自己设置为某种模式即可。
实际应用:
根据波形图,黄色是SCLK、绿色是MISO/MOSI。
SCLK空闲时是高电平,即CPOL=1;
SCLK第二个边沿采样(上升沿),即CPHA=1;
对这幅波形图的SPI数据传输描述:
在下降沿转换数据,在上升沿采样数据
spi数据传输框图:
在一个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