问答

汇集网友智慧,解决技术难题

21ic问答首页 - GD32F103C8T6的SPI波形异常问题

gd32F103 spi 单片机 嵌入式 技术交流

GD32F103C8T6的SPI波形异常问题 赏100家园币

萌德不萌2025-07-23
本帖最后由 萌德不萌 于 2025-7-23 15:00 编辑

我在使用逻辑分析仪测试SPI波形时,发现只要在调用spi_i2s_data_transmit(SPI1,data)之前增加了“等待SPI发送缓冲为空”的while循环,CS的波形就被提前拉高了
只要我注释掉该while循环,CS波形就恢复正常


为什么会这样呢
回答 +关注 0
356人浏览 9人回答问题 分享 举报
9 个回答
  • dffzh 发表于 2025-7-23 17:09
    你把CS的控制代码屏蔽后测试看下是什么效果,有问题回复我,再帮你看下:

    官网上的这个SPI demo程序,我大 ...

    老哥,屏蔽掉后就是CS一直维持拉高状态了。
    还有一个问题,就是原本屏蔽掉“等待发送缓冲区清空”的while循环后,不是SPI发送和CS时序就正常了么,但是我现在只要把SPI1_SendData函数再放入定时器Timer2的中断里定时发送,就又会出现CS提前拉高的情况
    dffzh 2025-7-24 10:57 回复TA
    我觉得根本原因不在于等待发送缓冲区清空”这个while,可能是其他地方的代码存在比较隐秘的问题,方便的话,把V信发我,我帮你看下吧。 
  • 需要正确控制CS信号的时序。
  • spi_i2s_data_transmit() 函数本身会阻塞,直到发送缓冲区可用(即 TXE=1),因此显式等待 TXE 通常是多余的。
  • 在拉高CS 之前,给SPI 状态寄存器拍个快照。拉高后设个断点,回头看快照。
    看波形像是判断发送 FIFO空了就拉高了CS,实际上位移寄存器还在工作。
  • 本帖最后由 dffzh 于 2025-7-23 17:31 编辑

    你把CS的控制代码屏蔽后测试看下是什么效果,有问题回复我,再帮你看下:

    官网上的这个SPI demo程序,我大致扫了一下代码,CS配置为软件控制,但实际貌似代码上没有操作CS,不知道为什么可以通信成功,有点神奇:

    可能是其评估板上的硬件一直拉低CS了。
  • 检查SPI模式配置。
  • 避免冗余的 TXE 等待,优先使用 spi_i2s_data_transmit() 的阻塞特性。
  • CS在数据发送完成后再拉高。
  • CS控制逻辑与SPI传输状态不同步,可能是代码中CS拉高位置错误,或硬件自动控制配置不当。

您需要登录后才可以回复 登录 | 注册