首页 > 编程知识 正文

SPI设备,spi传输协议

时间:2023-05-03 15:39:28 阅读:51356 作者:3703

一、概要。

这是SPI、串行外围接口、串行外围设备接口和摩托罗拉公司发布的同步串行接口技术。 SPI总线由被称为同步串行端口(MCU )的模块(Module )物理上连接到外围设备微控制器(PICmicro )上,其中MCU是全双工的

SPI主要用于EEPROM、Flash、实时时钟(RTC )、数模转换器(DSP )、数字信号解码器之间。 这是因为在芯片内用于控制和数据传输的4个引脚),节约了芯片的Pin数,同时节约了PCB布局上的空间。 因为这样简单易用

二、特点

1 .采用主从模式(主从)控制方式

SPI规定,两个SPI设备之间的通信必须由主设备(Master )控制从设备。 一个主设备可以提供时钟,并通过切片Slave设备来控制多个Slave设备。 SPI协议还规定,Slave设备的时钟将从主设备通过SCK管脚提供给Slave设备。 Slave设备本身无法生成或控制时钟。 如果没有时钟,从属设备将无法正常工作。

2 .通过同步方式(Synchronous )传输数据

主设备根据要更换的数据生成对应的时钟。 时钟构成时钟信号,时钟信号通过时钟极性(CPOL )和时钟相位(CPHA )控制两个SPI设备之间的数据交换和接收数据的采样,以确保数据在两个设备之间同步传输

3 .数据交换(数据交换)。

SPI设备之间的数据传输也称为数据交换,是因为SPI协议规定一个SPI设备在数据通信过程中只能充当一个“传输器”或“接收器”。 在每个时钟周期内,SPI设备发送和接收1位大小的数据。 这相当于此设备具有1位大小的数据

在允许一个Slave设备接收来自主设备的控制信号之前,它必须可以从主设备访问。 因此,主设备必须首先通过SS/CS pin切片选择Slave设备,然后选择要访问的Slave设备。

在数据传输过程中,每次收到的数据必须在下一次数据传输之前被采样。 如果没有读取以前接收到的数据,则这些接收到的数据将被丢弃,SPI物理模块最终可能变为无效。 因此,程序中一般在SPI传输结束后,去读取SPI设备的数据。 即使这些数据(Dummy Data )在我们的程序中是无用的。

三、工作机制

1 .概述

上图是SPI设备之间通信的简要说明,下面介绍了图中所示的一些组件(Module ) :

SSPBUF,同步串行端口缓冲器指SPI设备中的内部缓冲器,通常以FIFO的形式存储正在传输的临时数据;

SSPSR,Synchronous Serial Port Register是指SPI设备中的移位寄存器,根据设定的位宽(bit-width )与SSPBUF交换数据。

控制器是指SPI设备内的控制寄存器,通过构成它们可以设定SPI总线的传输模式

通常,只需对上图中介绍的四个管脚(pin )进行编程,即可控制SPI设备之间的整个数据通信:

SCK、Serial Clock,主要作用是主设备向Slave设备传输时钟信号,控制数据交换的时序和速率;

SS/CS、Slave Select/Chip Select和Master设备的片选择Slave设备。 允许选定的从属设备从主设备访问。

SDO/MOSI,serialdataoutput/masteroutslavein,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 传输时钟信号.


      2. Timing.

        

        上图通过 Master 设备与 Slave 设备之间交换1 Byte 数据来说明 SPI 协议的工作机制.

        首先,  在这里解释一下两个概念:
        CPOL: 时钟极性, 表示 SPI 在空闲时, 时钟信号是高电平还是低电平. 若 CPOL 被设为 1, 那么该设备在空闲时 SCK 管脚下的时钟信号为高电平. 当 CPOL 被设为 0 时则正好相反.

        CPHA: 时钟相位, 表示 SPI 设备是在 SCK 管脚上的时钟信号变为上升沿时触发数据采样, 还是在时钟信号变为下降沿时触发数据采样. 若 CPHA 被设置为 1, 则 SPI 设备在时钟信号变为下降沿时触发数据采样, 在上升沿时发送数据. 当 CPHA 被设为 0 时也正好相反.
  

        上图里的 "Mode 1, 1" 说明了本例所使用的 SPI 数据传输模式被设置成 CPOL = 1, CPHA = 1. 这样, 在一个 Clock 周期内, 每个单独的 SPI 设备都能以全双工(Full-Duplex) 的方式, 同时发送和接收 1 bit 数据, 即相当于交换了 1 bit 大小的数据. 如果 SPI 总线的 Channel-Width 被设置成 Byte, 表示 SPI 总线上每次数据传输的最小单位为 Byte, 那么挂载在该 SPI 总线的设备每次数据传输的过程至少需要 8 个 Clock 周期(忽略设备的物理延迟). 因此, SPI 总线的频率越快, Clock 周期越短, 则 SPI 设备间数据交换的速率就越快.


     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 里面存放的数据为无效数据这样的情况.


        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 设备数据交换得到的数据.


         5. Controller.

         

          Master 设备里面的 Controller 主要通过时钟信号(Clock Signal)以及片选信号(Slave Select Signal)来控制 Slave 设备. Slave 设备会一直等待, 直到接收到 Master 设备发过来的片选信号, 然后根据时钟信号来工作.

          Master 设备的片选操作必须由程序所实现. 例如: 由程序把 SS/CS 管脚的时钟信号拉低电平, 完成 SPI 设备数据通信的前期工作; 当程序想让 SPI 设备结束数据通信时, 再把 SS/CS 管脚上的时钟信号拉高电平.

 

 

http://bbs.chinaunix.net/thread-1916003-1-1.html原贴地址

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。