,
关联内容:
【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=)时钟) 上升沿或下降沿在一个时钟周期内有两个edge,Leading edge=前沿=最初沿,相对于开始电压为1、1时,相对于开始电压为0 起始电压为1时,为0变为1时。 也就是说,第一次1变为0后,下一个0可能变为1。 开始电压为0时,为1变为0时。
SPI外部信号说明此部分包含与芯片连接或断开的所有输入/输出针脚的名称和说明。 SPIV3模块有四个外部信号。
如果将MOSI——主机输入/输出/从机输入SPI模块配置为主机,则此管脚用于发送数据; 如果将SPI配置为从站,则此管脚用于接收数据。
如果将MISO——主输入/输出SPI模块配置为主模块,则此管脚用于接收数据。 如果将SPI配置为从站,则此管脚用于发送数据。
CS———如果从选择引脚SPI配置为主引脚,则该引脚用于向进行其他数据传输的外围设备输出芯片选择信号。 如果SPI是从机,则此引脚用于接收从机选择信号作为输入。
注: SS脚为从站选择输入。 在开始数据传输之前,从站的SS管脚必须处于低电平。 SS必须保持低电平直到数据传输完成。 当SS达到高电平时,SPI不得不进入空闲模式。
SCLK——串行时钟引脚此引脚用于输出传输数据的时钟,如果是从时钟,则为接收时钟。
SCK信号线仅由主站设备控制,从站设备无法控制信号线。 同样,基于SPI的设备至少有一个主设备。 这样的传输特征:与普通串行通信不同,这样的传输方案一次连续地传输至少8位的数据,但是SPI中可以每次传输1位的数据,并且也可以暂停。 由于SCK时钟线由主设备控制,因此如果没有时钟跳跃,则从设备不收集或传输数据。 也就是说,主设备可以通过SCK时钟线的控制来完成通信的控制。 SPI也是一种数据交换协议。 SPI的数据输入输出线是独立的,因此可以同时进行数据的输入输出。 不同的SPI设备实现方式不同,主要是数据修改和采集的时间不同,时钟信号的上沿或下沿采集有不同的定义。 具体请参考相关设备的文档。
SPI硬件寄存器映射自由列出SPI寄存器。 请作为参考
SPI硬件特性全双工主-从模式SPI规定,两个SPI设备之间的通信必须由主设备(Master )控制从设备。 一个主设备可以提供时钟,并通过切片Slave设备来控制多个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相位和极性CPOL和CPHA,分别都可以是0或时1,对应的四种组合就是:
工作模式 \ 相位
CPOL
CPHA
mode 0
0
0
mode 1
0
1
mode 2
1
0
mode 3
1
1
四种模式对应的应用场景:
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从设备,在空闲的时候,是高电平还是低电平,即决定了CPOL是0还是1;
然后再找到关于设备是在上升沿还是下降沿去采样数据,这样就是,在定了CPOL的值的前提下,对应着可以推算出CPHA是0还是1了。
如果从设备也是一个SPI控制器,4种模式都支持,此时只要自己设置为某种模式即可。
实际应用:
根据波形图,黄色是SCLK、绿色是MISO/MOSI。
SCLK空闲时是高电平,即CPOL=1;
SCLK第二个边沿采样(上升沿),即CPHA=1;
对这幅波形图的SPI数据传输描述:
在下降沿转换数据,在上升沿采样数据
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