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

GD32F103单片机主从SPI通信异常问题处理

项目场景:

主板上有主从单片机,主单片机为STM32F103,从单片机为GD32F103RET6,它们之间通过SPI进行通信,相互发送数据。

问题描述

调试过程中发现,当重新通过仿真器对主单片机进行下载程序并仿真时,主从单片机之间的SPI通信就会发生异常,无法正常通信。但是对整个主板重新上电,主从单片机通信一直是正常的。

原因分析:

怀疑是在主板运行过程中,若单片机自身发生复位,会导致主从单片机之间SPI的通信出现异常,可能性最大的是CLK时钟错位。进一步对从单片机的程序进行仿真发现,SPI的SPI_STAT_TRANS标志位一直处于置位状态,也就是说处于忙状态,导致从单片机无法正常收发数据。


解决方案:

  1. SPI初始化时对SCK引脚增加外部中断检测配置,如下所示:
staticvoidSPI1_GPIO_Configuration(void){rcu_periph_clock_enable(RCU_GPIOB);rcu_periph_clock_enable(RCU_SPI1);rcu_periph_clock_enable(RCU_AF);/* SPI2_SCK(PB13), SPI1_MISO(PB14) and SPI1_MOSI(PB15) GPIO pin configuration */gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_10MHZ,GPIO_PIN_13);gpio_init(GPIOB,GPIO_MODE_IPU,GPIO_OSPEED_10MHZ,GPIO_PIN_15);gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_10MHZ,GPIO_PIN_14);spi_nss_internal_low(SPI_PORT);/* enable and set key EXTI interrupt priority */nvic_irq_enable(EXTI10_15_IRQn,3,0);/* connect key EXTI line to key GPIO pin */gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB,GPIO_PIN_SOURCE_13);/* configure key EXTI line */exti_init(EXTI_13,EXTI_INTERRUPT,EXTI_TRIG_RISING);exti_interrupt_flag_clear(EXTI_13);}
  1. 外部中断处理程序代码如下:
voidEXTI10_15_IRQHandler(void){if(RESET!=exti_interrupt_flag_get(EXTI_13)){exti_interrupt_flag_clear(EXTI_13);if(spi_i2s_flag_get(SPI_PORT,SPI_FLAG_TRANS)==RESET)SPI1_Busy_1ms=0;SPI1_Clk_1ms=0;}}
  1. 添加监视SPI的busy状态的处理程序,若SPI_FLAG_TRANS置位(SPI1_Busy_1ms > 100),但却没有检测到SCK(即SPI1_Clk_1ms>100),则对SPI进行重新配置。如下所示:
voidSPI1_Monitor(void){if(System1msGetReady()){if(SPI1_Busy_1ms!=0xffff)SPI1_Busy_1ms++;if(SPI1_Clk_1ms!=0xffff)SPI1_Clk_1ms++;}if(spi_i2s_flag_get(SPI_PORT,SPI_FLAG_TRANS)==RESET){SPI1_Busy_1ms=0;SPI1_Clk_1ms=0;}if(SPI1_Busy_1ms>100&&SPI1_Clk_1ms>100){SPI1_Busy_1ms=0;SPI1_Configuration();}}
  1. 优化 SPI 中断处理程序,并增加错误处理逻辑
voidSPI1_IRQHandler(void){/* 接收缓冲区非空中断 */if(spi_i2s_interrupt_flag_get(SPI_PORT,SPI_I2S_INT_FLAG_RBNE)==SET){struct_Uart_BUF*P_Uart;P_Uart=UartAll_Get(UART_NO_SPI1);P_Uart->RecBuf[P_Uart->RecBufWritePoint]=spi_i2s_data_receive(SPI_PORT);P_Uart->RecBufWritePoint=(P_Uart->RecBufWritePoint+1)%UART_BUFFER_SIZE;}/* 发送缓冲区空中断 */if(spi_i2s_interrupt_flag_get(SPI_PORT,SPI_I2S_INT_FLAG_TBE)==SET){if(SPI1_Int_SendR!=SPI1_Int_SendW){spi_i2s_data_transmit(SPI_PORT,SPI1_Int_SendBuffer[SPI1_Int_SendR]);SPI1_Int_SendR=(SPI1_Int_SendR+1)%SPI_SEND_BUFFER_SIZE;}else{IRQ_REQUEST_HIGH();spi_i2s_interrupt_disable(SPI_PORT,SPI_I2S_INT_TBE);}}/* 接收CRC错误 */if(spi_i2s_interrupt_flag_get(SPI_PORT,SPI_INT_FLAG_CRCERR)==SET){spi_crc_error_clear(SPI_PORT);}/* 接收过载错误 */if(spi_i2s_interrupt_flag_get(SPI_PORT,SPI_I2S_INT_FLAG_RXORERR)==SET){/* 先读SPI_DATA寄存器 */spi_i2s_data_receive(SPI_PORT);SPI_STAT(SPI_PORT);}}

经过上述配置,问题可以得到解决。

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

相关文章:

  • AI工作台WorkBuddy:自媒体人内容创作与运营的本地化智能助手
  • Muse Spark 1.2:从代码补全到AI编程协作者的实战指南
  • 网易版《我的世界》自定义皮肤上传全攻略:从图片规范到穿戴生效
  • 2026年8月佛山网站建设/江门中小企业网站建设定制厂家口碑推荐_江门市华企立方科技有限公司 - 行业平台推荐
  • ZeroClaw vs OpenClaw:揭秘LLM部署内存优化99%背后的技术原理与选型
  • 甲级测绘航空摄影资质的办理指南
  • NVIDIA显卡驱动崩溃全解析:从TDR机制到硬件排查的完整解决方案
  • 温州市建设局网站:了解温州城市发展的关键窗口,获取建筑政策与资质服务指南
  • 从AI Agent自进化到自驯化:基于Harness与SEAGym的工程实践
  • python lisp语言Autocad二次开发经验分享----Autolisp
  • 同传新手真正高效的突破方式,是分层训练、逐级加压。基础不稳就回归梯度影子跟读,打磨听说联动节奏;逻辑混乱就专项练习意群拆分、顺句驱动;输出卡顿就集中打磨衔接句式、优化语流。针对性补齐短板,而非泛泛练习
  • 计算机技术与科学毕设容易的题目分享
  • PyInstaller打包DLL加载失败:从blspy案例到通用解决方案
  • 从混淆矩阵到ROC曲线:量化机器学习分类中的误报与漏报权衡
  • Python批量图片处理实战:本地化压缩、水印、格式转换与重命名
  • MolmoWeb:基于视觉模型的网页自动化本地部署与实战指南
  • 深度解析:兴安盟建设局网站作为公众获取权威资讯与政务服务的核心平台价值探讨
  • Codex平台集成GPT-5.5与视觉模型,重塑AI编程工作流
  • APMCM数学建模竞赛全流程实战指南:从审题到论文写作
  • 2026年8月潍坊全屋定制/潍坊大平层全屋定制优质厂家推荐_潍坊中百益家园装饰 - 品牌宣传支持者
  • Android系统属性添加实战:从原理到SELinux权限配置全解析
  • Windows开机密码遗忘?5种主流解锁方案全解析
  • AI时代程序员价值重构:从代码生产者到系统设计者
  • 基于WorkBuddy与edge-tts打造本地化TTS自动化配音流水线
  • CUDA生态核心组件解析:cuBLAS、cuDNN、NCCL、Triton与CUTLASS实战指南
  • 网站建设服务器篇:如何选择稳定高效服务器助力企业数字化转型与在线发展
  • 数学建模竞赛通知解读:从规则理解到团队协作的实战指南
  • 数学建模竞赛:从理论到实践的工程化思维与数据驱动方法
  • 利用Python实现酒店评论的情感分析
  • CentOS/Rocky Linux更换国内yum源:清华与阿里云镜像配置全指南