OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 312|回复: 6

QSPI模拟输出xy2-100协议问题求出

[复制链接]

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2025-10-8
在线时间
7 小时
发表于 2025-10-16 17:46:01 | 显示全部楼层 |阅读模式
7金钱
本帖最后由 mpoint 于 2025-10-16 18:30 编辑

    各路大神有礼了. 小弟最近在研究使用QSPI总线模拟输出扫描振镜的xy-100协议信号,因为对stm32 研究处在入门阶段,硬件懂点皮毛,QSPI是上周开始学习的, 参考了网络上一些资料,接近成功,但还有一些问题,特发出来请教大神.

背景资料如下:
1   振镜的xy2-100协议说明

    企业微信截图_176049932393.png 企业微信截图_17604993537987.png

2   mcu 及 qspi配置说明,muc型号是stm32l431rct6
   企业微信截图_17605001503275.png
3  单周期(10us)数据输出截图是正确的.
    7d4a02e3-4ad1-4b2c-ae20-5bb1d26e9c06.png

4  多周期传输数据,在QSPI总线上存在一个 6.7us的传输中断,如截图:
   4f255ae7-f6a4-46f9-9486-a7db8f7631f9.png

   小弟的问题是,如何消除这6.7us的数据间断. 测试过dma的环形模式,这个间断会缩短到1.25us. 目前是使用dma + pingpong双缓冲方式,后续将更新Pingpong缓冲区中的数据,实现任意图形的扫描.

工程代码: spi - 副本.zip (6.89 MB, 下载次数: 1)

fbd0f78d-a88b-4509-a5fd-c06ab7843c87.png
回复

使用道具 举报

13

主题

3459

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8917
金钱
8917
注册时间
2020-5-11
在线时间
4469 小时
发表于 2025-10-17 10:33:40 | 显示全部楼层
本帖最后由 LcwSwust 于 2025-10-17 10:38 编辑

粗略看了下代码,是在HAL_QSPI_TxCpltCallback()里切换缓冲,然后调用HAL_QSPI_Transmit_DMA();
我对于HAL库不了解,QSPI也不了解,简单说下方法:
1.HAL_QSPI_TxCpltCallback()里让某个IO取反,用示波器观察是不是这个中断造成的6.7us中断。
2.QSPI本身似乎可以自动传输批量数据,不知DMA对它有何影响,建议试一下修改二者的传输数量试试。
3.DMA的“环形模式”是指“循环模式”吗?如果是,那可能得研究一下是不是触发DMA的条件有问题,或QSPI的某些设置有问题。
4.参考USART,它有两个标志:TXE(发送寄存器空)、TC(发送完成),如果采用TC标志来触发下一次发送,则会有中断,而用TXE标志来触发则可以达到连续发送;建议先不用DMA,直接在主循环while(1)里采用查询标志的方式看能不能做到让QSPI连续发送数据不中断。
专治疑难杂症
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2025-10-8
在线时间
7 小时
 楼主| 发表于 2025-10-17 12:43:13 | 显示全部楼层
本帖最后由 mpoint 于 2025-10-18 14:17 编辑
LcwSwust 发表于 2025-10-17 10:33
粗略看了下代码,是在HAL_QSPI_TxCpltCallback()里切换缓冲,然后调用HAL_QSPI_Transmit_DMA();
我对于HA ...

感谢前辈的回复及提供的思路!!  

其他我做过的实验我详细说明一下:
1  不使用DMA传输方式,优化开到-o3,在主循环while(1)中,使用非DMA的 HAL_QSPI_Transmit(&hqspi, Tx_Buffer_Ping, 1) 传输数据, qspi总线中断间隔的时间是5us左右,使用寄存器方式操作, 时间在1.5us左右.  此时cpu负载应该是最大.

2  使用DMA的循环模式,关闭DMA及QSPI的所有中断使能, 在主循环while(1)前调用一次HAL_QSPI_Transmit_DMA(&hqspi,Tx_Buffer_Ping); 后续DMA自动循环进行数据搬送到
qspi. qspi总线中断间隔的时间是1.5us左右. 此时cpu负载应该最小,但是没办法更新传送缓冲区中的数据.

3  使用DMA的普通模式,打开DMA及QSPI中断(半传输完成,全传输完成),在主循环while(1)前调用一次HAL_QSPI_Transmit_DMA(&hqspi,Tx_Buffer_Ping); 后续在qspi传输完成中断中继续进行HAL_QSPI_Transmit_DMA() 调用,使用了双缓冲方式. qspi总线中断间隔的时间是6.7us左右,是间隔时间最大的,可以看出中断响应对qspi总线中断影响较大.  


4  代码中,我设置了ping,pong两个缓冲区,缓冲区的数据量用 FRAME_BUF_LEN 调节,  发现缓冲区数据没有发完,qspi总线是不会停止的,故qspi总线间断是发生在数据传输完成后. 原来认为2中DMA循环方式数据指针掉头操作应该很快,但此方案还是让 qspi总线中断了1.5us,对xy2-100协议来说可能有影响(影响还在搭建环境进行测试).


现在主要要解决的问题就是想尽一切办法,让传输给qspi总线的数据不中断,也就让qspi持续产生xy2-100协议数据.
结合前辈的回复及思路,感觉是传输给qspi的数据产生断流了,但这个断流是如何产生的?  
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165597
金钱
165597
注册时间
2010-12-1
在线时间
2120 小时
发表于 2025-10-17 22:04:14 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子产品购买店铺https://zhengdianyuanzi.tmall.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2024-9-6
在线时间
8 小时
发表于 2025-10-18 09:15:49 | 显示全部楼层
学习了
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2025-10-8
在线时间
7 小时
 楼主| 发表于 2025-10-18 14:20:08 | 显示全部楼层
本帖最后由 mpoint 于 2025-10-18 14:38 编辑
正点原子 发表于 2025-10-17 22:04
你这是在做激光雕刻机?

是的,版主大侠, 这个方案如果成功(数据能连续发送,中间不产生间断),用在激光打标,焊接,雕刻 上都可以.  传统方案是使用FPGA,但FPGA方案无论是硬件设计,软件等都复杂了不少,想实现一个更简单的方案.
回复

使用道具 举报

13

主题

3459

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8917
金钱
8917
注册时间
2020-5-11
在线时间
4469 小时
发表于 2025-10-19 09:15:28 | 显示全部楼层
mpoint 发表于 2025-10-17 12:43
感谢前辈的回复及提供的思路!!  

其他我做过的实验我详细说明一下:

如果解决不了,可以换个方案,比如用GPIO模拟,用PWM触发DMA向GPIO输出数据。
参考:https://blog.csdn.net/kkkkkkjkl/article/details/126253612
专治疑难杂症
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-10-31 01:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表