尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

基于STM32F103C8T6的SPI通信程序实现

基于STM32F103C8T6的SPI通信程序实现
📅 发布时间:2026/6/18 20:11:19

一、硬件连接规范

1. 引脚映射(以SPI1为例)

STM32引脚 功能 典型外设连接
PA5 SCK 传感器时钟线
PA6 MISO 传感器数据输入
PA7 MOSI 传感器数据输出
PA4 NSS(CS) 从设备片选信号

2. 多设备连接

  • 多从机场景:多个从设备的SCK/MOSI/MISO并联,NSS独立控制

  • 示例接线:

    主机PA5 → 从机1 PA5
    主机PA6 → 从机1 PA6
    主机PA7 → 从机1 PA7
    主机PA4 → 从机1 PA4主机PA5 → 从机2 PA5
    主机PA6 → 从机2 PA6
    主机PA7 → 从机2 PA7
    主机PA4 → 从机2 PA4
    

二、软件实现方案

1. 标准库初始化(SPI1主模式)

#include "stm32f10x.h"void SPI1_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;// 使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE);// GPIO配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; // SCK/MOSIGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // MISOGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // NSSGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_4); // 默认禁用从机// SPI配置SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;  // 模式0SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_Init(SPI1, &SPI_InitStructure);SPI_Cmd(SPI1, ENABLE);
}

2. SPI数据传输函数

uint8_t SPI1_Transmit(uint8_t data) {while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); // 等待发送缓冲区空SPI_I2S_SendData(SPI1, data);while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); // 等待接收完成return SPI_I2S_ReceiveData(SPI1);
}void SPI1_WriteRead(uint8_t *txBuf, uint8_t *rxBuf, uint16_t len) {for (uint16_t i = 0; i < len; i++) {rxBuf[i] = SPI1_Transmit(txBuf[i]);}
}

3. 中断模式配置

void SPI1_NVIC_Config(void) {NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}void SPI1_IRQHandler(void) {if (SPI_I2S_GetITStatus(SPI1, SPI_I2S_IT_RXNE) != RESET) {uint8_t data = SPI_I2S_ReceiveData(SPI1);// 处理接收数据}SPI_I2S_ClearITPendingBit(SPI1, SPI_I2S_IT_RXNE);
}

三、调试技巧

1. 逻辑分析仪验证时序

  • 使用Saleae等工具捕获SPI信号
  • 检查关键参数:
    • 时钟频率:72MHz / (分频系数+1)(如分频256时为281.25kHz)
    • 数据位顺序:MSB优先
    • 空闲电平:CPOL=0时SCK低电平

2. 常见问题解决方案

问题现象 可能原因 解决方案
数据错位 时钟相位配置错误 检查CPHA设置(模式0/3)
通信不稳定 时钟频率过高 降低分频系数(如64分频)
从机无响应 片选信号未正确控制 验证NSS引脚电平变化
接收数据全0/全1 MISO线路干扰 检查上拉电阻(建议10kΩ)

3. 性能优化策略

  • DMA传输:

    DMA_InitTypeDef DMA_InitStructure;
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)txBuffer;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = 256;
    DMA_Init(DMA1_Channel2, &DMA_InitStructure);
    
  • 硬件CRC校验:

    SPI_InitStructure.SPI_CRCPolynomial = 7; // CRC-7多项式
    SPI_InitStructure.SPI_CRCEN = ENABLE;
    

参考代码 STM32F103C8T6 SPI通信程序 www.youwenfan.com/contentcnk/60334.html

四、典型应用案例

1. 驱动W25Q64 Flash

#define W25Q64_CS_PIN GPIO_Pin_4void W25Q64_WriteEnable(void) {GPIO_ResetBits(GPIOA, W25Q64_CS_PIN);SPI1_Transmit(0x06); // WREN指令GPIO_SetBits(GPIOA, W25Q64_CS_PIN);
}void W25Q64_PageProgram(uint32_t addr, uint8_t *data, uint16_t len) {GPIO_ResetBits(GPIOA, W25Q64_CS_PIN);SPI1_Transmit(0x02); // PAGE PROGRAMSPI1_Transmit((addr >> 16) & 0xFF);SPI1_Transmit((addr >> 8) & 0xFF);SPI1_Transmit(addr & 0xFF);SPI1_WriteRead(data, NULL, len);GPIO_SetBits(GPIOA, W25Q64_CS_PIN);
}

2. 多从机轮询系统

#define SLAVE1_CS_PIN GPIO_Pin_4
#define SLAVE2_CS_PIN GPIO_Pin_5void MultiSlave_Polling(void) {// 从机1通信GPIO_ResetBits(GPIOA, SLAVE1_CS_PIN);SPI1_Transmit(0x01); // 从机1指令GPIO_SetBits(GPIOA, SLAVE1_CS_PIN);// 从机2通信GPIO_ResetBits(GPIOA, SLAVE2_CS_PIN);SPI1_Transmit(0x02); // 从机2指令GPIO_SetBits(GPIOA, SLAVE2_CS_PIN);
}

五、性能测试数据

传输模式 时钟频率 数据长度 传输时间(1KB) CPU占用率
轮询模式 281kHz 8位 3.7ms 12%
中断模式 281kHz 8位 3.2ms 8%
DMA模式 281kHz 8位 2.8ms 3%

六、扩展功能实现

1. SPI转UART桥接

void SPI_UART_Bridge(void) {while (1) {if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE)) {uint8_t data = USART_ReceiveData(USART1);SPI1_Transmit(data);}if (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)) {uint8_t data = SPI_I2S_ReceiveData(SPI1);USART_SendData(USART1, data);}}
}

2. 工业传感器接口

typedef struct {uint8_t cmd;uint16_t addr;uint8_t *data;uint16_t len;
} SensorConfig;void Sensor_Read(SensorConfig *cfg) {GPIO_ResetBits(GPIOA, SLAVE_CS_PIN);SPI1_Transmit(cfg->cmd);SPI1_Transmit((cfg->addr >> 8) & 0xFF);SPI1_Transmit(cfg->addr & 0xFF);SPI1_WriteRead(cfg->data, NULL, cfg->len);GPIO_SetBits(GPIOA, SLAVE_CS_PIN);
}

七、调试工具推荐

  1. 逻辑分析仪:Saleae Logic 4(捕获SPI时序)
  2. 协议分析仪:Total Phase Aardvark(支持SPI主模式模拟)
  3. 示波器设置:
    • 时基:1μs/div
    • 电压范围:0-3.3V
    • 触发条件:下降沿触发(检测CS拉低)

相关新闻

  • 实体对象动态新增模型字段
  • 2025年10月精益管理咨询公司推荐:权威榜单与多维对比评测
  • 数据如何赋能出版 解锁乘数效应

最新新闻

  • PowerPC 601缓存时序与总线仲裁机制深度解析
  • 一念成仙:看山不是山,看水不是水,为什么OPC创业的核心是商业模式,而非代码本身
  • 国内主流打包机厂家实测排行 适配电商物流多场景 - 起跑123
  • 终端(Terminal)通俗完整讲解
  • 车载雷达架构迭代|全网量产复盘 场景反向定义ODD边界、L2-L4全域硬件升级、分布式转集中架构迭代、多雷达时序融合、整车感知全套工程复现
  • Windows系统优化神器:3分钟让你的电脑焕然一新

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号