一、概要。
这是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原贴地址