STM32之SPI原理

发布者:JoyousJourney最新更新时间:2019-03-08 来源: eefocus关键字:STM32  SPI原理 手机看文章 扫描二维码
随时随地手机看文章

SPI(Serial Peripheral Interface,串行外设接口)是Motorola公司提出的一种同步串行数据传输标准,是一种高速的,全双工,同步的通信总线,在很多器件中被广泛应用。


SPI相关缩写

SS: Slave Select,选中从设备,片选。


CKPOL (Clock Polarity) = CPOL = POL = Polarity = (时钟)极性 


CKPHA (Clock Phase)   = CPHA = PHA = Phase = (时钟)相位


SCK = SCLK = SCL = SPI的时钟(Serial Clock)


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接口经常被称为4线串行总线,以主/从方式工作,数据传输过程由主机初始化。


如图1所示,其使用的4条信号线分别为:


1) SCLK:串行时钟,用来同步数据传输,由主机输出;


2) MOSI:主机输出从机输入(Master Output Slaver Input)数据线;


3) MISO:主机输入从机输出数据线;


4) SS:片选线,低电平有效,由主机输出。


在SPI总线上,某一时刻可以出现多个从机,但只能存在一个主机,主机通过片选线来确定要通信的从机。这就要求从机的MISO口具有三态特性,使得该口线在器件未被选通时表现为高阻抗。


SPI由于接口相对简单(只需要4根线),用途算是比较广泛,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。


即一个SPI的Master通过SPI与一个从设备,即上述的那些Flash,ADC等的Slaver SPI进行通讯。而主从设备之间通过SPI进行通讯,首先要保证两者之间时钟SCLK要一致,互相要商量好了,要匹配,否则,就没法正常通讯了,即保证时序上的一致才可正常讯。而这里的SPI中的时钟和相位,指的就是SCLk时钟的特性,即保证主从设备两者的时钟的特性一致了,以保证两者可以正常实现SPI通讯。



数据传输

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


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


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


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



时钟极性和时钟相位

在SPI操作中,最重要的两项设置就是时钟极性(CPOL或UCCKPL)和时钟相位(CPHA或UCCKPH)。时钟极性设置时钟空闲时的电平,时钟相位设置读取数据和发送数据的时钟沿。


主机和从机的发送数据是同时完成的,两者的接收数据也是同时完成的。所以为了保证主从机正确通信,应使得它们的SPI具有相同的时钟极性和时钟相位。


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对应着第二个边沿。


CPOL=0:


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


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


CPOL=1:


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


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


用图文形式表示,更加容易看懂:



CKP和CKE

CKP和CKE是Microchip的PIC系列芯片中的说法。


(1)CKP是Clock Polarity Select,就是极性=CPOL:


CKP,虽然名字和CPOL不一样,但是都是指时钟极性的选择,定义也一样:


CKP: Clock Polarity Select bit


1 = Idle state for clock (CK) is a high level


0 = Idle state for clock (CK) is a low level


所以不多解释。


(2)CKE是Clock Edge Select,就是相位=CPHA:


CKE: SPI Clock Edge Select bit


1 = Transmit occurs on transition from active to Idle clock state


0 = Transmit occurs on transition from Idle to active clock state


意思是:


1 =(数据)传输发生在时钟从有效状态转到空闲状态的那一时刻


0 =(数据)传输发生在时钟从空闲状态转到有效状态的那一时刻


其中,数据传输的时刻,即上图中标出的“数据transmit传输的时刻”。


CKE的定义也跟CPHA相同。

所以,CKP和CKE所对应的取值的含义为:


When CKP = 0:


CKE=0 => Data transmitted on rising edge of SCK(idle时候是低电平,从空闲到有效,就是从低电平到高电平,所以是上升沿)


CKE=1 => Data transmitted on falling edge of SCK(idle时候是低电平,从有效到空闲,就是从高电平到低电平,所以是下降沿)


When CKP = 1:


CKE=0 => Data transmitted on falling edge of SCK(idle时候是高电平,从空闲到有效,就是从高电平到低电平,所以是下降沿)


CKE=1 => Data transmitted on rising edge of SCK(idle时候是高电平,从有效到空闲,就是从低电平到高电平,所以是上升沿)


举例来说,分别选取MSP430控制器和OLED驱动SH1101A为主从机,图3和图4为它们的SPI时序。由图4可知,SH1101A的SPI时钟空闲时为高电平,并且在后时钟沿接收数据(后时钟沿在数据的中间部位),则MSP430控制器SPI的设置应与此保持一致。从图3中可以看出,要使得时钟在空闲时为高电平,应将UCCKPL置1;要使得在后时钟沿接收数据,应将UCCKPH清零。




下面再列出其他一些地方找到的,常见的SPI的四种模式的时序图,供参考:





如何看懂和记忆CPOL和CPHA

所以,关于在其他地方介绍的,看似多么复杂难懂难记忆的CPOL和CPHA,其实经过上面解释,就肯容易看懂了:


去看时序图,如果时钟SCLK的起始电平是0,那么CPOL=0,如果是1,那么CPOL=1。


然后看数据采样时刻,即时序图数据线上的数据矩形区域的中间所对应的位置,对应到上面SCLK时钟的位置,对应着是第一个边沿或是第二个边沿,即CPHA是0或1。(对应的是上升沿还是下降沿,要根据对应的CPOL的值,才能确定)。


即:


(1)如何判断CPOL:SCLK的空闲时候电压是0还是1,决定了CPOL是0还是1;


(2)如何判断CPHA:而数据采样时刻对应着的SCLK的电平,是第一个边沿还是第二个边沿,对应着CPHA为0还是1。


软件中如何设置SPI的极性和相位

SPI分主设备和从设备,两者通过SPI协议通讯。


设置SPI的模式,是从设备的模式,决定了主设备的模式。


所以要先去搞懂从设备的SPI是何种模式,然后再将主设备的SPI的模式,设置和从设备相同的模式,即可正常通讯。


对于从设备的SPI是什么模式,有两种:


(1)固定的,设备硬件决定的。


SPI从设备,具体是什么模式,相关的datasheet中会有描述,需要自己去datasheet中找到相关的描述,即:


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


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


举例1:


CC2500 - Low-Cost Low-Power 2.4 GHz RF Transceiver的datasheet中SPI的时序图是:



从图中可以看到,最开始的SCLK和结束时候的SCLK,即空闲时刻的SCLK,是低电平,推导出CPOL=0,然后可以看到数据采样的时候,即数据最中间的那一点,对应的是SCLK的第一个边沿,所以CPHA=0(此时对应的是上升沿)。


举例2:


SSD1289 - 240 RGB x 320 TFT LCD Controller Driver的datasheet中提到:


“SDI is shifted into 8-bit shift register on everyrising edge of SCK in the order of data bit 7, data bit 6 …… data bit 0.”


意思是,数据是在上升沿采样,所以可以断定是CPOL=0,CPHA=0,或者CPOL=1,CPHA=1的模式,但是至于是哪种模式。


按理来说,接下来应该再去确定SCLK空闲时候是高电平还是低电平,用以确定CPOL是0还是1,但是datasheet中没有提到这点。


所以,此处,目前不太确定,是两种模式都支持,还是需要额外找证据却确定CPOL是0还是1.


(2)可配置的,由软件自己设定


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


然后知道了从设备的模式后,再去将SPI主设备的模式,设置为和从设备模式一样,即可。


对于如何配置SPI的CPOL和CPHA的话,不多细说,多数都是直接去写对应的SPI控制器中对应寄存器中的CPOL和CPHA那两位,写0或写1即可。


举例:


此处遇到的C8051F347中的SPI就是一个SPI的controller控制器,即支持软件配置CPOL和CPHA的值,四种模式都支持,此处C8051F347作为SPI从设备,设置了CPOL=1,CPHA=0的模式,因此,此处对应主芯片Blackfin F537中的SPI控制器,作为Master主设备,其SPI的模式也要设置为CPOL=1,CPHA=0。


优缺点

SPI接口具有如下优点:


1) 支持全双工操作;


2) 操作简单;


3) 数据传输速率较高。


同时,它也具有如下缺点:


1) 需要占用主机较多的口线(每个从机都需要一根片选线);


2) 只支持单个主机。


关键字:STM32  SPI原理 引用地址:STM32之SPI原理

上一篇:STM32之SPI主机例程
下一篇:STM32之独立看门狗例程

推荐阅读最新更新时间:2024-03-16 16:25

基于STM32的带触摸屏的无线解说器
本实例是以STM32F103系列单片机作为核心处理器,利用VS1003芯片进行音频解码的一种无线解说器。通过对触摸显示屏的操作,实现手持部分和终端部分二者的无线通讯。系统采用大容量的SD卡作为存储部分,通过SPI将VS1003B与SD卡的数据与STM32进行交互通信。本解说器在播放时没有出现理论上的断续情况,音质较好,占用的软硬件资源也较少,为后续的扩展留下了很大空间。 无线讲解器通常用于工厂、博物馆、景区等室外空旷场所供参观介绍用,通过事先在场所安放无线发射模块,并控制发射模块的工作范围。听众到达景点后,手上的讲解器将自动接收各个地点的无线编码信号,经解码后即可将存储在SD卡中的语音播放,以便清晰地全程收听全部介绍内
[单片机]
基于<font color='red'>STM32</font>的带触摸屏的无线解说器
简化和加快最终产品开发速度,STM32 探索套件问市
为了简化物联网节点开发者面临的复杂软件的开发难题,意法半导体推出了B-L4S5I-IOT01A STM32探索套件。新套件包含经过相关标准认证的FreeRTOS™操作系统编程接口,该编程接口完全集成在STM32Cube开发生态系统内,可直连亚马逊云服务Amazon Web Services (AWS)。 硬件工具包括一块STM32L4+微控制器开发板,板载意法半导体的各种MEMS传感器,以及STSAFE-A110安全单元、Bluetooth® 4.2 模块、Wi-Fi®模块,以及用于低功耗上云的有印刷天线的NFC标签。配备了X-CUBE-AWS v2.0 STM32Cube Expansion Pack软件包,该开发套件
[单片机]
简化和加快最终产品开发速度,<font color='red'>STM32</font> 探索套件问市
stm32的相关网络问题
最近在做一个工作,就是使用stm32将数据通过internet传输到远端连接的服务器上,考虑到的问题是,首先,是需要使用FTP传输数据的,其次,是怎么找到网络服务器的一个特定的文件夹,然后将数据封装到这个文件夹下的一个文件中,这个应该如何实现?就收集了一些相关的资料。 1、BSD TCP/IP协议栈 BSD栈历史上是其他商业栈的起点,大多数专业TCP/IP栈(VxWorks内嵌的TCP/IP栈)是BSD栈派生的。这是因为BSD栈在BSD许可协议下提供了这些专业栈的雏形,BSD许用证允许BSD栈以修改或未修改的形式结合这些专业栈的代码而无须向创建者付版税。同时,BSD也是许多TCP/IP协议中的创新(如广域网中饿拥塞控制和避免)的开
[单片机]
如何使用MDK编译器让STM32程序HEX文件中加入固件版本信息
本文介绍一个小技巧: 使用MDK编译器,让STM32程序HEX文件中加入固件版本信息。 代码 代码如下: //------------------------------------------------------------------------------#include 《absacc.h》 //------------------------------------------------------------------------------#define VERINFO_ADDR_BASE (0x8009F00) // 版本信息在FLASH中的存放地址const char Hardware_Ver[] _
[单片机]
如何使用MDK编译器让<font color='red'>STM32</font>程序HEX文件中加入固件版本信息
读取stm32 产品的唯一身份的寄存器
读取stm32 产品的唯一身份的寄存器 voidGet_ChipID(void) { uint32_t temp0,temp1,temp2; temp0 = *(__IO uint32_t*)(0x1FFF7A10); temp1 = *(__IO uint32_t*)(0x1FFF7A14); temp2 = *(__IO uint32_t*)(0x1FFF7A18); // temp0=(*( uint32_t *)0x1FFF7A10); //产品唯一身份标识寄存器(96位) // temp1=(*( uint32_t *)0x1FFF7A14); // temp2=(*( ui
[单片机]
2023 STM32全国巡展,米尔限量发STM32MP135开发板优惠券
2023年9月12日至10月27日,以“STM32,不止于芯”为主题的第十六届STM32全国巡回研讨会将走进11个城市,本届研讨会为全天会议,我们将围绕STM32最新产品开展技术演讲和方案演示。 本次STM32全国研讨会,米尔电子将现场展出STM32相关的最新产品技术和应用演示,为工程师们提供共话交流共同探索开放式平台,届时,米尔电子的技术工程师将与各位嘉宾面对面深入交流。感兴趣的客户和朋友欢迎莅临参观了解! 米尔电子的明星产品将精彩亮相 米尔MYC-YF13X 核心板及开发板 基于STM32MP1系列MPU,STM32MP135高性价比入门级MPU设计平台,完整的安全生态系统让MCU开发者友好地过渡到MPU平
[单片机]
2023 <font color='red'>STM32</font>全国巡展,米尔限量发STM32MP135开发板优惠券
基于STM32对DS1302的驱动
// 程序名: STM32驱动DS1302 //头文件 #include “stm32f10x.h” #include “usart.h” #define uchar unsigned char #define uint unsigned int ////DS1302引脚定义,可根据实际情况自行修改端口定义 #define RST PAout(5) #define IO PAout(6) #define SCK PAout(7) //DS1302地址定义 #define ds1302_sec_add 0x80 //秒数据地址 #define ds1302_min_add 0x82 //分数据地址 #define ds1302_
[单片机]
如何实现一种基于STM32单片机的智能浴室水温调控仪设计
一、功能简介 本项目使用Proteus8.12仿真STM32单片机控制器,使用LCD1602、DS18B20、继电器加热、电机模块等。 系统运行后,LCD1602显示DS18B20采集温度值、温度上限阈值。开启加水,一段时间后开启加热,当水位到达后停止注水,继续加热到设定温度,可通过K1、K2键对温度上限设置,若检测温度大于或等于上限,关闭加热装置;若温度低于上限,开启加热装置; 主要功能如下: (1)水温,水位实时检测; (2)水温设定,超限关闭加热; (3)继电器控制加热、注水; (4)LCD1602液晶显示。 二、软件设计 //系统参数初始化 void sys_parm_init(void) { //初始自动模式
[单片机]
如何实现一种基于<font color='red'>STM32</font>单片机的智能浴室水温调控仪设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved