SPI是串行扩展总线。
串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时系统的更改和扩充极为容易。
常用的串行扩展总线有:I2C(Inter IC Bus)总线、单总线(1-WIRE BUS)、SPI(Serial Peripheral Interface)总线及Microwire/PLUS等。
SPI总线是微控制器四线的外部总线。SPI没有明文标准,是一种事实总线,对通信操作的实现由芯片厂商和驱动开发者通过data sheet和application notes沟通实现的细节。SPI是四根信号线协议,如下:
SCLK:Serial Clock(Output from master);
MOSI:Master Output Slave Input(Outpt from Master);
MISO:Master Input Slave Output(Output from Slave);
SS:Slave Select(Active low,Output from Master);
SPI是单主设备通信,总线中只有一个设备发起通信,能发起通信的设备称为主设备。当SPI主设备想读/写从设备时,首先拉低对应从设备的SS线(SS是低电平有效);然后发送工作脉冲到时钟线上,在相应的脉冲时间上,主设备把信号发到MOSI实现写,同时可以对MISO线采样实现读。
SPI有四种操作模式:模式0、模式1、模式2、模式3。
这几个模式之间的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(即时钟信号无效时是高还是低)。每种模式由两个参数描述,称为时钟极CPOL(clock polarity)与时钟期CPHA(clock phase)。
Mode = Bit[CPOL]Bit[CPHA]
CPOL=0表示 SCK在空闲状态时为0;
CPOL=1表示 SCK在空闲状态时为1;
CPHA=0表示 在SCK第一个边沿时输入输出数据有效;
CPHA=1表示 在SCK第二个边沿时输入输出数据有效;
一般从器件的工作模式是固定的,主机要跟从机采用一样的工作模式,双方才能正常通信。如果有多个从设备,且从设备使用了不同的工作参数,那么主设备与不用的从设备通信时必须重新配置这些参数。
Mode0时,CPOL=0,CPHA=0,SCK空闲状态为低电平,主机数据在每个上升沿被从机采样,数据输出同理。
Mode1时,CPOL=0,CPHA=1,SCK空闲时为低电平,在SCK第二个边沿时数据有效,即SCK下降沿有效。
Mode2时,CPOL=1,CPHA=0,SCK空闲时为高电平,在SCK第一个边沿时数据有效,即SCK下降沿有效。
Mode3时,CPOL=1,CPHA=1,SCK空闲状态为高电平,主机数据在第二个边沿时有效,即每个上升沿被从机采样,数据输出同理。
SS为低电平时,表示对应的从机设备被使能,在每个SCK周期可以传输1Bit数据,采样时刻取决于器件支持的SPI mode,根据不同SPI器件的控制方法,在进行正式的数据读写操作前,一般需要先写入控制字,然后是寄存器地址和数据。
如下是FM25V05铁电存储器采用SPI模式0的写时序,SS(CS)被拉低,主机数据在每个上升沿被从机采样,Opcode是控制字,控制字采样结束后开始采样数据。
如下是FM25V05铁电存储器采用SPI模式0的读时序:
需要注意的是在SS下降沿和SCLK第一个边沿,或SS上升沿和SCLK最后一个边沿之间要留有一定的延迟时间,一般是0.5个SCLK周期。
参考:
【1】关于SPI协议,看这一篇文章就够了!-面包板社区
【2】总线I2C和SPI,工程师喜欢用哪一个?