SPI协议详解

  • SPI协议简介
  • 一、SPI物理层
  • 二、SPI协议层
    • 2.1 SPI基本通信过程
    • 2.2 通信的起始和终止信号
    • 2.3 数据有效性
    • 2.4 CPOL/CPHA及通信模式
  • 三、编程实现
  • 四、实践分析
  • 总结

SPI协议简介

SPI 全称是 Serial Perripheral Interface,也就是串行外围设备接口。 SPI 是 Motorola 公司推出的一种同步串行接口技术,是一种高速、全双工的同步通信总线, SPI 时钟频率相比 I2C 要高很多,最高可以工作在上百 MHz。 SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,一般 SPI 需要4 根线,但是也可以使用三根线(单向传输)。该通信方式主要广泛地使用在ADC、LCD等设备与MCU间,适用于对通信速率要求较高的场合。


一、SPI物理层

  1. CS/SS(Slave Select/Chip Select),常称为片选信号线。当多个SPI从设备与SPI主机相连时,设备的其他信号线SCK、MOSI及MISO同时并联到相同的SPI总线上,即无论有多少个从设备,都共同使用这3条总线;但值得注意的是:每个从设备都有独立的一条NSS信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。区别于IIC协议通过设备地址进行寻址,从而完成与总线上某个设备进行通信方式的不同,SPI协议中没有设备地址,而是使用片选信号线来寻址,当主机要选择从设备时,通常情况下把该设备的片选信号线设置为低电平,从而使得该设备被选中,即片选有效,这样主机便和从设备之间建立通信。
  2. SCK(Serial Clock),时钟信号线,用于通信数据同步,通常由主机产生,但不同设备支持的通信速率不一致,而且值得注意的是:两设备之间通信时,通信速率受限于低速设备。
  3. MOSI/SDO(Master Out Slave In/Serial Data Output),主设备输出/从设备输入引脚,这根数据线只能用于主机向从机发送数据。
  4. MISO/SDI(Master In Slave Out/Serial Data Input),主设备输入/从设备输出引脚,这根数据线只能用户从机向主机发送数据。

二、SPI协议层

2.1 SPI基本通信过程


上图为SPI的主机通讯时序,NSS、SCK和MOSI信号都由主机控制,而MISO的信号由从机产生,主机通过该信号线读取从机的数据。MOSI与MISO的信号只在NSS为低电平的时候才有效,在SCK的每个时钟周期MOSI和MISO传输一位数据。


2.2 通信的起始和终止信号

  • 起始信号:NSS信号由高变低,即为SPI通讯的起始信号;
  • 终止信号:NSS信号由低变高,即为SPI通讯的终止信号;

2.3 数据有效性

SPI 使用 MOSI 及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。MOSI 及 MISO 数据线在 SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的【全双工】。数据传输时,MSB先行或 LSB 先行并没有作硬性规定,但要保证两个 SPI 通讯设备之间使用同样的协定,一般都会采用MSB 先行模式

观察上图中的标号2-5处,可知MOSI及MISO的数据在在 SCK 的上升沿期间变化输出【触发】,在 SCK 的下降沿时被采样。即在 SCK 的下降沿时刻,MOSI 及 MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效,MOSI 及 MISO 为下一次表示数据做准备。

SPI每次数据传输可以8位或16位为单位,每次传输的单位数不受限制。


2.4 CPOL/CPHA及通信模式

SPI的四种通讯模式,主要区别是总线空闲时,SCK的时钟状态及数据采样时刻。为方便说明,在此引入“时钟极性 CPOL”和“时钟相位 CPHA”的概念。

  • 时钟极性CPOL是指SPI通讯设备处于空闲状态时,SCK信号线的电平信号(即:SPI通讯开启前,NSS线为高电平时SCK的状态)。CPOL=0时,SCK在空闲状态时为低电平,CPOL=1时,则相反。
  • 时钟相位CPHA是指数据的采样时刻,当CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的“奇数边沿”被采样。当CPHA=1时,数据线在SCK的“偶数边沿”采样。

CPHA=0的时序图:

首先,根据 SCK 在空闲状态时的电平,分为两种情况。SCK信号线在空闲状态为低电平时,CPOL=0;空闲状态为高电平时,CPOL=1。这里,无论CPOL=0还是=1,因为我们配置的时钟相位CPHA=0,在途中可以看到,采样时刻都是在SCK的奇数边沿。注意当CPOL=0的时候,时钟的奇数边沿是上升沿,而当CPOL=1时,时钟的奇数边沿则为下降沿,所以SPI的采样时刻不是由上升/下降沿决定的。而是因为无论是MOSI还是MISO数据线的有效信号在SCK的奇数边沿保持不变,故数字信号将在SCK奇数边沿时被采样,在非采样时刻,MOSI和MISO的有效信号才发生切换。


CPHA=1的时序图

由上图可知,不受CPOL的影响,MOSI及MISO数据有效信号在SCK的偶数边沿保持不变,故数据信号在SCK的偶数边沿被采样。


SPI的四种工作模式,实际中采用较多的是“模式0”与“模式3”,但值得注意的是:主机与从机需工作在相同的模式下才可以正常通讯。

三、编程实现

// Reference to 正点原子的代码
void SPI2_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 RCC_APB1PeriphClockCmd(  RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOBGPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master;       //设置SPI工作模式:设置为主SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;       //设置SPI的数据大小:SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;       //串行同步时钟的空闲状态为高电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;  //串行同步时钟的第二个跳变沿(上升或下降)数据被采样SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;     //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;     //定义波特率预分频的值:波特率预分频值为256SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7;  //CRC值计算的多项式SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器SPI_Cmd(SPI2, ENABLE); //使能SPI外设SPI2_ReadWriteByte(0xff);//启动传输
}

四、实践分析

通过在想FLASH中分别写入数字5和字符A后读出,然后通过逻辑分析仪进行观察分析。

  • 数字5
    OLED显示:

逻辑分析仪显示:

  • 字符A

  • OLED显示

  • 逻辑分析仪显示

    这里,箭头所指的‘00’是指,字符串结束标志’\0’。




由FLASH手册及逻辑分析仪数据读取的截图可知,主机发送读取指令03H,接下来发送3字节地址信息【FF FF 9C】,然后再进行数据读取。


总结

  1. SPI协议是高速全双工的同步通信协议;
  2. 要注意SPI四种时序的区分,只在信号稳定期进行采样;
  3. 协议贵在实践,而非梳理,梳理只是为了简要理解协议形成大体框架而已;

STM32常用协议之SPI协议详解相关推荐

  1. ARP协议及ARP欺骗详解

    ARP协议及ARP欺骗详解 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议.主机发送信息时将包含目标IP地址的ARP ...

  2. HTTP协议的头信息详解

    HTTP协议的头信息详解 http://blog.csdn.net/guoguo1980/archive/2008/07/14/2649658.aspx HTTP协议的头信息详解 HTTP(Hyper ...

  3. [转]HTTP协议之状态码详解

    HTTP协议之状态码详解 HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果是做AJ ...

  4. STM32开发实战:W25Q32JV SPI Flash详解

    STM32开发实战:W25Q32JV SPI Flash详解 在STM32单片机的应用中,使用SPI Flash能够有效地扩展程序和数据存储空间.W25Q32JV SPI Flash是一种常用的Fla ...

  5. IP协议相关技术终极详解

    IP协议相关技术终极详解 DNS域名解析协议 概述 域名的层级关系 域名的解析流程 ARP地址解析协议 概述 为什么需要ARP协议? ARP协议是属于哪一层呢? ARP协议和DNS协议的区别 ARP协 ...

  6. FTP协议及工作原理详解

    FTP协议及工作原理详解 1. FTP协议 什么是FTP呢?FTP 是 TCP/IP 协议组中的协议之一,是英文File Transfer Protocol的缩写. 该协议是Internet文件传送的 ...

  7. HTTP协议的头信息详解 1

    HTTP协议的头信息详解 我用抓包软件抓了http的包,发现accept大多数有两种情况. # l8 X" o; I5 e# t9 y第一种:Accept: image/gif, image ...

  8. 《HTTP/2基础教程》协议、特性、详解

    文章目录 <HTTP/2基础教程>协议.特性.详解 前言 第一章 HTTP进化史 第二章 HTTP/2 快速入门 第三章 Web优化"黑魔法"的动机与方式 HTTP/1 ...

  9. STM32应用IAP进行程序更新详解及实例

      这是以前就想写的一个小专题关于IAP,以及IAP在STM32编程的应用,专题分三小节,主要介绍常见的单片机烧录方式,IAP的实际应用,以及Ymodem协议在IAP编程中应用,在笔记吃灰很久了,终于 ...

  10. 【java】SPI机制详解

    1.概述 以前的文章:[SPI]java基础之SPI框架实现 转载:Java常用机制 - SPI机制详解 PI(Service Provider Interface),是JDK内置的一种 服务提供发现 ...

最新文章

  1. php异常处理方式,PHP异常处理办法
  2. Skin设计小组新作品发布—绿草蓝天
  3. php什么版本好玩_新区传奇世界手游10点准时开放丨两个版本
  4. java验证生日的正则表达式
  5. 好男人往往找不到女朋友
  6. OSChina 周二乱弹 —— 高手应该习惯寂寞
  7. 周鸿祎:通往伟大企业之路
  8. 《htmlxhtml权威指南》部分标签语义学习
  9. 单目相机与激光标定相关文章与代码(草稿)
  10. Android CompoundButton
  11. java冒泡排序代码
  12. 左程云 Java 笔记--暴力递归--动态规划
  13. php测试宽带速度慢,别被运营商骗了! 手把手教你学会测自家网速
  14. passing '' as 'this' argument discards qualifiers [-fpermissive]
  15. “为了对电脑进行保护,已经阻止此应用。”
  16. 【雅思大作文考官范文】——第五篇: 'literature and history' essay
  17. 打印DPI如何与计算机DPI一致,像素英寸与dpi的那些事儿
  18. Ambisonics解释:声音工程师指南
  19. 营业执照、组织机构代码、税务登记号规则
  20. 爬取图片,并按比例划分数据集

热门文章

  1. 【已解决】Ubuntu U盘启动出现“Failed to load ldlinux.c32”问题
  2. c语言清屏运行慢,关于c清屏的问题
  3. Cocos2d-x数据模块教程04:plist文件操作
  4. Intellij IDEA--取消双击shift搜索的方法(包含新旧版本)
  5. squashfs for windows:windows下的squ打包工具
  6. AOP获取request各项参数操作
  7. 自学Java半年,能找到工作嘛?
  8. 【前端】【学习】HTML+CSS的W3Cschool网站的实战知识点
  9. 【数据挖掘概念与技术】学习笔记1-引论
  10. 【计算机网络】网络的连接过程 ——读《网络是怎样连接的》