首页 > 编程知识 正文

SPI机制(SPI接口)

时间:2023-05-06 04:20:36 阅读:79510 作者:3918

一.概述

SPI总线在物理上通过连接在外围设备微控制器(PICmicro )上微处理器控制单元(MCU )上被称为同步串行端口)的模块)进行动作

SPI主要用于EEPROM、Flash、实时时钟(RTC )、数模转换器、数字信号处理器)、DSP )和数字信号解码器之间。 在芯片中只占用4个引脚(Pin )用于控制和数据传输,节约了芯片的Pin数量,同时在PCB布局上节约了空间。 由于这一易于使用的特性,现在越来越多的芯片集成了SPI技术。

二、特点

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

SPI规定,两个SPI设备之间的通信必须由主设备(Master )控制从设备。 一个Master设备提供时钟,可以通过切片Slave设备来控制多个Slave设备。 SPI协议规定,从属设备的时钟也由mastect控制

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

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

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

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

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

在数据传输过程中,每次收到的数据必须在下一次数据传输之前采样。 如果没有读取先前接收的数据,则这些接收的数据可能会被丢弃,并且SPI物理模块最终可能变为无效。 因此,在程序中,SPI传输数据后通常会去读取SPI设备上的数据。 即使这些数据(DummyData )在我们的程序中没有用。

三、工作机制

1、概要

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

SSPBUF,SynchronousSerialPortBuffer指SPI设备中的内部缓冲器,通常以FIFO的形式存储传输中的临时数据;

SSPSR,SynchronousSerialPortRegister是指SPI设备内的移位寄存器,根据设定的位宽(bit-width )来与SSPBUF交换数据。

控制器是指SPI设备中的控制寄存器,可以通过配置它们来设置SPI总线的传输模式。

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

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

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

SDO/MOSI,serialdataoutput/masteroutslavein在master上又称tx通道,主要用于SPI设备发送数据;

SDI/MISO,serialdatainput/masterinslaveout在master上也被称为Rx-Channel,主要用于SPI设备接收数据;

当SPI设备进行通信时,主设备和从设备之间会发生数据链路环路(数据环路)。 如上图所示,通过SDO、SDI引脚、SSPS

R控制数据移入移出SSPBUF,Controller确定SPI总线的通信模式,SCK传输时钟信号.

2、Timing.

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

首先,在这里解释一下两个概念:

CPOL:时钟极性,表示SPI在空闲时,时钟信号是高电平还是低电平。若CPOL被设为1,那么该设备在空闲时SCK管脚下的时钟信号为高电平。当CPOL被设为0时则正好相反。

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

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

3、SSPSR.

SSPSR是SPI设备内部的移位寄存器(ShiftRegister)。它的主要作用是根据SPI时钟信号状态,往SSPBUF里移入或者移出数据,每次移动的数据大小由Bus-Width以及Channel-Width所决定。

Bus-Width的作用是指定地址总线到Master设备之间数据传输的单位。

例如,我们想要往Master设备里面的SSPBUF写入16Byte大小的数据:首先,给Master设备的配置寄存器设置Bus-Width为Byte;然后往Master设备的Tx-Data移位寄存器在地址总线的入口写入数据,每次写入1Byte大小的数据(使用writeb函数);写完1Byte数据之后,Master设备里面的Tx-Data移位寄存器会自动把从地址总线传来的1Byte数据移入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-Dataregister)里读写数据,间接地操控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主要通过时钟信号(ClockSignal)以及片选信号(SlaveSelectSignal)来控制Slave设备。Slave设备会一直等待,直到接收到Master设备发过来的片选信号,然后根据时钟信号来工作。

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

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