打印

GD32F103C8T6的SPI波形异常问题

[复制链接]
2251|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
萌德不萌|  楼主 | 2025-7-23 14:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 萌德不萌 于 2025-7-23 15:00 编辑

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


为什么会这样呢

新建 DOC 文档.pdf

416.31 KB

使用特权

评论回复
评论
dffzh 2025-7-25 14:22 回复TA
@萌德不萌 :代码上也确实没有明显问题,软件控制CS应该是代码控制的,你将frame_size改为SPI_FRAMESIZE_8BIT试试,或者想尽快解决,只能发我V信,我帮你线下指导一下排查。 
萌德不萌 2025-7-24 16:51 回复TA
@dffzh :平台有文件大小限制,发不了工程压缩包。我把程序复制到PDF发在下面评论区了,老哥请看 
萌德不萌 2025-7-24 16:37 回复TA
@cooldog123pp :波形在附件里 
cooldog123pp 2025-7-24 14:35 回复TA
看看啥波形 
xch 2025-7-24 14:35 回复TA
spi_i2s_data_transmit(SPI1,data)之前禁止全局中断看看。 
dffzh 2025-7-24 11:03 回复TA
@萌德不萌 :看了,排查问题时,尽量不要加入太多未知代码,比如不要加入定时器什么的,越简单越好,把不加定时器的代码工程发一份。 
萌德不萌 2025-7-24 10:52 回复TA
@dffzh :老哥你看我给你的回复 
dffzh 2025-7-24 08:56 回复TA
找到原因没? 
沙发
probedog| | 2025-7-23 15:56 | 只看该作者
CS控制逻辑与SPI传输状态不同步,可能是代码中CS拉高位置错误,或硬件自动控制配置不当。

使用特权

评论回复
板凳
probedog| | 2025-7-23 15:56 | 只看该作者
CS在数据发送完成后再拉高。

使用特权

评论回复
地板
probedog| | 2025-7-23 15:56 | 只看该作者
避免冗余的 TXE 等待,优先使用 spi_i2s_data_transmit() 的阻塞特性。

使用特权

评论回复
5
flycamelaaa| | 2025-7-23 16:57 | 只看该作者
检查SPI模式配置。

使用特权

评论回复
6
dffzh| | 2025-7-23 17:09 | 只看该作者
本帖最后由 dffzh 于 2025-7-23 17:31 编辑

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

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

可能是其评估板上的硬件一直拉低CS了。

使用特权

评论回复
7
xch| | 2025-7-23 18:37 | 只看该作者
在拉高CS 之前,给SPI 状态寄存器拍个快照。拉高后设个断点,回头看快照。
看波形像是判断发送 FIFO空了就拉高了CS,实际上位移寄存器还在工作。

使用特权

评论回复
8
powerantone| | 2025-7-23 18:58 | 只看该作者
spi_i2s_data_transmit() 函数本身会阻塞,直到发送缓冲区可用(即 TXE=1),因此显式等待 TXE 通常是多余的。

使用特权

评论回复
9
stormwind123| | 2025-7-23 19:59 | 只看该作者
需要正确控制CS信号的时序。

使用特权

评论回复
10
萌德不萌|  楼主 | 2025-7-24 10:50 | 只看该作者
dffzh 发表于 2025-7-23 17:09
你把CS的控制代码屏蔽后测试看下是什么效果,有问题回复我,再帮你看下:

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

老哥,屏蔽掉后就是CS一直维持拉高状态了。
还有一个问题,就是原本屏蔽掉“等待发送缓冲区清空”的while循环后,不是SPI发送和CS时序就正常了么,但是我现在只要把SPI1_SendData函数再放入定时器Timer2的中断里定时发送,就又会出现CS提前拉高的情况

2.pdf

180.47 KB

3.pdf

386.32 KB

使用特权

评论回复
评论
dffzh 2025-7-24 10:57 回复TA
我觉得根本原因不在于等待发送缓冲区清空”这个while,可能是其他地方的代码存在比较隐秘的问题,方便的话,把V信发我,我帮你看下吧。 
11
cooldog123pp| | 2025-7-24 14:35 | 只看该作者
你这是硬件SPI?你用逻辑分析仪抓一下看下,一般硬件SPI不会有很大问题。

使用特权

评论回复
评论
萌德不萌 2025-7-24 16:53 回复TA
硬件SPI但是软件控制NSS,MOSI和SCLK波形都正常,就是NSS总是在数据还没传输完成时就拉高了。波形在附件中 
12
萌德不萌|  楼主 | 2025-7-24 16:49 | 只看该作者
未加定时器的代码。包含spi.f   spi.c   main.c

4.pdf

82.06 KB

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝