首页天道酬勤,

,

张世龙 05-13 00:50 112次浏览

关联内容:

【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

 

, SPI模式,fpga程序