当前位置: 首页 > news >正文

嵌入式知识点-SPI通讯

该文原自 : 正点原子

01 SPI概述

       SPI (Serial Peripheralinterface),顾名思义就是串行外围设备接口。SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,主要应用在EEPROM,FLASH,实时时钟,AD转换器。

        打开STM32F103手册,找到SPI的结构框图,了解它的大致功能,如以下图所示:


          

 




       关于SPI协议,那么我们理解一句话即可。SPI的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。


       主机与从机连接关系图:

一个GIF描述关于SPI传输过程:SPI可以指定数据传输从MSB位还是LSB位开始:例如数据传输从MSB位开始:

 

   上述GIF可知:当一个上升沿来临时,MOSI发送主机的最高位MSB为1,而MISO是由从机发出为1,然后等价交换。注意:上述SPI的GIF使用的是SPI模式1,SPI不一定是由上升沿为数据采样,是由SPI模式决定,上述GIF的MSB代表移位寄存器的最高位,由此类推,我们得到以下表格:



             




          注意:上述图中的颜色以及MSB为串行缓冲区的最高位 


02 SPI引脚信息


       MISO:主设备数据输入,从设备数据输出,简单来讲:从机发数据到串行总线上或者主机接收总线的数据。
       MOSI :主设备数据输出,从设备数据输入,简单来讲:主机发数据到串行总线上或者从机接收总线的数据。
       SCLK :时钟信号,由主设备产生,数据发送时,必须有方波输出,没有数据时,不会有方波输出。
       CS:从设备片选信号,由主设备控制。简单来讲:主机发送数据到那个从机,如果CS为低电平就是使能该从机,否则除能该从机。




03 SPI工作模式

       SPI的工作模式:是由CPOL(时钟极性)和CPHA(时钟相位)相关。
       时钟极性(CPOL):指通讯设备处于空闲状态(SPI开始通讯前、nSS线无效)时,SCK的状态。
       CPOL = 0:SCK在空闲时为低电平。
       CPOL = 1:SCK在空闲时为高电平。
       前面小编说了,如果从机没有数据发送或者主机没有数据发送,那么SCK不会有方波输出,SCK在空闲状态为低电平或者高电平是由时钟极性(CPOL)决定。
       时钟相位(CPHA):指数据的采样时刻位于SCK的偶数边沿采样还是奇数边沿采样。
       CPHA = 0:在SCK的奇数边沿采样。
       CPHA = 1:在SCK的偶数边沿采样。
      由上述CPOL(时钟极性)和CPHA(时钟相位)可知:SPI模式一共分为四种,如以下图所示:


          




      注意:上述图片红色部分:SPI模式0时,空闲状态时候SCLK为低电平,如果需要数据采样那么SCLK输出一个方波,那么该方波是奇数边沿时刻,采样边沿为上升沿。

      SPI模式1时,空闲状态时候SCLK为低电平,如果需要数据采样那么SCLK输出一个方波,那么该方波是偶数边沿时刻,采样边沿为下降沿。

      SPI模式2时,空闲状态时候SCLK为高电平,如果需要数据采样那么SCLK输出一个方波,那么该方波是奇数边沿时刻,采样边沿为下降沿。

      SPI模式3时,空闲状态时候SCLK为高电平,如果需要数据采样那么SCLK输出一个方波,那么该方波是偶数边沿时刻,采样边沿为上升沿。 

04 SPI实验


      例如:CPOL =0 和CPHA =0为例,其他模式一样的原理,SCL空闲时候为低电平,奇数边沿上升沿采样,那么下降沿接收数据,如果两块STM32的SPI1相连,如以下图所示:


          




       主机和从机都有一个串行移位寄存器,主机通过想它的SPI串行寄存器写入一个字节来发起一次传输。

       主机的串行移位寄存器通过MOSI线将字节传输给从机,同时从机也将自己的串行移位寄存器中的内容通过MISO线传输给主机。这样两个移位寄存器的内容就被交换了。

       外设的写操作和读操作是同步完成的。如果只想进行写操作,主机只需忽略接收的字节。如果只想进行读操作,也必须发送一个字节(可以是空字节)来引发从机传输。

       那么它们都具有一个串行移位寄存器,例如主机串行缓冲区数据为0xAA,那么发送从机的数据为0xaa就是10101010二进制,如果从机的串行缓冲区数据的数据为0x9F,转成二进制为10011111,所以我们得到下图所示:


总结

       前面我们已经说了CPOL设置为0,所以SCLK空闲状态为低电平,如果没有数据发送,那么SCLK一直为低电平。
       当主机发送数据时,SCLK一直为低电平转为输出一个方波,注意是八个脉冲,由于CPHA 设置为 0,所以奇数边沿,上升沿有效,所以数据采样在上升沿,当发送完成时,MOSI转成高电平。
       NSS为低电平有效,主要使能从机。
       主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输
       串行移位寄存器通过MOSI信号线将字节传送给从机,同时从机也将自己的串行移位寄存器中的内容通过MISO信号线返回给主机。这样,两个移位寄存器中的内容就被交换; 

 

 

http://www.lryc.cn/news/27957.html

相关文章:

  • C#教程--01 简介
  • 【java基础】一篇文章彻底搞懂lambda表达式
  • 通用SQL查询分析器
  • 机器学习100天(三十八):038 朴素贝斯-处理离散数据
  • 【3.3】指针、二分、SSM项目
  • buu [INSHack2017]rsa16m 1
  • 【数据结构起航】:衡量算法的好坏--时间空间复杂度
  • 动手学深度学习【1】——线性回归
  • Html 相关知识
  • 【冲刺蓝桥杯的最后30天】day1
  • c++泛型编程与模板-01函数模板
  • Golang http请求忘记调用resp.Body.Close()而导致的协程泄漏问题(含面试常见协程泄漏相关测试题)
  • 进程信号生命周期详解
  • 2023-03-03干活小计
  • 操作系统结构
  • [SSD科普] 固态硬盘物理接口SATA、M.2、PCIe常见疑问,如何选择?
  • 【Java学习笔记】3.Java 基础语法
  • Python基础学习6——if语句
  • 有免费的PDF转Word吗?值得收藏的7个免费 PDF转Word工具请收好
  • Thinkphp6使用RabbitMQ消息队列
  • 小成本互联网创业怎么做?低成本创业的方法分享
  • 六、栈、栈的相关问题
  • Java安全停止线程
  • 12 readdir 函数
  • Windows环境搭建Android开发环境-Android Studio/Git/JDK
  • 全国爱耳日丨听力受损严重有哪些解决办法
  • 【抽水蓄能电站】基于粒子群优化算法的抽水蓄能电站的最佳调度方案研究(Matlab代码实现)
  • 【异常】因多租户字段缺少导致Error updating database. Column ‘tenant_id‘ cannot be null
  • 类和对象(上)
  • Java经典面试题——谈谈 Java 反射机制,动态代理是基于什么原理?