完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
主机环境:Windows 7 SP1 开发环境:MDK5.18 目标板:STM32F103C8T6 开发库:STM32F1Cube库和STM32_USB_Device_Library 继续昨天的学习笔记,之前提到从USBTrace软件中抓取的数据跟图像原始数据做对比是没有丢失数据的,只是在传输过程中有一半的数据包出现了错误,由此导致我们在PC上一直无法获取到正常的图像,从而一直显示黑屏,这个原因也找了好久,而且心浮气躁,调试一会儿就去干别的事了,对于调试来说分析出问题点才能更好的去解决问题,大家可以思考一下为什么是有一半的数据包出错,而不是个别数据包错误,也不是三分之一,四分之一出错等,联想到STM32中同步传输是使能了双缓冲特性,只有这一特性是跟我们的错误点二分之一相关的,因此,很有可能是双缓冲这里出现了问题,现在问题就来了,关于STM32 的同步传输的双缓冲传输特性,在上层应用中是没有跟其相关的,我们的传输函数只使用了USBD_LL_Transmit()函数,因此就从该函数查起,最后进入了stm32f1xx_ll_u***.c文件中的USB_EPStartXfer()函数,在这个函数中我们把数据写入PMA中,如下: |
|
相关推荐
|
|
如果DTOG_TX置位则访问DBUF1,否则访问DBUF0,关于STM32中USB的双缓冲机制大家可以去阅读STM32F103C8T6参考手册的USB章节,里面会有详细讲解,我们知道STM32的USB提供了8个双向端点,而如果一个端点使能了某一方向的双缓冲机制,则TX和RX这两块区域就都由同一方向管理,可以看下分组缓冲区的的示例,如下: |
|
|
|
|
|
重点可以看下双缓冲模式下IN端点3的缓冲区,此时,RX区域由TX_1接管了,在代码中由用于指定了TX_0和TX_1的地址,并通过PCD_SET_EP_DBUFx_CNT()指定这段缓冲中待发送数据的长度,而追溯PCD_SET_EP_DBUFx_CNT()的定义,就发现了问题,如下: [cpp] view plain copy
|
|
|
|
|
|
可以看到这两个IN端点的缓冲长度设置居然是使用的同一个接口--*PCD_EP_TX_CNT((USBx), (bEpNum)) = (uint32_t)(wCount);所以这就是问题的所在,该接口定义如下:
[cpp] view plain copy
|
|
|
|
|
|
在前面那个分组缓冲的示例中我们就知道了,TX_1是接管的RX区域,因此,DBUF1_CNT应该是使用的PCD_EP_RX_CNT()接口而不是PCD_EP_TX_CNT()接口,因此ST的库代码也不一定是完好的,至少这个问题点还没有修复,修改库代码,如下:
[cpp] view plain copy
|
|
|
|
|
|
然后重新编译代码烧录进单板中,运行后就终于得到我们想要的图像了,结果如下:
下面是工程代码下载地址:http://download.csdn.net/detail/key123zhangxing/9551843 |
|
|
|
|
|
第一次看到这个功能,谢谢楼主。
|
|
|
|
|
|
690 浏览 0 评论
735 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
624 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1099 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1092 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11794 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 09:25 , Processed in 0.670841 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号