SPI(Serial Peripheral Interface)详解

SPI(串行外设接口)是一种由摩托罗拉(现为NXP)开发的同步、全双工串行通信协议,专为短距离高速数据传输设计。其核心特点是主从架构、硬件简单、无寻址开销,广泛应用于嵌入式系统中微控制器与外设的连接。


一、SPI的核心特性

1. 通信架构
  • 主从模式

    • 主设备(Master):生成时钟信号(SCLK),控制通信时序。

    • 从设备(Slave):被动响应主设备指令,同一总线上可挂载多个从设备。

  • 信号线

    • SCLK(Serial Clock):主设备输出的时钟信号。

    • MOSI(Master Out Slave In):主设备发送数据到从设备。

    • MISO(Master In Slave Out):从设备发送数据到主设备。

    • SS/CS(Slave Select/Chip Select):主设备通过拉低对应片选信号激活从设备。

2. 数据传输
  • 全双工通信:数据在MOSI和MISO线上同时传输。

  • 时钟边沿同步:数据在SCLK的上升沿或下降沿采样(由CPOL和CPHA决定)。

  • 数据帧格式:通常以字节(8位)为单位,支持MSB(高位优先)或LSB(低位优先)传输。

3. 时钟模式(CPOL与CPHA)
  • CPOL(Clock Polarity)

    • 0:时钟空闲时为低电平。

    • 1:时钟空闲时为高电平。

  • CPHA(Clock Phase)

    • 0:数据在第一个时钟边沿采样(上升沿或下降沿)。

    • 1:数据在第二个时钟边沿采样。

  • 四种组合模式

    模式 CPOL CPHA 采样边沿
    0 0 0 上升沿采样,下降沿更新数据
    1 0 1 下降沿采样,上升沿更新数据
    2 1 0 下降沿采样,上升沿更新数据
    3 1 1 上升沿采样,下降沿更新数据

二、SPI的优缺点

1. 优点
  • 高速传输:典型速率可达10~100 Mbps(取决于硬件和距离)。

  • 全双工通信:同时发送和接收数据,提升效率。

  • 硬件简单:无需复杂协议栈,易于实现。

2. 缺点
  • 引脚占用多:每个从设备需独立片选线(多设备扩展需更多IO)。

  • 无错误检测:缺乏CRC校验或ACK机制,依赖硬件稳定性。

  • 短距离限制:通常适用于板级通信(<30厘米)。


三、典型应用场景

 1. 存储器通信

  • EEPROM:如AT25系列,存储配置参数(容量16KB~2MB)。

  • Flash存储器:如W25Q128(128Mb SPI Flash),用于固件存储。

  • SD卡(SPI模式):低成本方案读取存储卡数据。

2. 传感器接口
  • 加速度计/陀螺仪:MPU6050通过SPI输出6轴运动数据。

  • 环境传感器:BME280传输温湿度、气压数据(SPI速率3 MHz)。

  • 图像传感器:OV7670摄像头模块配置寄存器。

3. 显示设备
  • OLED/LCD屏:SSD1306 OLED驱动芯片接收显示指令。

  • TFT触摸屏:ILI9341控制器支持SPI接口刷新图像。

 4. 数据转换器

  • ADC/DAC:MCP3008(10位ADC)采集模拟信号,速率200 ksps。

  • 数字电位器:MCP4131调节电阻值,用于音量控制。

5. 无线通信模块
  • Wi-Fi模块:ESP8266通过SPI高速传输网络数据。

  • 蓝牙芯片:nRF51852配置连接参数。

  • RFID读卡器:MFRC522读写NFC标签。

 6. 其他外设

  • 实时时钟(RTC):DS3231高精度时钟芯片配置时间。

  • FPGA配置:通过SPI加载FPGA的比特流文件。


四、SPI与其他接口对比

特性 SPI I²C UART
信号线数 4(SCLK+MISO+MOSI+CS) 2(SCL+SDA) 2(TX+RX)
通信方式 全双工 半双工 全双工
最大速率 100 Mbps 3.4 Mbps(Fast Mode+) 通常≤1 Mbps
多设备支持 多从设备(需多CS线) 多从设备(地址寻址) 点对点
复杂度 低(硬件简单) 中(需协议栈) 低(异步无需时钟)

五、硬件设计要点

 1. 多从设备扩展

  • 独立片选(CS):每个从设备分配独立CS引脚(适合少量设备)。

  • 多路复用器:使用74HC138等译码器扩展CS信号(支持8~16个设备)。

  • 菊花链(Daisy Chain):多个从设备共用CS,数据依次传递(需支持级联的芯片)。

2. 信号完整性
  • 短距离布线:SCLK和MOSI/MISO线长度尽量等长(降低时钟偏移)。

  • 上拉电阻:部分从设备需在MISO线上添加上拉(如10kΩ)。

  • 终端匹配:高速传输(>10 MHz)时,在信号末端并联50Ω电阻。

3. 隔离与保护
  • 电平转换:3.3V主设备与5V从设备间使用TXB0108双向转换器。

  • ESD保护:添加TVS二极管(如PESD5V0)防护静电放电。


六、软件实现示例(以STM32为例)

// SPI初始化(模式0,8位数据,MSB优先)
SPI_HandleTypeDef hspi;
hspi.Instance = SPI1;
hspi.Init.Mode = SPI_MODE_MASTER;
hspi.Init.Direction = SPI_DIRECTION_2LINES;
hspi.Init.DataSize = SPI_DATASIZE_8BIT;
hspi.Init.CLKPolarity = SPI_POLARITY_LOW;   // CPOL=0
hspi.Init.CLKPhase = SPI_PHASE_1EDGE;       // CPHA=0
hspi.Init.NSS = SPI_NSS_SOFT;               // 软件控制CS
HAL_SPI_Init(&hspi);

// 发送并接收数据
uint8_t tx_data[2] = {0xAA, 0x55};
uint8_t rx_data[2];
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // 拉低CS
HAL_SPI_TransmitReceive(&hspi, tx_data, rx_data, 2, 100);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);   // 释放CS

总结

SPI以其高速、全双工、硬件简单的特性,成为嵌入式系统中外设互联的核心接口。
设计关键

  1. 正确配置时钟模式(CPOL/CPHA)以匹配从设备。

  2. 优化多从设备扩展方案(独立CS或菊花链)。

  3. 确保信号完整性(短距离、等长布线)。
    在需要高速数据交换的场景(如存储器、传感器、显示屏驱动)中,SPI是比I²C和UART更优的选择。

你可能感兴趣的:(接口,嵌入式硬件,硬件工程,linux)