完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
你好,我正试图使用CYUSB3KIT-003 实现简单的 GPIF 到 USB 的直接数据传输。 我从 GpifToUSB 示例开始,该示例可在C:Program Files (x86)CypressEZ-USB FX3 SDK1.3firmwarebasic_examplescyfxgpiftousb 中找到,AN86947《使用 EZ-USB® FX3 优化 USB 3.0 吞吐量》中提到了该示例。™
问题是,当 DMA 缓冲区切换时,我会丢失数据。 我了解到,解决这个问题的办法是实现两个或多个线程,并在这些线程之间切换。 修改后的 GpifToUSB 示例可在https://community.infineon.com/t5/USB-superspeed-peripherals/EZ-USB-FX3-Explorer-kit-as-16-channel-l...中找到。 我使用了那里的源代码,并稍作修改以使用外部时钟。 遗憾的是,这并没有解决我的问题,我仍然每隔 ~16 KB(这是配置的 DMA 缓冲区大小)丢失一次数据。 我附上了我的源代码。 主要是上面论坛帖子中的例子,改成了外部时钟。 另外,我不太清楚状态机中计数器的大小是出于什么考虑。 为什么是 DMA 缓冲区大小的 1/4,而不是 1/2? 如有任何帮助,我们将不胜感激! 下面是 UART 调试日志,从我闪存 .img 开始记录 输入 RAM。 之后,我很快就使用CYUSB3KITSuperSpeed Design Examples V1 . 2.1PC Utilities的CollectData.exe启动和停止了数据传输。 debug initializedProd:0 , Cons:0USB event: 11 0About to connect to USB hostUSB event: 0 1CY_U3P_USB_EVENT_CONNECT detectedCyFxApplnInit completeUSB event: 8 0USB event: 5 1Using GPIF:cyfxgpif2configProd:6 , Cons:0Prod:2 , Cons:0Vendor Command Received: 0xA0 Vendor Command Received: 0xA0 Vendor Command Received: 0xA0 Vendor Command Received: 0xB5 Prod:2 , Cons:0Prod:2 , Cons:0Prod:2 , Cons:0Prod:2 , Cons:0Prod:2 , Cons:0Prod:1 , Cons:0Prod:2 , Cons:0Prod:2 , Cons:0Prod:1 , Cons:0Prod:1 , Cons:0Prod:2 , Cons:0Prod:1 , Cons:0Prod:2 , Cons:0Prod:2 , Cons:0Prod:1 , Cons:0Prod:1 , Cons:0...[shortened]...Prod:2 , Cons:0Prod:2 , Cons:0Prod:1 , Cons:0Prod:1 , Cons:0Prod:2 , Cons:0Prod:2 , Cons:0Prod:2 , Cons:0Prod:2 , Cons:0Prod:2 , Cons:0Prod:2 , Cons:0Prod:1 , Cons:0Vendor Command Received: 0xB5 Prod:1 , Cons:0Prod:2 , Cons:0Prod:2 , Cons:0Prod:1 , Cons:0Prod:1 , Cons:0Prod:2 , Cons:0 这是我的状态机: |
|
相关推荐
1个回答
|
|
1. DMA缓冲区切换机制:在多通道DMA传输中,缓冲区切换是关键。当一个缓冲区的数据传输完成时,硬件需要自动切换到下一个缓冲区。如果切换过程中出现问题,可能会导致数据丢失。 2. 缓冲区大小和数量:缓冲区的大小和数量对数据传输的稳定性有很大影响。如果缓冲区太小,可能会导致频繁的切换,从而增加数据丢失的风险。同时,缓冲区的数量也会影响数据传输的效率。 3. 中断处理:在DMA传输过程中,中断处理是确保数据正确传输的关键。当DMA传输完成时,硬件会触发中断,软件需要在中断服务程序中处理数据传输的切换。如果中断处理不当,可能会导致数据丢失。 4. 线程同步:在多线程环境中,线程之间的同步非常重要。如果线程之间的同步出现问题,可能会导致数据丢失或错误。 为了解决这个问题,你可以尝试以下方法: 1. 优化DMA缓冲区切换机制:确保硬件在切换缓冲区时能够正确处理数据,避免数据丢失。 2. 调整缓冲区大小和数量:根据你的应用需求,适当增加缓冲区的大小和数量,以减少缓冲区切换的频率,降低数据丢失的风险。 3. 优化中断处理:确保中断服务程序能够正确处理DMA传输的切换,避免数据丢失。 4. 实现线程同步:在多线程环境中,确保线程之间的同步机制正确实现,避免数据丢失或错误。 关于你提到的修改后的GpifToUSB示例,我无法访问该链接。但是,你可以参考以下代码片段,实现多线程之间的切换: ```c #include // 定义全局变量,用于存储DMA缓冲区的状态 volatile int dma_buffer_state = 0; // 定义两个线程函数 void *thread1(void *arg) { // 线程1的逻辑 // ... } void *thread2(void *arg) { // 线程2的逻辑 // ... } int main() { pthread_t thread1_id, thread2_id; // 创建线程 pthread_create(&thread1_id, NULL, thread1, NULL); pthread_create(&thread2_id, NULL, thread2, NULL); // 等待线程结束 pthread_join(thread1_id, NULL); pthread_join(thread2_id, NULL); return 0; } ``` 在这个示例中,我们定义了两个线程函数`thread1`和`thread2`,分别表示两个DMA缓冲区的处理逻辑。通过创建和同步这两个线程,可以实现在DMA缓冲区切换时的数据传输。 |
|
|
|
只有小组成员才能发言,加入小组>>
TLE9879_BLDC电机启动需要用手拨一下才能转动,怎么解决?
5590 浏览 2 评论
4083 浏览 9 评论
请问TLE5012B_E1000 启动后为什么位置不能正确获取
3596 浏览 9 评论
1208 浏览 8 评论
3502 浏览 7 评论
419浏览 2评论
251浏览 2评论
358浏览 2评论
TLE9879_BLDC电机启动需要用手拨一下才能转动,怎么解决?
5605浏览 2评论
如果是打开已有的dave工程,怎么查看这个工程选择的mcu型号?
422浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-30 03:42 , Processed in 0.737812 second(s), Total 78, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号