01  SPI简介

SPI,全称为Serial Peripheral interface,即串行外围设备接口。由摩托罗拉率先在产品上使用。SPI是一种高速全双工,同步(full duplex synchronous)的通信总线协议,且占用硬件端口只有4个(SO,SI, SCLK 和CSN),所以出于这种简单易用的特性,越来越多的芯片开始将该总线协议集成在了芯片中。在工作中如果涉及到底层软件编写,大概率会经常用到SPI通信。打开英飞凌官网,直接搜索一个工作中比较常用到的芯片TLE75080,对应着相应章节结合实际开发来学习。

02  协议详解

⚫ SPI采用主从模式的控制方式

SPI协议规定必须由主设备(Master)控制从设备(Slave),首先通过CS片选信号选中特定的从设备,然后通过SCK引脚给Slave设备提供时钟。Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作。理论上,主设备可以控制无限多个从设备,(实际上,从设备挂载的个数也受限于具体的硬件环境)。如图:

SPI采用同步传输方式进行通信

当通信发生时,主设备会生成相应的时钟脉冲信号,在每个时钟的上升沿或者下降沿,时钟信号会驱动设备内部的移位寄存器,使得主设备的数据从移位寄存器中移出后移入从设备的移位寄存器中,同时从设备也会有数据从SO引脚移出到主设备中。这样就保证了数据的同步传输。一般来说,SPI并没有读和写的说法,本质上,数据的通信其实也是数据交换的过程。

SPI 设备间的数据传输之所以又被称为数据交换, 是因为 SPI 协议规定一个 SPI 设备不仅能在数据通信过程中充当一个 "发送者(Transmitter)" 或者 "接收者(Receiver)". 在每个 Clock 周期内, SPI 设备都会发送并接收一个 bit 大小的数据, 相当于该设备有一个 bit 大小的数据被交换了。

03  工作原理

⚫ 两个寄存器SSPBUF , SSPSR

SSPBUF:Synchronous Serial Port Buffer, 泛指 SPI 设备里面的内部缓冲区, 一般在物理上是以 FIFO 的形式, 保存传输过程中的临时数据;

SSPSR,:Synchronous Serial Port Register, 泛指 SPI 设备里面的移位寄存器(Shift Regitser), 它的作用是根据设置好的数据位宽(bit-width) 把数据移入或者移出 SSPBUF;

SPI 设备在进行通信的过程中, Master 设备和 Slave 设备之间会产生一个数据链路回环(Data Loop), 就像上图所画的那样, 通过 SDO 和 SDI 管脚, SSPSR 控制数据移入移出 SSPBUF, Controller 确定 SPI 总线的通信模式, SCK 传输时钟信号。

⚫ 时序说明

以TLE75080为例,从上图中可以获取的信息有:

✔ 16bits SPI

✔ 以MSB模式传输数据

✔ 数据在时钟的下降沿移入TLE75080芯片中,在时钟下降沿移出

✔ 时钟在空闲时为低电平

极性和相位

在SPI中有个很重要的参数即极性和相位,比较常见的缩写为CPOL,CPHA。就是在上一节中TLE75080交换数据的方式,数据在时钟的下降沿移入TLE75080芯片中,在时钟下降沿移出。所以极性和相位都是相对于时钟来说的。

再此需要插一段边沿(edge)的概念,在每个脉冲里,都有一个上升沿和一个下降沿,对于Leading edge来说就是第一个边沿,对于开始电压是1,那么就是1变成0的时候,对于开始电压是0,那么就是0变成1的时候;Trailing edge是第二个边沿,对于开始电压是1,那么就是0变成1的时候(即在第一次1变成0之后,才可能有后面的0变成1),对于开始电压是0,那么就是1变成0的时候;

所谓极性SPI的CPOL,表示当SCLK空闲idle的时候,其电平的值是低电平0还是高电平1:

CPOL=0,时钟空闲idle时候的电平是低电平,所以当SCLK有效的时候,就是高电平,就是所谓的active-high;

CPOL=1,时钟空闲idle时候的电平是高电平,所以当SCLK有效的时候,就是低电平,就是所谓的active-low;

相位CPHA对应于数据采样是在时钟的第几个边沿,0为第一个边沿,1为第二个边沿。(1) CPHA=0,表示第一个边沿:✔ 对于CPOL=0,idle时候的是低电平,第一个边沿就是从低变到高,所以是上升沿;✔ 对于CPOL=1,idle时候的是高电平,第一个边沿就是从高变到低,所以是下降沿;(2) CPHA=1,表示第二个边沿:✔ 对于CPOL=0,idle时候的是低电平,第二个边沿就是从高变到低,所以是下降沿;✔ 对于CPOL=1,idle时候的是高电平,第一个边沿就是从低变到高,所以是上升沿;

那么相位,极性配合起来,就有4中情况,如图(图片来自网络)。

⚫ 再聊SSPSR

SSPSR 是 SPI 设备内部的移位寄存器(Shift Register). 它的主要作用是根据 SPI 时钟信号状态, 往 SSPBUF 里移入或者移出数据, 每次移动的数据大小由 Bus-Width 以及 Channel-Width 所决定。

Bus-Width 的作用是指定地址总线到 Master 设备之间数据传输的单位.

例如, 我们想要往 TLE75080 设备里面的 SSPBUF 写入 16 bits 大小的数据: 首先, 将mcu相关寄存器设置 宽度 为 16bits; 然后配置为MSB传输模式。

再在相应的寄存器中设置相位和极性。到此,主设备mcu的spi主要属性已经配置完毕。

然后往 mcu 设备的 Tx-Data 移位寄存器在地址总线的入口写入数据, 每次写入 16bits 大小的数据(使用 writeb 函数); 写完之后, mcu设备里面的 Tx-Data 移位寄存器会自动把从地址总线传来的16bits数据移入 SSPBUF 里。

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 里面存放的数据为无效数据这样的情况。

04  调试结果

以TLE75080为例,SPI通信是由ss(cs)、sck、sdi、sdo构成,总线上挂载了2片TLE75080,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。根据上文手册中的spi属性配置如图:

从上图可以看出,从设备只有在片选选中的时候,才会对移入移位寄存器的数据进行处理并同时返回给主设备相应数据。这样就可以实现两个芯片交替通信。

然后放大后,可以看到数据是在下降沿的时候进行采样,时钟会在空闲时置低。极性相位一目了然。

至此SPI的主要原理就暂告一段路了。

编辑:Zhang Jinwei

部分图片来自网络

往期文章:

CMake简介

走进IP

Linux下Socket通信

聊聊汽车诊断刷新那点事

28335接两个spi设备_SPI浅析相关推荐

  1. 28335接两个spi设备_IIC和SPI如此流行,谁才是嵌入式工程师的必备工具?

    IICvs SPI 现今,在低端数字通信应用领域,我们随处可见 IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身 ...

  2. 二十、SPI设备驱动及应用(一)

    先给出Linux SPI子系统的体系结构图: SPI子系统体系结构 下面开始分析SPI子系统. Linux中SPI子系统的初始化是从drivers/spi/spi.c文件中的spi_init函数开始的 ...

  3. 【计算机网络】物理层设备功能浅析

    [计算机网络]物理层设备功能浅析 2017-05-07 若愚  今天想给大家分享一下计算机网络中的物理层设备,以及他们各自的功能和特性,内容比较简单,有问题的还请多多指教~ 一.物理层的功能 为数据端 ...

  4. LINUX SPI设备驱动模型分析之二 SPI总线模块分析

    上一篇文章我们简要介绍了SPI驱动模块,本章我们详细说明一下spi总线.设备.驱动模块的注册.注销以及这几个模块之间的关联. SPI总线的注册 spi模块也是基于LINUX设备-总线-驱动模型进行开发 ...

  5. platform框架--Linux MISC杂项框架--Linux INPUT子系统框架--串行集成电路总线I2C设备驱动框架--串行外设接口SPI 设备驱动框架---通用异步收发器UART驱动框架

    platform框架 input. pinctrl. gpio 子系统都是 Linux 内核针对某一类设备而创建的框架, input子系统是管理输入的子系统 pinctrl 子系统重点是设置 PIN( ...

  6. Linux内核自带SPI设备驱动测试程序分析:spidev_test.c

        在Linux系统中,SPI 的用户模式设备接口的驱动源码位于 drivers/spi/spidev.c,在应用层生成 /dev/spidev* 的节点,可以通过 read. write 达到与 ...

  7. RT-Thread (2) RTT SPI设备驱动流程 || LWIP + ENC28J60

    系列文章目录 RT-Thread (1) 添加外部内存到内存管理 RT-Thread (2) RTT SPI设备驱动流程 || LWIP + ENC28J60 RT-Thread (3) 为RTT增加 ...

  8. linux-3.0.1下spi设备mx25l的驱动

    linux-3.0.1下spi设备mx25l的驱动(基于OK6410) 总述 学linux也快有一年了,这半年断断续续,忙着杂七杂八的事情,一直没全身心的投入的学.作为一个初学者对复杂而博大精深的li ...

  9. linux probe函数调用,linux spi设备驱动中probe函数何时被调用

    这两天被设备文件快搞疯了,也怪自己学东西一知半解吧,弄了几天总算能把设备注册理清楚一点点了.就以spi子设备的注册为例总结一下,免得自己忘记. 首先以注册一个spidev的设备为例: static s ...

最新文章

  1. HBase学习总结(2):HBase介绍及其基本操作
  2. 线上集群服务器性能参数查看命令
  3. asp.net 后台任务作业框架收集
  4. Java 静态导入 、可变参数
  5. vue 学习笔记—路由篇
  6. dhcp工具_网络分析之DHCP服务闯入QinQ二层隧道引发故障
  7. 微服务开发的 10 个最佳实践
  8. 信息学奥赛一本通 1061:求整数的和与均值 | OpenJudge NOI 1.5 04
  9. Docker 安装、镜像、dockerfile、容器、仓库
  10. python 使用前馈神经网络处理IrIs数据集(BP)
  11. Telink 825x 蓝牙开发笔记1
  12. 把时间还给洞察,且看PPT调研报告自动生成攻略
  13. 《自己动手写cpu》读书笔记
  14. python代码复制运行不了_pycharm 复制代码出现空格的解决方式
  15. Win系统使用DINO训练自己数据集
  16. 没做过项目经理可以考pmp证书吗?普通人考PMP®有用吗?
  17. 创造与魔法241服务器系统什么时候修好,《创造与魔法》萌新小课堂——如何选择服务器...
  18. SpringBoot笔记:消息队列(RabbitMQ)
  19. 国内外十大ERP软件系统排名!
  20. MAMP PRO for Mac 使用说明

热门文章

  1. oracle备份归档文件,oracle 如何不备份已经备份的归档
  2. faster rcnn学习之rpn训练全过程
  3. apicloud手机查看效果
  4. 浅谈session,cookie,sessionStorage,localStorage的区别及应用场景
  5. 关于strassen矩阵乘法的矩阵大小不是2^k的形式时,时间复杂度是否还是比朴素算法好的看法...
  6. navicat连接mysql报10061错
  7. .net 解析Transfer-Encoding:chunked 秒掉网上无用方案
  8. Visual Studio 2013 添加一般应用程序(.ashx)文件到SharePoint项目
  9. python 波形发生_事件与信号
  10. linux 远程图形终端,图形终端远程操作Linux