ARM嵌入式学习笔记:SPI通信协议详解

一、什么是SPI

SPI全称 Serial Peripheral Interface,串行外设接口。

  1. 通信属性:同步、全双工串行通信协议,用于ARM/单片机和板载外设高速通信。
  2. 4根信号线作用
  • SCLK:串行时钟线,由主机产生,用来同步通信时序
  • MOSI:主机输出、从机输入,主机向从机发送数据
  • MISO:主机输入、从机输出,从机向主机回传数据
  • CS/SS:片选线,选中需要通信的从设备,实现一主多从
  • 核心特点 ① 写即是读,读即是写。发送和接收同时发生,主机发1字节同时就会收到从机的1字节。 ② 读取从机数据时,主机必须发送Dummy占位字节(0xFF/0x00),用来产生时钟,才能读到从机数据。③ 传输速率:1MHz ~ 上百MHz;数据高位先行。

二、SPI有几种工作模式?分别是什么?

由两个参数共同决定模式:CPOL时钟极性 、CPHA时钟相位

1)参数含义

  1. CPOL(时钟极性):SCLK空闲状态的电平
  • CPOL=0:空闲时SCLK为低电平
  • CPOL=1:空闲时SCLK为高电平
  1. CPHA(时钟相位):接收方在哪一个边沿采样数据
  • CPHA=0:在时钟第一个边沿采样
  • CPHA=1:在时钟第二个边沿采样

2)四种工作模式

  1. Mode0:CPOL=0,CPHA=0 空闲SCLK低电平,在上升沿采样数据
  2. Mode1:CPOL=0,CPHA=1 空闲SCLK低电平,在下降沿采样数据
  3. Mode2:CPOL=1,CPHA=0 空闲SCLK高电平,在下降沿采样数据
  4. Mode3:CPOL=1,CPHA=1 空闲SCLK高电平,在上升沿采样数据

⚠️重要:主机、从机CPOL、CPHA必须完全一致,否则通信数据全部错乱。外设(ADXL345、OLED)都有固定模式,以芯片手册为准。

三、ADXL345传感器量程、分辨率

ADXL345:三轴MEMS数字加速度传感器,支持I2C、SPI。

  1. 量程 软件可配置档位:±2g、±4g、±8g、±16g;最大测量范围 ±16g;1g = 9.8m/s²。
  2. 分辨率
  • ±16g量程下:13位分辨率
  • 灵敏度:1LSB ≈0.0039g
  • 换算公式:实际加速度(g) = 传感器原始数值 × 0.0039

示例: X轴原始123 → X = 123 × 0.0039 g Y轴原始200 → Y = 200 × 0.0039 g Z轴原始300 → Z = 300 × 0.0039 g

四、I2C和SPI有什么区别

下面分点逐条对比:

  1. 通信模式
  • I2C:同步、半双工,同一时间只能单向收发
  • SPI:同步、全双工,可以同时收、发数据
  1. 信号线
  • I2C:只需要2根线(SCL时钟、SDA数据),增加从机不需要再加引脚
  • SPI:4根线(SCLK、MOSI、MISO、CS),每增加1个从机,就要多1根CS片选引脚
  1. 通信速度
  • I2C:100KHz ~ 3.4MHz,速度偏低
  • SPI:1MHz ~ 100MHz,速度远高于I2C
  1. 设备架构
  • I2C:支持多主多从,依靠设备地址区分不同外设
  • SPI:只支持一主多从,依靠CS片选线选择外设
  1. 数据传输顺序
  • I2C:低位先行
  • SPI:高位先行
  1. 应答校验
  • I2C:自带硬件ACK应答,可以确认数据是否被接收
  • SPI:没有硬件应答,无校验,需要软件做判断
  1. 硬件电路要求
  • I2C:SDA、SCL必须加上拉电阻
  • SPI:不需要上拉电阻
  1. 适用场景
  • I2C:引脚少,适合挂载大量低速传感器
  • SPI:高速,适合OLED、Flash、高速加速度传感器

总结:I2C赢在引脚少、支持多主、有应答;SPI赢在速度快,支持全双工。

小结

  1. SPI是同步全双工串行协议,四根信号线,一主多从,读写同步进行。
  2. CPOL、CPHA组合出4种SPI模式,主从配置必须相同。
  3. ADXL345最大量程±16g,13位分辨率,原始读数乘0.0039得到g值。
  4. I2C引脚少、带应答;SPI速度高、可全双工。
相关推荐
叼烟扛炮9 小时前
[LangChain] 学习笔记(06):突破大模型限制——结构化输出(Structured Output)
windows·笔记·学习·langchain
且从容.10 小时前
VUE3学习笔记(根据黑马教程总结)
笔记·学习
蒸蒸yyyyzwd11 小时前
关于 AI 开发相关的一些面经。
笔记·学习
2603_9696948512 小时前
JDBC 基础学习笔记:API 核心原理解析与 CRUD 代码实操
数据库·笔记·mysql·学习方法·database·sql注入
迪康coolmu13 小时前
出差终端数据安全落地实战:基于迪康端点安全一体化管理系统的四道防线实践
运维·服务器·经验分享·笔记·其他·安全·php
물の韜15 小时前
ZYNQ/FMQL系列Linux之I2C开发实战
linux·arm开发·嵌入式硬件·设备树·iic·zynq
无咎.lsy16 小时前
《机器学习》笔记
笔记·机器学习
坤坤子吖17 小时前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
蒸蒸yyyyzwd19 小时前
后端相关学习笔记。
笔记·学习
旖旎夜光20 小时前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习