0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

串行外围设备接口控制方式及数据传输

4bDk_HOLTEK_MCU 来源:互联网 作者:佚名 2018-01-17 08:39 次阅读

1、 SPI简介

SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。

2、 SPI特点

2.1采用主-从模式(Master-Slave) 的控制方式

SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作

2.2采用同步方式(Synchronous)传输数据

Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse), 时钟脉冲组成了时钟信号(Clock Signal) , 时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样, 来保证数据在两个设备之间是同步传输的.

2.3数据交换(Data Exchanges)

SPI 设备间的数据传输之所以又被称为数据交换, 是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 "发送者(Transmitter)" 或者 "接收者(Receiver)". 在每个 Clock 周期内, SPI 设备都会发送并接收一个 bit 大小的数据, 相当于该设备有一个 bit 大小的数据被交换了. 一个 Slave 设备要想能够接收到 Master 发过来的控制信号, 必须在此之前能够被 Master 设备进行访问 (Access). 所以, Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选, 把想要访问的 Slave 设备选上. 在数据传输的过程中, 每次接收到的数据必须在下一次数据传输之前被采样. 如果之前接收到的数据没有被读取, 那么这些已经接收完成的数据将有可能会被丢弃, 导致 SPI 物理模块最终失效. 因此, 在程序中一般都会在 SPI 传输完数据后, 去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的。

2.4 SPI有四种传输模式

上升沿、下降沿、前沿、后沿触发。当然也有MSB和LSB传输方式.

2.5 SPI只有主模式和从模式之分。

没有读和写的说法,因为实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。

3、 工作机制

3.1概述

上图只是对 SPI 设备间通信的一个简单的描述, 下面就来解释一下图中所示的几个组件(Module):SSPBUF,Synchronous Serial Port Buffer, 泛指 SPI 设备里面的内部缓冲区, 一般在物理上是以 FIFO 的形式, 保存传输过程中的临时数据;SSPSR, Synchronous Serial Port Register, 泛指 SPI 设备里面的移位寄存器(Shift Regitser), 它的作用是根据设置好的数据位宽(bit-width) 把数据移入或者移出 SSPBUF;Controller, 泛指 SPI 设备里面的控制寄存器, 可以通过配置它们来设置 SPI 总线的传输模式。通常情况下, 我们只需要对上图所描述的四个管脚(pin) 进行编程即可控制整个 SPI 设备之间的数据通信:SCK, Serial Clock, 主要的作用是 Master 设备往 Slave 设备传输时钟信号, 控制数据交换的时机以及速率;SS/CS, Slave Select/Chip Select, 用于 Master 设备片选 Slave 设备, 使被选中的 Slave 设备能够被 Master 设备所访问;SDO/MOSI, Serial Data Output/Master Out Slave In, 在 Master 上面也被称为 Tx-Channel, 作为数据的出口, 主要用于 SPI 设备发送数据;SDI/MISO, Serial Data Input/Master In Slave Out, 在 Master 上面也被称为 Rx-Channel, 作为数据的入口, 主要用于SPI 设备接收数据;SPI 设备在进行通信的过程中, Master 设备和 Slave 设备之间会产生一个数据链路回环(Data Loop), 就像上图所画的那样, 通过 SDO 和 SDI 管脚, SSPSR 控制数据移入移出 SSPBUF, Controller 确定 SPI 总线的通信模式, SCK 传输时钟信号。

3.2 Timing

上图通过 Master 设备与 Slave 设备之间交换1 Byte 数据来说明 SPI 协议的工作机制.首先, 在这里解释一下相位和极性的概念

3.2.1 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的时候;

3.2.2 SPI的相位和极性

CPOL和CPHA,分别都可以是0或时1,对应的四种组合就是:Mode 0 CPOL=0, CPHA=0Mode 1 CPOL=0, CPHA=1Mode 2 CPOL=1, CPHA=0Mode 3 CPOL=1, CPHA=1

3.2.3 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;

3.2.4 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时候的是高电平,第一个边沿就是从低变到高,所以是上升沿;还是上图大家更容易看懂

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

SPI分主设备和从设备,两者通过SPI协议通讯。而设置SPI的模式,是从设备的模式,决定了主设备的模式。所以要先去搞懂从设备的SPI是何种模式,然后再将主设备的SPI的模式,设置和从设备相同的模式,即可正常通讯。对于从设备的SPI是什么模式,有两种:

3.2.5.1固定的,有SPI从设备硬件决定的

SPI从设备,具体是什么模式,相关的datasheet中会有描述,需要自己去datasheet中找到相关的描述,即:关于SPI从设备,在空闲的时候,是高电平还是低电平,即决定了CPOL是0还是1;然后再找到关于设备是在上升沿还是下降沿去采样数据,这样就是,在定了CPOL的值的前提下,对应着可以推算出CPHA是0还是1了。

3.2.5.2 可配置的,由软件自己设定

从设备也是一个SPI控制器,4种模式都支持,此时只要自己设置为某种模式即可。然后知道了从设备的模式后,再去将SPI主设备的模式,设置为和从设备模式一样,即可。对于如何配置SPI的CPOL和CPHA的话,不多细说,多数都是直接去写对应的SPI控制器中对应寄存器中的CPOL和CPHA那两位,写0或写1即可。

3.3 SSPSR

SSPSR 是 SPI 设备内部的移位寄存器(Shift Register). 它的主要作用是根据 SPI 时钟信号状态, 往 SSPBUF 里移入或者移出数据, 每次移动的数据大小由 Bus-Width 以及 Channel-Width 所决定。Bus-Width 的作用是指定地址总线到 Master 设备之间数据传输的单位.例如, 我们想要往 Master 设备里面的 SSPBUF 写入 16 Byte 大小的数据: 首先, 给 Master 设备的配置寄存器设置 Bus-Width 为 Byte; 然后往 Master 设备的 Tx-Data 移位寄存器在地址总线的入口写入数据, 每次写入 1 Byte 大小的数据(使用 writeb 函数); 写完 1 Byte 数据之后, Master 设备里面的 Tx-Data 移位寄存器会自动把从地址总线传来的1 Byte 数据移入 SSPBUF 里; 上述动作一共需要重复执行 16 次.Channel-Width 的作用是指定 Master 设备与 Slave 设备之间数据传输的单位. 与 Bus-Width 相似, Master 设备内部的移位寄存器会依据 Channel-Width 自动地把数据从 Master-SSPBUF 里通过 Master-SDO 管脚搬运到 Slave 设备里的 Slave-SDI 引脚, Slave-SSPSR 再把每次接收的数据移入 Slave-SSPBUF里.通常情况下, Bus-Width 总是会大于或等于 Channel-Width, 这样能保证不会出现因 Master 与 Slave 之间数据交换的频率比地址总线与 Master 之间的数据交换频率要快, 导致 SSPBUF 里面存放的数据为无效数据这样的情况.

3.4 SSPBUF

我们知道, 在每个时钟周期内, Master 与 Slave 之间交换的数据其实都是 SPI 内部移位寄存器从 SSPBUF 里面拷贝的. 我们可以通过往 SSPBUF 对应的寄存器 (Tx-Data / Rx-Data register) 里读写数据, 间接地操控 SPI 设备内部的 SSPBUF.例如, 在发送数据之前, 我们应该先往 Master 的 Tx-Data 寄存器写入将要发送出去的数据, 这些数据会被 Master-SSPSR 移位寄存器根据 Bus-Width 自动移入 Master-SSPBUF 里, 然后这些数据又会被 Master-SSPSR 根据 Channel-Width 从 Master-SSPBUF 中移出, 通过 Master-SDO 管脚传给 Slave-SDI 管脚, Slave-SSPSR 则把从 Slave-SDI 接收到的数据移入 Slave-SSPBUF 里. 与此同时, Slave-SSPBUF 里面的数据根据每次接收数据的大小(Channel-Width), 通过 Slave-SDO 发往 Master-SDI, Master-SSPSR 再把从 Master-SDI 接收的数据移入 Master-SSPBUF.在单次数据传输完成之后, 用户程序可以通过从 Master 设备的 Rx-Data 寄存器读取 Master 设备数据交换得到的数据.

3.5 Controller

Master 设备里面的 Controller 主要通过时钟信号(Clock Signal)以及片选信号(Slave Select Signal)来控制 Slave 设备. Slave 设备会一直等待, 直到接收到 Master 设备发过来的片选信号, 然后根据时钟信号来工作.Master 设备的片选操作必须由程序所实现. 例如: 由程序把 SS/CS 管脚的时钟信号拉低电平, 完成 SPI 设备数据通信的前期工作; 当程序想让 SPI 设备结束数据通信时, 再把 SS/CS 管脚上的时钟信号拉高电平.

4. SPI举例

上面说了那么多,在这里我来举一个例子帮助大家理解。SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。那么第一个上升沿来的时候 数据将会是sdo=1;寄存器=0101010x。下降沿到来的时候,sdi上的电平将所存到寄存器中去,那么这时寄存器=0101010sdi,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个spi时序。举例:假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据

这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。已经很接近理解了,下一步就是把 上面的过程转为动画

5、 STM32驱动

STM32的spi较为简单,因为STM32的内部集成有SPI。

5.1 SPI的初始化

[cpp]view plaincopy

  1. voidSPIInit(void)

  2. {

  3. SPI_InitTypeDefSPI_InitStructure;

  4. //初始化SPI与GPIO口的连接

  5. FLASH_GPIO_Init();

  6. /*!< Deselect the FLASH: Chip Select high */  

  7. CE_High();

  8. /*!< SPI configuration */  

  9. SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;

  10. SPI_InitStructure.SPI_Mode=SPI_Mode_Master;

  11. SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;

  12. SPI_InitStructure.SPI_CPOL=SPI_CPOL_High;

  13. SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;

  14. SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;

  15. SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;

  16. SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;

  17. SPI_InitStructure.SPI_CRCPolynomial=7;

  18. SPI_Init(SPI1,&SPI_InitStructure);

  19. /*!< Enable the sFLASH_SPI  */  

  20. SPI_Cmd(SPI1,ENABLE);

  21. }

5.2 SPI写1个字节

[cpp]view plaincopy

  1. uint8Send_Byte(uint8data)

  2. {

  3. //发送不为空

  4. while(!(SPI1->SR&SPI_I2S_FLAG_TXE));

  5. SPI1->DR=data;

  6. //读取收到的数据

  7. while(!(SPI1->SR&SPI_I2S_FLAG_RXNE));

  8. returnSPI1->DR;

  9. }

5.3 SPI读一个字节

[cpp]view plaincopy

  1. uint8Get_Byte(void)

  2. {

  3. //发送不为空

  4. while(!(SPI1->SR&SPI_I2S_FLAG_TXE));//发送缓冲为空,跳出循环

  5. SPI1->DR=0xFF;//

  6. //读取收到的数据

  7. while(!(SPI1->SR&SPI_I2S_FLAG_RXNE));//接受缓冲非空,跳出循环

  8. returnSPI1->DR;

  9. }

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据传输
    +关注

    关注

    9

    文章

    1790

    浏览量

    64402
  • 信号处理
    +关注

    关注

    48

    文章

    992

    浏览量

    103153
  • 时钟信号
    +关注

    关注

    4

    文章

    442

    浏览量

    28488

原文标题:SPI详解

文章出处:【微信号:HOLTEK_MCU,微信公众号:至秦单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LORA模块的数据传输速率

    LoRa(Long Range)是一种用于物联网(IoT)应用的低功耗广域网(LPWAN)技术。它以其长距离通信能力和低功耗特性而闻名。LoRa模块的数据传输速率可以根据不同的配置和地区的规定
    的头像 发表于 10-31 17:03 429次阅读

    是德万用表USB 接口数据传输

    在现代电子测量领域,数据传输界面技术的发展日新月异,已成为电子测量设备中不可或缺的一部分。是德公司作为电子测量领域的领导者,其万用表产品也配备了多种数据传输接口,包括USB
    的头像 发表于 10-22 16:56 149次阅读
    是德万用表USB <b class='flag-5'>接口</b><b class='flag-5'>数据传输</b>

    网络数据传输速率的单位是什么

    网络数据传输速率的单位是 bps(bit per second) ,即比特每秒,也可以表示为b/s或bit/s。它表示的是每秒钟传输的二进制数的位数。比特(bit)是计算机中数据量的单位,也是信息论
    的头像 发表于 10-12 10:20 760次阅读

    串行接口与并行接口的区别

    串行接口(Serial Interface)与并行接口(Parallel Interface)是计算机与外部设备之间进行数据传输的两种基本
    的头像 发表于 08-25 17:08 2472次阅读

    串行接口的工作原理和结构

    串行接口(Serial Interface)的工作原理和结构是理解其在计算机与外部设备之间数据传输方式的重要基础。以下将详细阐述
    的头像 发表于 08-25 17:01 1296次阅读

    高速串行总线,数据传输离不开它!#高速串行总线 #电路知识 #数据传输

    电路数据传输
    安泰仪器维修
    发布于 :2024年08月20日 15:42:00

    串行传输和并行传输的区别,各用于什么场合

    Communication)是两种基本的数据传输方式。它们在数据传输速度、传输距离、成本和应用场景等方面存在显著差异。 串行
    的头像 发表于 05-31 16:04 4329次阅读

    以太网接口数据传输原理详解

    /CD(载波侦听多路访问/冲突检测)的介质访问控制方式,允许多个设备共享同一传输介质进行数据传输。以太网
    的头像 发表于 05-29 16:47 1412次阅读

    探索SPI单线传输模式中时钟线与数据传输的简化

    探索SPI单线传输模式:时钟线与数据传输的简化之道 在当今的嵌入式系统和微控制器通信中,串行外设接口(SPI)因其高速、全双工和同步的特点而
    的头像 发表于 05-28 18:26 1053次阅读

    3针M5公头接口速度和数据传输效率怎样

      德索工程师说道在电子设备和系统的连接与通信中,接口的速度和数据传输效率是衡量其性能的重要指标。3针M5公头接口作为一种常见的连接标准,其速度与
    的头像 发表于 05-13 17:46 310次阅读
    3针M5公头<b class='flag-5'>接口</b>速度和<b class='flag-5'>数据传输</b>效率怎样

    DTU的多种协议,解锁数据传输的无限可能

    DTU,即数据传输单元,是一种在物联网(IoT)网络中常用的设备,主要用于在传感器和智能设备之间进行数据传输。DTU使用多种协议来实现这一目标,这些协议不仅提高了
    的头像 发表于 03-01 11:00 704次阅读
    DTU的多种协议,解锁<b class='flag-5'>数据传输</b>的无限可能

    数据传输方式有哪几种 哪种数据传输是双向的

    串行传输是一种按位逐个传输数据传输方式数据以比特
    的头像 发表于 01-10 15:40 7978次阅读

    设备管理通道控制四种方式

    设备管理的主要任务之一是控制设备和内存或处理机之间的数据传送,外围设备和内存之间的输入/输出控制
    发表于 12-08 14:05 922次阅读
    <b class='flag-5'>设备</b>管理通道<b class='flag-5'>控制</b>四种<b class='flag-5'>方式</b>

    工业控制领域基于TCP/IP的数据传输方案

    电子发烧友网站提供《工业控制领域基于TCP/IP的数据传输方案.pdf》资料免费下载
    发表于 11-16 10:52 0次下载
    工业<b class='flag-5'>控制</b>领域基于TCP/IP的<b class='flag-5'>数据传输</b>方案

    如何实现MQTT协议数据传输

    如何实现MQTT协议数据传输? 随着物联网技术的不断发展,越来越多的设备和应用需要实现互联互通。而MQTT作为一种轻量级的发布/订阅消息传输协议,在物联网领域应用广泛,成为了许多设备
    的头像 发表于 11-15 17:23 1084次阅读