SPI数据发送与接收机制(共6页pdf教程下载)

1SPI简介

SPI 是一个环形总线结构,以主从方式工作,这种模式通常有一个主设备和一个或多个 从设备,需要至少 4 根线(单向传输时,3 根线也可以),由ss(cs)、sck、sdi、sdo 构成, 其时序其实很简单,主要是在 sck 的控制下,两个双向移位寄存器进行数据交换,允许 MCU 以全双工的同步串行方式。只规定了每一帧数据如何传输,并未对帧结构的组成做介绍。

2SPI特点
2.1采用主-从模式的控制方式

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

2.2采用同步方式传输数据

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

2.3数据交换(DataExchanges)

SPI 设备间的数据传输之所以又被称为数据交换,是因为 SPI 协议规定一个 SPI 设备不 能在数据通信过程中仅仅只充当一个"发送者(Transmitter)"或者"接收者(Receiver)"。在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据,相当于该设备有一个 bit 大小 的数据被交换了。

一个从设备要想能够接收到 Master 发过来的控制信号,必须在此之前能够被 Master 设 备进行访问(Access)。所以,Master 设备必须首先通过 SS/CSpin 对从设备进行片选,把想要 访问的从设备选上。

在数据传输的过程中,每次接收到的数据必须在下一次数据传输之前被采样。如果之前

接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃,导致 SPI 物理 模块最终失效。因此,在程序中一般都会在 SPI 传输完数据后,去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的。

3SPI数据发送与接收机制
3.1概述

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 设备往从设备传输时钟信号, 控制数据交换的时机以及速率;

SS/CS,Slave Select/Chip Select,用于 Master 设备片选从设备,使被选中的从设备能够 被 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 设备和从设备之间会产生一个数据链路回环(Data
Loop),就像上图所画的那样,通过 SDO 和 SDI 管脚,SSPSR 控制数据移入移出 SSPBUF,
Controller 确定 SPI 总线的通信模式,SCK 传输时钟信号。
3.2Timing

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

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

上图使用的 SPI 数据传输模式被设置成 CPOL=1,CPHA=1。
3.3SSPSR

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 设备与从设备之间数据传输的单位。与 Bus-Width 相似,Master 设备内部的移位寄存器会依据 Channel-Width 自动地把数据从 Master-SSPBUF 里通过 Master-SDO 管脚搬运到从设备里的 Slave-SDI 引脚,Slave-SSPSR 再把每次接收的 数据移入 Slave-SSPBUF 里。

通常情况下,Bus-Width 总是会大于或等于 Channel-Width,这样能保证不会出现因 Master 与 Slave 之间数据交换的频率比地址总线与 Master 之间的数据交换频率要快,导致 SSPBUF 里面存放的数据为无效数据这样的情况。

3.4SSPBUF

我们知道,在每个时钟周期内,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.5Controller

Master 设备 里面的 Controller 主要通过时钟信号(ClockSignal)以及片选信号(SlaveSelect Signal)来控制从

设备。从设备会一直等待,直到接收到 Master 设备发过来的片选信号,然后根据时钟信号 来工作。

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

3.6综合举例

假设主机和从机初始化就绪:并且主机的 sbuff=0xaa,从机的 sbuff=0x55,下面将分步 对 SPI 的 8 个时钟周期的数据情况演示一遍:假设上升沿发送数据,这样就完成了两个寄存 器 8 位的交换,上面的上表示上升沿、下表示下降沿,SDI、SDO 相对于主机而言的。

完整的pdf格式文档51黑下载地址(共6页):

SPI数据发送与接收机制.pdf (341.3 KB, 下载次数: 45)

(0)

相关推荐