SPI接口介绍

  • 背景
    最近在用支持SPI数据接口访问的ADC:TLC0831、DAC:TLC5620与C8051F023单片机搭建闭环温度控制系统,是将之前用并行数据接口搭建的系统改换成由串行数据接口搭建。然而对于SPI还不是很了解。查询相关资料,将其整理下来。

  • SPI是什么?
    SPI是串行外设接口(SERIAL PERIPHERAL INTERFACE)的缩写。SPI是一种高速的、全双工、同步的通信总线,在芯片管脚只占用四根线,可以为PCB布局节省空间。

  • SPI通讯协议
    SPI以主从方式工作,至少需要四根线,但单向传输时也支持三根线。
    四根线包括:
    1.SDI - Serial Data In,串行数据输入。
    2.SDO - Serial Data Out,串行数据输出。
    3.SCLK - Serial Clock,时钟信号,由主机产生,与主机时钟信号相同。
    4.CS - Chip Select,从设备使能信号,由主设备控制。
    SPI是串行通讯协议,也就是说数据是一位一位的传输的。由SCLK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。因此,至少需要8次时钟信号的改变(上沿和下沿为一次),才能完成8位数据的传输。
    SCLK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCLK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCLK时钟线的控制可以完成对通讯的控制。
    SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。
    SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。

  • 时钟极性与时钟相位
    时钟极性(CPOL)设置时钟空闲时的电平。时钟相位(CPHA)设置读取数据和发送数据的时钟沿。主机和从机的发送数据是同时完成的,两者的接收数据也是同时完成的。所以为了保证主从机正确通信,应使得他们的SPI具有相同的时钟极性和时钟相位。
    CPOL和CPHA,分别都可以是0或时1,对应的四种组合就是:
    Mode 0 :CPOL=0, CPHA=0
    Mode 1 :CPOL=0, CPHA=1
    Mode 2 :CPOL=1, CPHA=0
    Mode 3 :CPOL=1, CPHA=1

    [CPOL]
    SCLK时钟的空闲时刻,就是当SCLK在发送8个bit比特数据之前和之后的状态,SCLK在发送数据为有效active。
    Clock Polarity = IDLE state of SCK,SPI的CPOL,表示当SCLK空闲的时候,其电平的值是低电平0还是高电平1:
    CPOL=0,时钟空闲idle时候的电平是低电平,所以当SCLK有效的时候,就是高电平,就是所谓的active-high;
    CPOL=1,时钟空闲idle时候的电平是高电平,所以当SCLK有效的时候,就是低电平,就是所谓的active-low;

    [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时候的是高电平,第一个边沿就是从低变到高,所以是上升沿;
    SPI接口介绍

  • SPI模式的设定
    SPI分主设备和从设备,两者通过SPI协议通讯。从设备的模式,决定了主设备的模式。先设置从设备SPI的模式,然后再将主设备的SPI的模式,设置和从设备相同的模式,即可正常通讯。

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

    2.可配置的模式,由软件决定:
    从设备也是一个SPI控制器,4种模式都支持,设置为某种模式即可,再将SPI主设备的模式,设置为从设备模式。
    配置SPI的CPOL和CPHA,多数都是直接去写对应的SPI控制器中对应寄存器中的CPOL和CPHA那两位写0或写1。

  • 数据传输
    在一个SPI时钟周期内,会完成如下操作:
    1.主机通过MOSI线发送一位数据,从机通过过该线读取这一位数据;
    2.从机通过MISO线发送一位数据,主机通过该线读取这一位数据。
    这是通过移位寄存器来实现的。主从机各有一个移位寄存器,且二者连接成环,随着时钟脉冲,数据从高位到低位依次移出主机寄存器和从机寄存器,并且依次移入从机寄存器和主机寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。

  • 参考资料
    1.http://www.cnblogs.com/king-77024128/articles/2203207.html
    2.http://blog.chinaunix.net/uid-20620288-id-3164384.html