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

SPI通信协议详解与应用实例

SPI协议概述

SPI(Serial Peripheral Interface)是一种高速全双工同步串行通信协议,广泛应用于嵌入式系统中连接微控制器与传感器、存储器等外设。其核心采用主从架构,通过SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)和SS(片选)四线实现数据交换。


SPI模式配置

SPI协议有四种工作模式,由时钟极性(CPOL)和时钟相位(CPHA)组合决定。以下代码展示STM32Cube HAL库中SPI模式配置:

SPI_HandleTypeDef hspi1; void SPI_Init(void) { hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; // 主模式 hspi1.Init.Direction = SPI_DIRECTION_2LINES; // 全双工 hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // 8位数据 hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL=0 hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA=0 hspi1.Init.NSS = SPI_NSS_SOFT; // 软件控制片选 hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; // 时钟分频 HAL_SPI_Init(&hspi1); }

数据收发示例

通过HAL_SPI_TransmitReceive()实现全双工通信。以下示例读取温湿度传感器SHT30的数据:

uint8_t txData[2] = {0x2C, 0x06}; // SHT30测量命令 uint8_t rxData[6] = {0}; // 接收数据缓冲区 void Read_SHT30(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // 拉低片选 HAL_SPI_TransmitReceive(&hspi1, txData, rxData, 2, 100); // 发送命令 HAL_Delay(20); // 等待测量完成 HAL_SPI_Receive(&hspi1, rxData, 6, 100); // 读取6字节数据 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // 释放片选 // 解析温湿度数据 uint16_t tempRaw = (rxData[0] << 8) | rxData[1]; uint16_t humiRaw = (rxData[3] << 8) | rxData[4]; }

软件模拟SPI实现

当硬件SPI资源不足时,可通过GPIO模拟时序。以下为模拟SPI发送函数:

#define SCK_PIN GPIO_PIN_5 #define MOSI_PIN GPIO_PIN_7 #define CS_PIN GPIO_PIN_4 void Soft_SPI_Write(uint8_t data) { for(int i=0; i<8; i++) { HAL_GPIO_WritePin(GPIOA, SCK_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, MOSI_PIN, (data & 0x80) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, SCK_PIN, GPIO_PIN_SET); // 上升沿采样 data <<= 1; HAL_Delay(1); } }

SPI与Flash存储器交互

以下为W25Q128 Flash芯片的页写入操作示例:

#define PAGE_PROGRAM_CMD 0x02 void Flash_WritePage(uint32_t addr, uint8_t *data) { uint8_t cmd[4] = { PAGE_PROGRAM_CMD, (addr >> 16) & 0xFF, (addr >> 8) & 0xFF, addr & 0xFF }; HAL_GPIO_WritePin(GPIOA, CS_PIN, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi1, cmd, 4, 100); // 发送命令和地址 HAL_SPI_Transmit(&hspi1, data, 256, 100); // 写入256字节数据 HAL_GPIO_WritePin(GPIOA, CS_PIN, GPIO_PIN_SET); }

注意事项

  1. 时钟频率需根据外设规格调整,高速设备(如Flash)通常需要>10MHz时钟
  2. 多从机系统中每个SS引脚需独立控制
  3. 全双工通信时注意MOSI和MISO的物理连接方向
  4. 长距离传输建议加入电平转换芯片(如MAX3485)
http://www.jsqmd.com/news/472977/

相关文章:

  • 【JSqlParser】Java使用JSqlParser解析SQL语句总结
  • MongoDB、Redis、HBase 三大NoSQL数据库:核心区别与选型指南
  • 《我与DeepSeek的对话:一位普通人的AI时代思考笔记》
  • HTML5基础笔记
  • 绣花机隔振新解决方案
  • 【JavaEE】Spring Boot 项目创建
  • 电源选型总返工?你可能忽略了这个关键环节
  • 2026年沈阳二手表回收实体店TOP排名出炉,哪家出价高你知道吗?
  • java锁
  • Python 面向对象之继承详细教程
  • 一站式同城信息小程序源码平台:招聘、房产、相亲、拼车全搞定
  • 金智维智能体如何赋能审计行业效率跃升?
  • IXYS艾赛斯 IXFH26N50P TO-247 场效应管
  • 交换机配置命令详解到一键生成脚本 —— 华为/思科/H3C/锐捷全品牌覆盖
  • 神器推荐!SQL 一键转 ER 图,免费在线、自动识别外键、高清导出
  • 别被“小龙虾”迷了眼!实测 OpenClaw 与实在Agent:谁才是企业降本增效的真大腿?
  • leetcode hot100——三数之和
  • AI 内容导出乱、格式崩、公式变?我开发了这只鸭子帮我全解决了
  • 位姿估计之PnP:3D-2D
  • 根据文章举报数量确定推荐
  • 苄基鸟嘌呤-降冰片烯,BG-Nor,成为模块化生物探针的理想载体
  • 新Java基础(二十):多态
  • esp网络时钟
  • 成功接入美股行情api与港股行情api同步获取
  • OpenClaw 如何运行 Claw 资源文件
  • OpenClaw狂飙:我们该担心的不只是“被取代”,而是如何与AI“共处”
  • 从 App 到 Agent:鸿蒙应用形态正在改变
  • 碎片学习|外贸tob sales有效动作takeaways
  • 电商品牌数字化获客工具排行榜适配精准需求
  • 2026合肥验光配镜机构推荐|学生党/宝妈闭眼冲,避坑不花冤枉钱 - 品牌测评鉴赏家