通信协议-SPI
一、SPI概述
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是美国摩托罗拉公司(Motorola)最先推出的一种同步串行传输规范,也是一种单片机外设芯片串行扩展接口,是一种高速、全双工、同步通信总线,所以可以在同一时间发送和接收数据,SPI没有定义速度限制,通常能达到甚至超过10M/bps。
SPI属于一主多从(一个主设备(Master),多个从设备(Slave))的总线结构,当存在多个从设备的时候,主设备通过片选信号来决定选择哪个设备。
1.1 基本结构
SPI共有4条信号线:
- MISO(Master in slave out):主设备输入从设备输出,数据由从设备发出;
- MOSI(Master out slave in):主设备输出从设备输入,数据由主设备发出;
- SCLK/SCK(Serial clock):串行时钟信号,由主设备产生;
- /(Slave/Chip slect):丛机选择信号,一般低电平有效,由主设备发出;
由上图也可以看出当SPI设备间通信时,数据线应该是MOSI连接MOSI,MISO连接MISO,SCLK与SCLK相连。
当只有单一SPI从设备时,如果从设备允许的话,可直接将CS/SS线固定在低电平。
对于多个从设备时,则每个从设备都需要一根CS/SS线来于主设备相连,从而达到主设备能与任一从从设备通信的目的。
1.2 优缺点
SPI总线的优点:
- SPI通信无起始位和停止位,因此数据可以连续流传输而不会中断;没有像I2C这样的复杂的从站寻址系统,数据传输速率比I2C更高(几乎快两倍)。独立的MISO和MOSI线路,可以同时发送和接收数据;
SPI总线的缺点:
- SPI使用四根线,而I2C和UART只是使用两根线,没有信号接收成功的确认(I2C拥有该功能),没有任何形式的错误检查(如UART中的奇偶校验位等);
二、主从设备通信过程
在SPI每个时钟中期内,都会进行一次全双工数据的传输,主设备通过MOSI线上发送1位时,从设备也会在读取数据之后通过MISO发送发送1位数据出去。
SPI主从设备都有一个串行移位寄存器,主设备通过向它的SPI串行移位寄存器写入一个字节来发送一次数据传输。
SPI数据通信流程可以分为以下几个步骤:
- 主设备发起信号,将或拉低,通信开始;
- 主设备通过发送SCLK时钟信号,告诉从设备进行读写操作。这里的SCLK时钟信号是由SPI的模式来决定高电平还是低电平有效;
- 主设备将要发送的数据写入到发送数据缓冲区(Memory),缓冲区经过移位寄存器位[7:0],串行移位寄存器通过MOSI将字节数据一位一位的传输到从设备,同时MISO接收到的数据经过移位寄存器一位一位的传输到接收缓冲区;
- 从设备也将自己的串行移位寄存器位[7:0]的数据通过MISO传输到主设备,同时通过MOSI接收主设备发送的数据,这样这两个移位寄存器中的数据被交换;
三、通信特性
3.1 设备选择
SPI是单主设备(Single Master)通信协议,只有一个主设备能发起通信,当SPI主设备想读/写从设备时,它首先拉低从设备对应的线。
接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,主设备把信号发到MOSI实现“写”,同时可对MISO采样而实现“读”。如下图所示:
3.2 设备时钟
SPI时钟特点主要包括:时钟频率、时钟极性和时钟相位。
3.2.1 时钟频率
SPI主设备必须在通信开始之前配置并生成相应的时钟信号,当然时钟频率受限于我们SPI主设备能输出的最大频率、以及最大的SPI传输频率。
3.2.2 时钟极性
根据硬件制造商的命名规则不同,时钟极性通常写为CKP或CPOL。时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据。
时钟极性(CPOL)定义了SCLK时钟线空闲状态时的电平:
- CPOL=0,即SCLK=0,表示SCLK时钟信号线在空闲状态时的电平为低电平,因此有效状态为高电平;
- CPOL=1,即SCLK=1,表示SCLK时钟信号线在空闲状态时的电平为高电平,因此有效状态为低电;
亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。
日期 | 姓名 | 金额 |
---|---|---|
2023-09-06 | *源 | 19 |
2023-09-11 | *朝科 | 88 |
2023-09-21 | *号 | 5 |
2023-09-16 | *真 | 60 |
2023-10-26 | *通 | 9.9 |
2023-11-04 | *慎 | 0.66 |
2023-11-24 | *恩 | 0.01 |
2023-12-30 | I*B | 1 |
2024-01-28 | *兴 | 20 |
2024-02-01 | QYing | 20 |
2024-02-11 | *督 | 6 |
2024-02-18 | 一*x | 1 |
2024-02-20 | c*l | 18.88 |
2024-01-01 | *I | 5 |
2024-04-08 | *程 | 150 |
2024-04-18 | *超 | 20 |
2024-04-26 | .*V | 30 |
2024-05-08 | D*W | 5 |
2024-05-29 | *辉 | 20 |
2024-05-30 | *雄 | 10 |
2024-06-08 | *: | 10 |
2024-06-23 | 小狮子 | 666 |
2024-06-28 | *s | 6.66 |
2024-06-29 | *炼 | 1 |
2024-06-30 | *! | 1 |
2024-07-08 | *方 | 20 |
2024-07-18 | A*1 | 6.66 |
2024-07-31 | *北 | 12 |
2024-08-13 | *基 | 1 |
2024-08-23 | n*s | 2 |
2024-09-02 | *源 | 50 |
2024-09-04 | *J | 2 |
2024-09-06 | *强 | 8.8 |
2024-09-09 | *波 | 1 |
2024-09-10 | *口 | 1 |
2024-09-10 | *波 | 1 |
2024-09-12 | *波 | 10 |
2024-09-18 | *明 | 1.68 |
2024-09-26 | B*h | 10 |
2024-09-30 | 岁 | 10 |
2024-10-02 | M*i | 1 |
2024-10-14 | *朋 | 10 |
2024-10-22 | *海 | 10 |
2024-10-23 | *南 | 10 |
2024-10-26 | *节 | 6.66 |
2024-10-27 | *o | 5 |
2024-10-28 | W*F | 6.66 |
2024-10-29 | R*n | 6.66 |
2024-11-02 | *球 | 6 |
2024-11-021 | *鑫 | 6.66 |
2024-11-25 | *沙 | 5 |
2024-11-29 | C*n | 2.88 |

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
2022-02-09 linux驱动基础概念以及驱动程序框架搭建
2020-02-09 Spring Security -- 短信验证码登录(转载)
2020-02-09 Spring Security -- 添加记住我功能(转载)
2020-02-09 Spring Security -- 添加图形验证码(转载)
2020-02-09 Spring Security -- 自定义用户认证(转载)
2020-02-09 Spring Security -- Spring Boot中开启Spring Security