1.固件开发

1.1串口打印调试信息

在固件开发时,可以利用串口打印调试信息,获得代码执行情况的指示。固件中,用于打印调试信息的串口配置如下,其中波特率的设置为112500,停止位为1,无校验位。在程序设计过程中,可在适当位置调用CyU3PDebugPrint函数打印信息,固件工程中可查看该函数原型。赛普拉斯官方代码非常规范,很多地方会进行返回值有效性检测并打印相关信息,在数据发送过程中,可以关注串口信息,看是否数据有溢出或丢失,如下图所示。

CyU3PUartConfig_t uartConfig;CyU3PMemSet ((uint8_t *)&uartConfig, 0, sizeof (uartConfig));uartConfig.baudRate = CY_U3P_UART_BAUDRATE_115200;uartConfig.stopBit = CY_U3P_UART_ONE_STOP_BIT;uartConfig.parity = CY_U3P_UART_NO_PARITY;uartConfig.txEnable = CyTrue;uartConfig.rxEnable = CyFalse;uartConfig.flowCtrl = CyFalse;uartConfig.isDma = CyTrue;apiRetStatus = CyU3PUartSetConfig (&uartConfig, NULL);

例如在下发IO配置时调用串口打印函数返回值,示例如下:

CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;apiRetStatus = CyU3PGpioSetSimpleConfig(59, &gpioConfig);if (apiRetStatus != CY_U3P_SUCCESS){/* Error handling */CyU3PDebugPrint (4, "CyU3PGpioSetSimpleConfig failed, error code = %d\n",apiRetStatus);CyFxAppErrorHandler(apiRetStatus);}

1.2控制传输BUG

在控制传输实现既定方案时,在调用CyU3PDmaChannelSetupSendBuffer函数时有一个返回值为43的错误,随后调用CyU3PDmaChannelWaitForCompletion函数有一个46的错误,串口中打印错误信息如下:.

对于返回值的含义不得而知,但是可以就具体的返回值错误与赛普拉斯工程师交流,交流结果如下,结论是使用override mode(我将其理解为手动)DMA通道时,不能调用CyU3PDmaChannelSetXfer()函数的调用,运行正常。

1.3同步传输BUG

在同步传输固件程序的开发过程中,查看串口信息,遇到error code 77,如下。与官方工程师沟通的结论是,同步端点的设置出现故障,在端点属性中的isoPkts的值被设置为大于1时,端点不应为0x81,应为0x83或0x87。修改同步端点为0x83之后,故障修复。沟通过程附下图。

1.4其他注意

在烧写固件程序时应注意,如果是USB Boot的启动方式,应该先烧写固件程序,在烧写FPGA程序,否则会因具体的不同的FPGA程序出现意外结果。如果是将二者的代码都写在掉电不适的存储芯片中,则此处无风险。

在设置水印值的时候,官方文档中明确了有关水印值的计算公式,作为开发者应该注意,不同的水印值,应该对应有一个最小的数据包长度,如果数据包太短,则水印值标志无法正常工作。有两种解决办法,一是填充dummy数据在应用层区分;或者可以把GPIF总线位宽调整为最小位宽8位。当然如果数据收发两端明确了要传输数据的长度,也无需使用水印值,但通常不推荐这样做。

基于AN65974的固件程序,是兼容USB2.0和USB3.0的,不同模式下缓冲区大小设置不同,那么在FPGA端捕捉缓冲区的切换,计算缓冲区的大小,以此判断潜在的USB传输数据线故障(有可能数据线只能在2.0模式)。

USB固件的启动方式是根据PMODE三个管脚的输入状态决定的,应在USB Boot启动方式下,为存储器固化代码。

2.上位机

在上位机开发篇中介绍了不同长度的数据包有不同的发送方式,control center作为官方自带的上位机,他的发送如何进行呢?为了解释数据传输过程中出现的现象,一探究竟。(固件中缓冲区的大小为16KB)在进行读测试的过程中发现,每当上位机发送1024B数据时,FPGA检测FLAG不动作,但当我连续16次下发1024B数据时,FLAG正常工作。于是进行了以下测试。如表所示。

数据长度

64

1024

1074

1088

128

256

512

2048

4096

8192

16384

下发状态

成功

失败

成功

成功

成功

成功

成功

失败

失败

失败

成功

可以看到,control center可以下发短包,数据为1024及1024倍数且小于缓冲区大小的时候,control center并不会发送零包,因此数据在套接字中无法commit,因此开发过程中遇到这些现象是正常现象。

3.FPGA

3.1FLAG Bug

首先应该明确FLAG工作的原理,Flag的本质是用来进行数据流控制的。当缓冲区非空的时候,相关的Flag才会发生状态的改变,通过指示缓冲区的状态用此来进行流控制。接收到数据时缓冲区不为空,相关标志开始工作,那么何时接收到数据呢?A DMA buffer will be received by the USB socket and committed to the P Port only if any of the following cases are satisfied:

1. The buffer is full (16KB is received).

2. Short packet is received from host.

3. ZLP is received from host.

对于另外一个方向的数据同样也是如此。这个接收到数据指的是,只有当这三种情况发生的时候,flag才会发出状态的反馈,即才会改变状态。怎么理解呢?由于fpga和上位机之间是固件架起了通道,这个通道包括了缓冲区、DMA通道,套接字,物理线程,GPIF II接口。正常理解是一旦上位机发数,那么数据会立即传递到缓冲区,置位标志,阻塞数据流。但其实连接缓冲区的左右两端是PIB套接字和UIB套接字,只有当套接字把数据放到缓冲区并到达对端的套接字时(这个动作官方手册里面称之为commit)的时候,标志才会置位,而这个过程并不是只要有数据就会触发,而是有条件的,条件就是上述的3个条件,只有满足其中一个条件时,数据才能从套接字上取到缓冲区里并经DMA通道到达对端。套接字的工作原理示意图如下所示:

基于明确的Flag的工作原理,介绍碰到Flag工作不正常的排查思路。首先检查slcs、sloe、slrd、slwr信号时序是否正确,有一种可能是,这几个信号时序错误,导致流控制失败,发生了空读或者空写,导致了flag工作不正常。确保地址线fx3_addr驱动正常,地址出错,会导致flag不正常。确保GPIF的设置与FPGA代码是相匹配的,具体表现在局部标志初始为高还是为低是在GPIF II里面设置的。(The DMA_READY flag starts indicating the status of the DMA buffer only when the host has started transferring data to FX3. The partial flag is observed to reflect the status of the buffers only after one full DMA buffer is read out. So, when the state machine starts, the partial flag cannot be monitored to know the empty status of the buffers.)使用cypress官方的stram OUT代码进行测试,看flag是否正常,这是为了排除硬件问题。排查pclk时钟是否稳定。排查固件中的数据流通道是否正确。

3.2数据丢数

任何通信接口传输数据出现数据丢失的情况是最棘手的。具体开发过程中出现过各种各样的丢数、误码。应该首先确保控制信号的时序是正确的,然后结合硬件具体的布线确定各信号是满足Cyusb3014芯片的时序要求的。最后应该确保FPGA的代码是meet the timing requirements。大多数情况还是时序约束不满足导致的。

USB之Cyusb3014开发经验总结 (十八)2022-04-17相关推荐

  1. 【零基础学Java】—笔记本USB接口案例(二十八)

    [零基础学Java]-笔记本USB接口案例(二十八) 一.笔记本电脑 笔记本电脑(laptop)通常具备使用USB设备的功能,在生产时,笔记本都预留了可以插入USB设备的USB接口,但具体什么是USB ...

  2. gnome桌面打造日常使用操作系统(支持Arch Linux、Fedora、Ubuntu)(2022.04.17更新)

    更新日志 日期 内容 2022.04.03 完成初稿 2022.04.05 更新sublime和imwheel 2022.04.06 添加所有软件在Feroda的安装方法 2022.04.07 添加所 ...

  3. 【强化学习论文合集】三十八.2022智能体和多智能体系统国际联合会议论文(AAMAS2022)

    欢迎订阅本专栏:<强化学习论文合集> 专栏介绍: 本专栏整理了2017~2022年(后面会持续更新)强化学习领域国际顶级会议已录用的论文,会议包括但不限于:ICML.NeurIPS.AAA ...

  4. 2022.04.17关于EasyX的知识点

    一.颜色 1.EasyX颜色:rgb(红,绿,蓝) 三基色:红.绿.蓝 范围0~255 二.EasyX 坐标和设备 1.坐标:(注意看坐标的原点位置) 2.设备 设备分两种:a.默认的绘图窗口 b.i ...

  5. Vue.js学习笔记 2022 04 17

    Vue.js学习笔记 1 Vue.js基础 Vue.js介绍 vuejs 渐进式 JavaScript 框架 Vue.js 如何应用 1 在普通html项目中,引入VUE.JS Hb 的项目 生成的 ...

  6. 2022.04.17-高宝琪毕设阶段性汇报

    第12次汇报 (2022.04.17) 实现了第三部分(分析数字化的心电数据)! 并将二.三两部分("纸质心电图数字化"和"分析数字化的心电数据")连通成了一个 ...

  7. 2021年安全生产工作总结及2022年思路计划(二十八篇)PPTX(附下载)

    摘要:2021年安全生产工作总结及2022年思路计划(二十八篇) 公众号:安全生产星球

  8. 3年开发经验,挂在了MyBatis十八连环问上!精通MyBatis源码,有多吃香?

    在 Java 相关岗位面试中,精通 MyBatis 真的非常吃香!它专注于 SQL 自身,是一个足够灵活的 DAO层 ORM 解决方案,而 DAO层 是每个后端程序员都绕不过去的一个话题. 搞技术的人 ...

  9. ROS探索总结(十六)(十七)(十八)(十九)——HRMRP机器人的设计 构建完整的机器人应用系统 重读tf 如何配置机器人的导航功能

    ROS探索总结(十六)--HRMRP机器人的设计 1. HRMRP简介         HRMRP(Hybrid Real-time Mobile Robot Platform,混合实时移动机器人平台 ...

最新文章

  1. 什么是大数据口子_大数据分析师年薪几十万,学什么专业才能从事大数据?
  2. 静态页中调用动态数据的三种办法
  3. linux web文件夹权限设置,WEB文件目录权限设置与修改方法
  4. java jstack 死锁_利用jstack检测死锁DeadLock
  5. Linux shell 的字符串截取
  6. 根据日期字符串获取当天星期几问题
  7. 如何在Pages for Mac中添加页眉、页脚和页码?
  8. 基于JavaWeb的小区车辆信息管理系统
  9. r720换固态硬盘后如何重装系统_联想拯救者 R720 换装 三星 960PRO 512G固态硬盘、重做系统与测试...
  10. 网易游戏岗位大揭秘(我是文案策划)
  11. 微信小程序实现组件之间的传值
  12. 将word背景设成淡绿色方法
  13. 黑桃怎么用html代码,index.html
  14. 佛祖保佑永无BUG 代码 (各种样式)
  15. 人生有多少次可以改命的机会,你把握住了几次,卷了几次(闲扯版)
  16. Ubuntu 16.04升级Openssh7.8p1
  17. 【dart】private 小坑
  18. error C2338: /RTCc rejects conformant code错误解决
  19. 区块链在供应链领域的应用前景
  20. 基于Apriori算法的网上图书销售ssm java毕业设计

热门文章

  1. Jupyter Notebook 删除不需要的 Kernels
  2. Java多线程(学习分享)
  3. 网络分析仪 smith圆图调试
  4. 《程序员健康指南》阅读笔记
  5. android 为摄像头增加闪光灯(s5pv210)
  6. ES module与commonjs的区别
  7. 微服务API网关框架详解
  8. Linux命令 - userdel命令
  9. synaptics安装
  10. Java实现图片上传到服务器