云计算百科
云计算领域专业知识百科平台

协议解析—SPI篇

以下内容是我对于学习笔记的整理和补充,仅代表我个人还比较浅薄的认知观点,如有错误还请指出,感谢各位。

基础介绍

MOSI –主机输出 / 从机输入数据线,共用。

MISO –主机输入 / 从机输出数据线,共用。

SCK –时钟线,主设备输出时钟信号至从设备,常态低电平,共用。

CS –从设备选择线。也叫 SS、CSB、CSN、EN 等,低电平有效,单独

发送数据的过程,低位先行还是高位先行都是可以自由决定的,不受限制。

标准速率可达10-50MHz,高速SPI可以达到100M以上

SPI 的工作时序模式由 CPOL(时钟极性,决定数据有效的高低)和 CPHA(时钟相位,边缘检测)组合决定。这两者都是针对于SCK而设定,极性决定了总线在空闲情况下的电平,相位则是决定了在第一还是第二个跳变沿采样,也就是我们熟悉的上下沿。如图所示,时钟的相位的不同可以分出四种情况。基本情况下我们都是用的第一种,但是有一些设备会出现强制要求某一模式或者默认不是0模式的情况,我们就需要注意主从模式的一致,不然所有的数据都会混乱。

模式CPOLCPHA空闲电平数据采样边沿说明
模式0 (MODE 0) 0 0 低电平 上升沿 最常用。空闲低,上升沿采样。
模式1 (MODE 1) 0 1 低电平 下降沿 空闲低,下降沿采样。
模式2 (MODE 2) 1 0 高电平 下降沿 空闲高,下降沿采样。
模式3 (MODE 3) 1 1 高电平 上升沿 空闲高,上升沿采样。

协议解析

对于有单独的CS片选信号引脚的SPI协议而言,起始与终止信号就显得朴实无华,主机只需要拉低对应的从机CS引脚就代表选中,松开恢复高电平就是结束通信。

图中是两个SPI的移位寄存器,两者数据传输的过程就像是一个回环,寄存器中数据左移一位,最高位被移动到MOSI上,寄存器空出最低位,同时从机寄存器中数据也是左移一位,最高位放置于MISO发送,也空出来最低位,一轮交换,两者的数据都左移了一位,同时最低位被对方最高位给补上,重复以上交换8次,两者的寄存器就完整交换了对方的数据过来,寄存器的数据再被读取保存,写入新的数据就可以开始下一轮的数据交换。

具体的发送内容与其他的协议大同小异,都是先发送操作指令,对于不同的外设,其厂家提供的指令集不尽相同,在此不做赘述,只需要知道应该怎么发送即可,发送内容需要看具体的外设操作手册。

最常见的模式0,由于空闲时是低电平,又在上升沿采样,就需要我们在CS(图中是NSS)拉低,到第一个时钟周期来之前,提前把我们的数据写入数据寄存器。对于模式2也是如此,两者都是在SCL第一个跳变的边缘就需要准备好数据寄存器的内容,准备时间上相对于其余两者(其余两者都是第二个跳变沿,时间上更为充足)而言要更短,如果是硬件SPI则没有太大问题,但是对于软件SPI而言就需要注意延时了。

在高电平期间,MOSI读取寄存器中的内容并发送,MISO则是读取和接收,在一个字节的发送过程中,数据寄存器做的一直都是左移操作(如果你是低位先行则是右移),不需要准备新的数据,只有在发送完以后,寄存器的数据被读取,才会被内部总线并行地传入新的数据。

数据接收之后,主要考虑的是接收缓冲器数据保存问题,硬件设计上移位寄存器全部移位完成后,就会被接收缓冲器自动搬运,就会导致如果你在没来得及拿走缓冲器中的数据,新的数据就会自动转运,旧数据就会被覆盖,无法找回。由于SPI的速率高,多数情况下我们都会配合DMA来进行数据的转运,不需要CPU的频繁数据读取。

DMA

在此只做简单的了解,DMA涉及的范围会比较广。

Direct Memory Access,见名知义,直接内存访问。MCU工作过程中,除了自身的大量数据需要处理,还会有很多的外设挂载,他们也会产生数据需要进行处理,每次我们去操作外设搬运数据的时候,都是我们CPU在操作,如果挂载的外设过多,或者数据量大,CPU在处理、转运外设数据上就会消耗量的时间,反而我们系统原本的工作没人去做了,这肯定是不行的。

DMA由此而生,很多数据其实CPU是不需要直接去进行操作的,我们只是读取即可,那么DMA就可以帮助我们把总线上的数据自动搬运到我们指定的地方,全程硬件自动完成,不需要CPU操作,极大缓解了CPU的负担。这样哪怕是大量数据的情况,比如SPI的寄存器数据,不及时取走就会丢失,DMA就可以帮我们存到指定的地址,CPU要用的时候就再去操作,不需要频繁响应这些外设的请求了。

杂项

标准SPI不只是可以全双工运行,还可以分为两种情况;

两根数据线MOSI,MISO:半双工模式。

一根数据线:单工模式。

也就是说,没法让两根线同时收或者发,这种情况是DSPI的场景;需要注意不是所有的SPI都可以变成DSPI,DSPI需要主机和从机都支持才可以切换。DSPI就是特化写或者读的能力,比如对于存储芯片而言,我只要他的读,那就可以使用DSPI,速率是的SPI两倍,代价就是失去了写的能力。

更高的带宽只能是考虑加线,DSPI(Dual SPI Flash)就是让两根线变为输出,从而变成半双工但是数据量倍增;而QSPI则是多了两个数据线,速度再次倍增。

小结

对比于IIC,SPI的优点显而易见,十多倍的速度差距,但是代价也是很明显的,就是至少两倍的引脚消耗。同时SPI对于IIC的协议来说有了更多的模式选择,时钟相位的不同组合,任意的高低位先行,全双工设计不需要收发都挤占一根信号线,也不需要IIC那么复杂的协议流程。在实际的使用中,大多数SPI的使用情况都是屏幕或者存储一类大数据量需求的,IIC主要就是一些传感器之类的小数据需求情况。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 协议解析—SPI篇
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!