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

基于STM32F103C8T6的SPI通信程序实现

一、硬件连接规范

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拉低)
http://www.jsqmd.com/news/24467/

相关文章:

  • 2025年10月降本增效咨询公司推荐:实力榜与数据对比
  • 实体对象动态新增模型字段
  • 一起为可信数据流通添砖加瓦,隐语社区 OSCP 专项开源活动正式启动!
  • makefile编写与使用
  • 物联网20年简史
  • 2025年10月精益管理咨询公司推荐:权威榜单与多维对比评测
  • 2025年10月降本增效咨询公司推荐:实力榜对比五家优劣势
  • 数据如何赋能出版 解锁乘数效应
  • CF2093G Shorten the Array
  • 1116. 打印零与奇偶数
  • 2025年10月降本增效咨询公司推荐榜:五强数据横评
  • 2025 年水处理聚丙烯酰胺,聚丙烯酰胺水处理剂,工业废水处理聚丙烯酰胺厂家最新推荐,产能、专利、环保三维数据透视!
  • 2025 年阴离子聚丙烯酰胺,阳离子聚丙烯酰胺,非离子聚丙烯酰胺厂家最新推荐,产能、专利、环保三维数据透视
  • 2025 年聚丙烯酰胺絮凝剂,PAM 聚丙烯酰胺,聚丙烯酰胺聚合氯化铝厂家最新推荐,产能、专利、环保三维数据透视
  • 吱吱企业即时通讯:赋能企业高效沟通与协作新生态
  • 企业性能测试内训首选方案|让团队快速掌握全链路性能分析与优化
  • 2025 年装配式建筑,装配式集成房屋,装配式轻钢房屋,装配式公厕厂家最新推荐,产能、专利、环保三维数据透视
  • MATLAB实现光学综合孔径望远系统仿真
  • 2025 年装配式营地,装配式营地建设,装配式民宿,装配式出口厂家最新推荐,产能、专利、环保三维数据透视
  • Windows Server 2022 OVF (2025 年 10 月更新) - VMware 虚拟机模板
  • Linux运行时常用命令
  • 2025年盘式干燥机厂家权威推荐榜单:回转滚筒干燥机/真空干燥机/沸腾干燥机源头厂家精选
  • Windows Server 2025 OVF (2025 年 10 月更新) - VMware 虚拟机模板
  • 同步盘哪个好用?坚果云、百度网盘等五大工具横向对比
  • Windows Server 2008 R2 OVF (2025 年 10 月更新) - VMware 虚拟机模板
  • Windows Server 2019 OVF (2025 年 10 月更新) - VMware 虚拟机模板
  • 2025年装饰防火板厂家权威推荐榜单:环保防火板/耐刮防火板/隧道专用防火板源头厂家精选
  • Windows Server 2016 OVF (2025 年 10 月更新) - VMware 虚拟机模板
  • 基于Matlab/Simulink的CS-DCSK混沌键控系统仿真
  • tfman.dll tfdtctt8.dll textviewer.dll texturiz.dll texture9.dll texture7.dll TextTwist.exe - 详解