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

GD32F103 SPI实战:手把手教你配置全双工通信(附主机从机完整代码)

GD32F103 SPI全双工通信实战:从硬件配置到调试技巧

1. 硬件连接与基础概念

SPI通信的硬件连接看似简单,但实际项目中常因接线问题导致通信失败。以GD32F103为例,主机使用SPI0(PA4-PA7),从机使用SPI1(PB12-PB15),正确的物理连接是:

  • 主机MOSI(PA7)→从机MOSI(PB15)
  • 主机MISO(PA6)←从机MISO(PB14)
  • 主机SCK(PA5)→从机SCK(PB13)
  • 主机NSS(PA4)→从机NSS(PB12)

注意:GD32的硬件NSS信号是低电平有效,若使用软件控制NSS,需手动拉低对应GPIO

SPI时钟配置中容易混淆的两个参数:

参数可选值实际影响
CKPL0/1时钟空闲时为低(0)/高(1)电平
CKPH0/1数据在第一个(0)/第二个(1)边沿采样

常见组合方案:

// 模式0:CKPL=0, CKPH=0 (最常用) spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; // 模式3:CKPL=1, CKPH=1 spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;

2. 工程配置详解

2.1 主机初始化关键代码

void SPI_MasterInit(void) { // GPIO时钟使能 rcu_periph_clock_enable(RCU_GPIOA); // 配置SPI引脚:NSS/PA4, SCK/PA5, MOSI/PA7为推挽输出 gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_7); // MISO/PA6配置为浮空输入 gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6); // SPI外设时钟使能 rcu_periph_clock_enable(RCU_SPI0); spi_parameter_struct spi_init_struct = {0}; spi_struct_para_init(&spi_init_struct); // 关键参数配置 spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; spi_init_struct.device_mode = SPI_MASTER; spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; spi_init_struct.nss = SPI_NSS_HARD; // 硬件NSS spi_init_struct.prescale = SPI_PSC_8; // 108MHz/8=13.5MHz spi_init_struct.endian = SPI_ENDIAN_MSB; spi_init(SPI0, &spi_init_struct); spi_nss_output_enable(SPI0); // 使能NSS输出 spi_enable(SPI0); }

2.2 从机配置差异点

从机配置有三处关键不同:

  1. device_mode设为SPI_SLAVE
  2. NSS引脚配置为输入模式
  3. 不需要设置分频系数(时钟由主机提供)
// 从机GPIO配置 gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14); // MISO gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_15); // NSS,SCK,MOSI // 从机模式设置 spi_init_struct.device_mode = SPI_SLAVE;

3. 全双工通信实现

3.1 数据收发流程

主机和从机同时收发数据的典型流程:

  1. 初始化数据缓冲区

    uint8_t master_tx_buf[16] = {0x80,0x81,...,0x8F}; uint8_t slave_tx_buf[16] = {0x40,0x41,...,0x4F};
  2. 启动传输过程

    • 主机自动产生SCK时钟
    • 从机检测到NSS低电平后准备接收时钟
  3. 双工数据交换

    for(uint8_t i=0; i<16; i++){ // 从机发送准备 while(!spi_i2s_flag_get(SPI1, SPI_FLAG_TBE)); spi_i2s_data_transmit(SPI1, slave_tx_buf[i]); // 主机发送数据 while(!spi_i2s_flag_get(SPI0, SPI_FLAG_TBE)); spi_i2s_data_transmit(SPI0, master_tx_buf[i]); // 从机接收 while(!spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE)); slave_rx_buf[i] = spi_i2s_data_receive(SPI1); // 主机接收 while(!spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE)); master_rx_buf[i] = spi_i2s_data_receive(SPI0); }

3.2 调试输出建议

添加串口打印可直观验证通信结果:

printf("Master Received: "); for(int i=0; i<16; i++) printf("%02X ", master_rx_buf[i]); printf("\nSlave Received: "); for(int i=0; i<16; i++) printf("%02X ", slave_rx_buf[i]);

4. 常见问题排查指南

4.1 无数据通信

检查清单:

  • [ ] 确认SPI外设时钟已使能(RCU_SPIx)
  • [ ] 验证GPIO模式配置正确(MOSI、SCK为AF推挽输出)
  • [ ] 检查硬件连接是否接触良好
  • [ ] 测量SCK信号是否正常产生(逻辑分析仪最佳)

4.2 数据错位或丢失

可能原因及解决方案:

现象可能原因解决方法
高位错位端序设置错误检查endian参数
偶发丢数据未检测状态标志增加TBE/RBNE检查
全部为0xFF从机未响应检查从机供电及NSS信号

4.3 性能优化技巧

  1. DMA传输:对于大数据量传输,配置DMA可大幅降低CPU占用

    dma_parameter_struct dma_init_struct; dma_deinit(DMA0, DMA_CH0); dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; dma_init_struct.memory_addr = (uint32_t)tx_buffer; dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; dma_init_struct.number = BUFFER_SIZE; dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0); dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; dma_init_struct.periph_width = DMA_PERIPH_WIDTH_8BIT; dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; dma_init(DMA0, DMA_CH0, &dma_init_struct);
  2. 中断处理:利用SPI中断实现异步通信

    spi_i2s_interrupt_enable(SPI0, SPI_I2S_INT_TBE); nvic_irq_enable(SPI0_IRQn, 0, 0);

实际项目中遇到过一个典型问题:当主机发送速率过快时,从机处理不及时会导致数据覆盖。后来通过增加硬件流控(使用GPIO作为就绪信号)解决了这个问题。这种实战经验在手册中很少提及,却是保证通信可靠的关键。

http://www.jsqmd.com/news/743465/

相关文章:

  • 如何快速完成QQ音乐文件转换:面向新手的完整解码指南
  • CefFlashBrowser终极指南:在Windows上完美重温经典Flash游戏
  • OmniZip音频驱动令牌压缩技术解析与应用
  • 在自动化脚本中使用Taotoken实现多模型备援调用逻辑
  • 用ESP32和Arduino IDE搭建一个能远程控制LED的Web服务器(附完整代码)
  • 北京猎头公司名单推荐:南方新华(含联系电话) - 榜单推荐
  • 湖北武汉猎头公司推荐:南方新华凭什么成为武汉企业最受欢迎的猎头公司之一 - 榜单推荐
  • AI模型协作框架:平衡多样性与输出质量
  • WebPlotDigitizer:科研图表数据提取的必备高效工具
  • 大麦网自动抢票脚本:告别手速拼杀,用Python技术实现90%成功率
  • Claude Code自主学习插件:让AI助手自动掌握新技术
  • DS4Windows终极指南:3步让PlayStation手柄在Windows上获得完美游戏体验
  • SillyTavern终极脚本指南:从零到一的AI对话自动化
  • 基于大语言模型的社交媒体内容生成工具:从提示工程到工程化实践
  • 2026年租赁互动设备好用品牌排名,北京爱乐德福好不好用? - 工业品牌热点
  • AMD Ryzen 9迷你主机性能评测与优化指南
  • 2026年哪里能租到靠谱的暖场机器人 - mypinpai
  • Claude对话重放工具:原理、配置与自动化测试实践
  • 三步搭建Sunshine游戏串流服务器:跨平台游戏自由指南
  • 湿法球磨机推荐哪家? - mypinpai
  • WindowsCleaner开源磁盘清理工具:5分钟解决C盘爆红终极指南
  • 终极百度网盘高速下载指南:如何免费突破下载限制
  • Contentrain AI:Git原生结构化内容治理,重塑前端内容管理范式
  • 2026年4月技术好的发酵膜厂家推荐,牛床垫料发酵覆盖膜/发酵堆肥膜/发酵分子膜/餐厨垃圾无臭膜,发酵膜供应商找哪家 - 品牌推荐师
  • 5分钟快速上手:用Blender VRM插件打造你的虚拟角色
  • 北京爱乐德福互动设备租赁,价格与口碑如何? - mypinpai
  • 2026年3月汽车泡沫机工厂怎么选购,全自动洗车机/电脑洗车设备/高压洗车机,汽车泡沫机生产厂家怎么选择 - 品牌推荐师
  • 三步搭建你的个人游戏串流服务器:Sunshine完全指南
  • 2026年拉伸膜真空包装机靠谱品牌排名,山东小康上榜 - myqiye
  • 分支定界张量网络:突破NP难问题计算瓶颈