硬件总线基础03:SPI总线(1)

说在开头:关于宇宙的结局(1)

我们在《阻容感》的开篇是从宇宙大爆炸开始的,这一章继续回到宇宙大爆炸理论来看看宇宙的结局。俄罗斯物理学家亚历山大.弗里德曼根据爱因斯坦广义相对论数学公式,推理出宇宙未来取决于三个参数:1,H:宇宙膨胀的速度;2,Ω:宇宙物质的平均密度;3,λ:与真空的空间有关的能量。通过分析这三个常数之间的微妙关系,确定整个宇宙的未来演化。

  1. 如果Ω值小于1,宇宙中没有足够的物质逆转大爆炸产生的原始膨胀,其结果是:宇宙将永远膨胀,直到温度接近绝对零度(绝对零度只能逼近,而不能达到);

——此时宇宙的空间-时间曲率是负的(像马鞍形表面,罗氏几何,三角形内角和小于180°),宇宙的时间和空间都是无限的。

  1. 如果Ω值大于1,宇宙物质质量足够大,宇宙的重力最终将逆转宇宙膨胀,其结果是:宇宙将首先停止膨胀然后收缩,最终宇宙的压缩将重力能最终转化为热能(想象一下我们从一层楼高跳下来,重力势能转化为了动能),宇宙将陷入一片火海,一切生命将灭绝

——此时宇宙的曲率为正(像一个球面,黎曼几何,三角形内角和大于180°),宇宙的时间和空间都是有限的(宇宙将封闭)。

  1. 如果Ω值精确地等于1,即宇宙密度等于临界密度,宇宙盘旋在两个极端之间,但将永远膨胀;宇宙在变成一片火海之后又重新出现大爆炸,这个理论叫做振荡宇宙理论。

——此时空间是平的(欧氏几何),时间和空间都是无界的。

所以宇宙最终的命运是:要么死于大冷冻,要么在一片火海中火葬,要么永远在振荡。其实早在爱因斯坦相对论之前,人类已经基于热力学第二定律(又称熵增定律)知晓了宇宙的最终命运:一切事物最终将老化和耗尽。举个栗子:要点燃一张纸是容易的,因为这对总的“混乱度”(熵)造成了净增加,然而要将燃烧的烟尘再恢复为纸则是不可能的。宇宙所有的热源最终将消耗殆尽,温度逼近绝对零度,在此刻原子本身几乎停顿(热运动基本停止),只剩下一片飘荡着的质子之海,以及互相微弱作用的粒子汤。(参考自:加来道雄-平行宇宙)

一,SPI总线协议

SPI(Serial Peripheral interface):串行外围设备接口,是Motorola公司提出并定义的一种同步、串行、高速的全双工(也可支持半双工)通信总线;通常它在芯片中只用4个信号线(4线是SPI而非QSPI)来实现控制信号和数据信号的传输。SPI总线占管脚的数量少、节省PCB布局空间,而且总线速率高(50MHz),结构简单,所以SPI总线完全替代了LocalBus,在单板上的应用非常广泛,主要应用于Flash/EEPROM,RTC,ADC,数字信号解码器等等器件。

1,SPI总线概括

1.1 SPI 总线特点

SPI总线有如下的特点:

1. 采用主-从控制模式:SPI 规定了两个 SPI 设备之间通信必须由主设备(Master)来控制从设备(Slave);主设备通过提供 SCK(Clock)和SS (Slave Select)来控制多个从设备;

——SPI 协议规定从设备的 Clock 由主设备通过 SCK 管脚提供,而从设备本身不能产生或控制 Clock,没有 Clock 则 Slave 设备不能正常工作。

2. 采用同步(Synchronous)数据传输模式:Master 设备根据将要交换的数据来产生相应的时钟信号,时钟信号通过时钟极性(CPOL)和时钟相位(CPHA)控制两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样(SPI的操作时序并非只有一种,而是有多种选择),来保证数据在两个设备之间的同步传输;

——如下图所示,在同一条总线上的CPOL和CPHA设置必须相同,具体下面章节详细分析。

3. 数据交换:SPI 设备间的数据传输之所以又被称为数据交换,是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 “发送者(Transmitter)”或者“接收者(Receiver)”;在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据(主设备和从设备都是如此),相当于该设备有1 bit 大小的数据被交换了。SPI数据传输机制如下图示所示;

1,主(Master)设备移位寄存器(SSPSR)的MSb(高位)通过MOSI发送给从(Slave)设备移位寄存器(SSPSR)的LSb(低位);

——举个栗子,主设备移位寄存器的数据是:11111111;移位寄存器发送掉1bit后,数据变成1111111x。

2,同时从设备移位寄存器(SSPSR)的MSb(高位)通过MOSI发送给主设备移位寄存器(SSPSR)的LSb(低位);

——举个栗子,从设备移位寄存器的数据是:00000000;移位寄存器发送掉1bit后,数据变成0000000x。

3,经过1个SCK的时钟,主、从设备的移位寄存器(SSPSR)都向外发送了1bit,同时又接收到了1bit,移位寄存器的数据向左移动了1bit;

——经过1个SCK后,此时主设备移位寄存器内的数据是:11111110;而从设备移位寄存器内的数据为:00000001;主、从设备移位寄存器的数据完成了一次交换。

4,如此经过8个SCK时钟后,主、从设备移位寄存器中的数据完成了所有的交换。

——经过8SCK后,主设备移位寄存器内的数据是:00000000;从设备移位寄存器内的数据是:11111111;接下去设备必须在下次总线操作之前,将数据从移位寄存器转移到内部缓冲器(SSPBUF

——所以在数据传输的过程中,每次接收到的数据必须在下一次数据传输之前被采样,如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃,导致 SPI数据传输最终失效;在程序中一般都会在 SPI 传输完数据后去读取 SPI 设备里的数据,即使这些数据在程序里是无用的。

4,SPI只有主模式和从模式之分,而没有读、写的说法;因为实质上每次SPI的主、从设备是在交换数据,也就是说:你发一个数据必然会收到一个数据,而你要收一个数据必须也要先发一个数据

1.2 SPI 工作机制

上面章节我们介绍了SPI 设备在通信的过程中,主、从设备之间会产生一个数据链路回环(Data Loop),数据通过MOSI和MISO信号线在主、从设备之间进行交换;我们接下来看下SPI接口模块的内部工作机制:

1. 通过MOSI(SDO)和 MISO(SDI)管脚,移位寄存器(SSPSR) 控制数据移入移出内部收发缓冲器(SSPBUF);

2. Controller模块确定 SPI 总线的通信模式;

3. SCK 传输时钟信号(数据总线以及内部传输同步)。

其工作过程如下图所示:

1. SSPSR:SPI 设备内部的移位寄存器(Shift Regsister),其作用是根据时钟信号(SCK)和数据位宽(Bus Width和Channel Width)将数据移入或者移出 SSPBUF;

              1,Bus Width:指定内部数据总线(如右上图所示)到SSPBUF之间的数据传输位宽;

              ——举个栗子,如上右图所示想要往SSPBUF写入 16 Byte 大小的数据,假如设置Bus Width为1 Byte(8bit):往设备的Tx-Data寄存器写入数据,每次写入 1 Byte 大小的数据;写完 1 Byte 数据之后,设备里面的Tx-Data寄存器会自动1 Byte 数据移入SSPBUF里;上述动作一共需要重复执行 16次。

              2,Channel Width:作用是指定主(Master)设备与从(Slave)设备之间数据传输位宽。

              ——主设备内部的移位寄存器(SSPSR)会依据 Channel-Width 自动把数据从 Master-SSPBUF 里通过 Master-SDO 管脚搬运到从设备里的 Slave-SDI 引脚,Slave-SSPSR 再把每次接收的数据(满8bit)移入 Slave-SSPBUF里;一般Bus-Width 总是会大于或等于 Channel-Width,这样能保证不会出现因 Master 与 Slave 之间数据交换速率比设备内部数据总线与 SSPBUF之间的数据交换频率要快,从而导致 SSPBUF中出现数据丢失的情况。

2. SSPBUF:指 SPI 设备里的内部缓冲区,以 FIFO 的形式保存传输过程中的临时数据;

——主(Master)与从(Slave)之间交换的数据都是 SPI 内部移位寄存器(SSPSR)从 SSPBUF (“SPIxBUF”)里面拷贝的

              1,在发送数据之前,先往设备Tx-Data 寄存器写入将要发送出去的数据,这些数据会被根据Bus-Widtch自动移入Master-SSPBUF;

              2,然后被 Master-SSPSR 移位寄存器根据 Channel-Width 自动从 Master-SSPBUF移出;

              3,通过 Master-SDO(MOSI) 管脚传给 Slave-SDI管脚;

              4,而从Slave-SDI 接收到的数据则会被移入Slave-SSPSR;

              5,Slave-SSPSR根据Channel-Width自动移入 Slave-SSPBUF 里;

              6,同理,Slave-SSPBUF 里面的数据经过相同的过程移入了 Master-SSPBUF。

              ——在单次数据传输完成之后,用户程序可以通过从 Master 设备的 Rx-Data 寄存器读取 Master 设备数据交换得到的数据

3. Controller:指 SPI 设备里面的控制寄存器,通过配置它们来设置 SPI 总线的传输模式;主(Master)设备里面的 Controller 主要通过时钟信号(SCK)以及片选信号(SS/CS)来控制从(Slave)设备。

——举个栗子,由程序将 SS/CS 管脚的信号拉低电平、输出SCK时钟信号,完成 SPI 设备数据通信的前期工作;当程序想让 SPI 设备结束数据通信时,再把 SS/CS 管脚上的信号拉高电平并结束SCK时钟信号输出。

2,SPI总线物理实现

2.1 SPI 总线信号

对于SPI总线,如下图所示,我们只需要对四个管脚(pin) 进行编程即可控制整个 SPI 设备之间的数据通信:

1. MOSI(Master Output, Slave Input):主设备输出数据管脚,相应的对于从设备来说就是输入数据的管脚;

2. MISO(Master Input, Slave Output):主设备输入数据管脚,相应的对于从设备来说就是输出数据的管脚;

3. SCK:用于主设备向从设备传输时钟信号,控制数据、片选发送和接收的速率和时序;

——SCK由主设备发送给所有的从设备,不管该从设备是否被选中

4. SS/CS(Slave Select/Chip Select):主设备片选从设备,使被选中的从设备能够被主设备所访问;当有多个从设备的时候,主设备会分配给每个从设备一个片选信号,当我们的主设备和某个从设备进行通信时,需要将从设备对应的片选引脚电平拉低或者是拉高。

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

2.2 SPI 总线工作模式

SPI有4种不同的数据传输时序/模式:Mode 0/1/2/3;主要是对时钟的上升沿、下降沿,前沿、后沿触发的区分(还有MSB和LSB(大小端)传输方式);4种传输时序取决于CPOL和CPHA这两位不同的组合:

CPOL和CPHA表示的是SPI时钟的极性Polarity和相位Phase,简单总结如下:

1. CKPOL(Clock Polarity) = CPOL = 时钟极性;

2. CKPHA(Clock Phase) = CPHA = 时钟相位;

——CPOL配置SPI总线的极性,CPHA配置SPI总线的相位

3. CPOL影响的是SCK时钟的极性,即决定了时钟信号空闲时的电平是低电平还是高电平:

1,CPOL = 0时空闲电平为低电平(即,有效电平是高电平);

2,CPOL = 1时空闲电平为高电平(即,有效电平为低电平)。

4. CPHA是用来决定时钟采样的相位,即SPI总线从哪个时钟边沿开始采样数据:

1,CPHA = 0时在每个周期的第一个时钟边沿采样(奇数时钟边沿);

2,CPHA = 1时在每个周期的第二个时钟边沿采样(偶数时钟边沿)。

5. 所以总结起来:CPOL决定了时钟条边沿是上升沿还是下降沿,而CPHA决定了哪个条边沿采样;组合起来采样模式Mode 0/1/2/3如下图所示。

——主、从设备的SPI工作模式设置要相同,否则数据发送/接收会存在问题

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值