庖丁解牛——CY7C68013A开发框架
大家好,好久不见了,距离上次发文章都有两个多星期了,非常高兴同时也非常感谢你们能一直关注我。之前在公众号上收到网友的消息,其大概意思就是问我能不能出点USB干货,为此我就把第二篇——解密USB2.0数据传输机理推迟,先行为大家奉上沉甸甸的干货,希望大家在看完后能多多提建议。
本期文章的主题是CY7C68013A固件程序开发,首先我会简要介绍一下CY7C68013A这款芯片以及官方提供的开发包,然后拿出开发包中的一个例程为大家详细剖析固件程序的整个框架,这些内容主要是为之后的功能实现打基础。
CY7C68013A是Cypress公司FX2LP系列的一款USB2.0控制器,该款芯片以8051内核(是不是想到了STC 51单片机了)为核心,配合USB硬件实现,再加上高速的对外并行接口GPIF(SlaveFIFO),简直是FPGA与PC之间的高速公路,这也正是我选择这款芯片的原因。
CY7C68013A的主要特点有:
◆ 增强型8051内核,48MHz/24MHz/12MHz可选的CPU时钟,扩展的中断系统
◆ I2C、USART
◆ 16KB 片上代码/数据RAM
◆ 支持USB2.0 高速和全速传输
◆ 4个可编程的批量/中断/同步传输端点,一个控制传输专用端点0,一个可编程64字节批量/中断端点
◆ 8位/16位GPIF(SlaveFIFO)接口
◆ USB和GPIF二级中断向量
◆ 4个专用于USB大量数据传输的端点FIFO

✦1 CY7C68013A功能框图
图1是CY7C68013A的功能框图,其实我们可以把它们分类成4块:
1) 8051内核和RAM:任务调度和数据处理,初始化各个模块;
2) I2C主控:配置I2C从机,主要还是从(往)EEPROM读(写)代码和数据,用来固化程序;
3) GPIF和FIFO:与外部高速设备交换数据,当我们和FPGA连接时,通常工作在SlaveFIFO模式;
4) USB2.0高速/全速收发器和USB1.1/2.0智能引擎:USB2.0协议的硬件实现,简化了我们的开发工作,我们只需操作端点FIFO就能实现与PC的数据交换。
针对FX2LP系列USB2.0控制器,Cypress公司为我们提供了一个强大的开发包。这是开发包的下载地址:http://china.cypress.com/documentation/development-kitsboards/cy3684-ez-usb-fx2lp-development-kit。下载后直接安装,当提示选择安装类型,选择Complete就行。在安装过程中会顺便安装两个工具:Keil uVision2和GPIF Designer,Keil就是编写固件程序的IDE,而GPIF Designer是专用于设计GPIF波形的工具。图2所示是安装后FX2LP_SDK的所有文件。Bin文件夹中只包含一个用于文件转换的工具——Hex2bix。Documentation是FX2LP_SDK所有的文档,有兴趣的朋友可以看看。Drivers包含FX2LP系列的windows驱动。Firmware是官方提供的固件程序例程,这些例程非常具有参考价值,能节省我们大量的时间,这也是我们最需要的。GPIF_Designer是GPIF波形编辑工具,在使用SlaveFIFO时用不上。Hardware是该套件的硬件设计资料,主要是给PCB设计人员使用的。Target包含的主要是我们编程所需的库文件。Updater是开发包更新工具。Utilities包含的是Hex2bix的Visual Studio工程。uV2_4K是Keil uVision2的安装路径。Windows Applications包含的是一些进行USB传输测试的上位机程序(Visual Studio工程)。

✦2 FX2LP_SDK中的文件
开发固件程序使用的是Keil,开发包内的是比较老的uVision2版本,各位如果不想用它可以到网上下载更新的版本。下面我就以Firmware文件夹下的Bulkloop为例,来讲解固件程序的框架。
首先找到Bulkloop例程,打开该工程,打开后如图3所示。

✦3 Bulkloop例程
在该工程下有5个文件:fw.c是固件框架的主体,bulkloop.c集中了可供用户调度的函数,dscr.a51是一个包含了描述符的汇编文件,USBJmpTb.OBJ是由一个包含了二级中断向量表的汇编文件生成的OBJ文件,EZUSB.LIB是FX2LP自带的静态库文件。我们需要编辑的通常只有bulkloop.c和dscr.a51。不过为了介绍固件程序给我们提供的框架,还是要以fw.c为重点来了解。
看到一个C程序,第一步就是找到它的main函数。在main函数中,首先定义了4个状态变量Sleep、Rwuen、Selfpwr、GotSUD,分别反映的是睡眠状态、唤醒状态、是否自我供电、是否接收到了Setup数据,在后面它们还会用到。紧接着是一个TD_Init()函数,该函数是给用户进行初始化的地方。再接下来是定位描述符的地址,这里有两种情况,一种是描述符存放在外部RAM,另一种是存放在内部RAM,当然了一般CY7C68013A是不会外接RAM的。再接下来是使能中断,这里的中断既有一级中断,又有二级中断。再接下来是进行重枚举和连接,重枚举就是枚举成非默认USB设备,也就是使用用户固件程序指定描述符进行枚举。如果是从EEPROM启动,那么默认就会进行重枚举。至此初始化部分就结束了。
从while(TRUE)开始是任务调度部分。首先调用的TD_Poll()函数,该函数是用户进行任务调度的函数。然后判断GotSUD,这是一个状态变量(前面见过),当该变量值为TRUE时说明Setup数据已经接收到了,这时就可以进行枚举过程,也就是调用SetupCommand()函数来响应主机的请求。接下来是判断Sleep变量,以此决定是否要进入睡眠模式,当进入睡眠模式后一直等待唤醒信号,唤醒时调用库函数EZUSB_Resume进行唤醒,同时还提供了TD_Resume给用户使用。
固件框架最大的贡献是帮我们完成了枚举过程(SetupCommand()函数),在SetupCommand()函数中处理了各种由主机发出的标准设备请求。那么既然是针对设备请求进行响应,先来看看设备请求是什么样的。如图4所示,设备请求有8字节,其中bmRequestType指定了请求类型、方向、接收者,bRequest是请求码(参考图5),还有6字节由具体的设备请求来确定。

✦4 8字节设备请求

✦5 CY7C68013A的标准设备请求和厂商请求
设备请求的8字节被USB设备(CY7C68013A)接收到后就会存入到8字节的SETUPDAT寄存器中,固件程序的SetupCommand函数就是根据SETUPDAT中的数据来进行响应的。首先需要判断的是请求码(也就是SETUPDAT[1]),固件框架响应的请求有:Get Descriptor、SC_GET_INTERFACE、SC_SET_INTERFACE、SC_SETCONFIGURATION、SC_GET_CONFIGURATION、SC_GET_STATUS、SC_CLEAR_FEATURE、SC_SET_FEATURE,除此之外对于不是标准设备请求的厂商请求(参考图5),专门给用户提供其响应函数DR_VendorCmnd()。如果请求不能正确响应,那么就需要调用EZUSB_STALL_EP0()函数来将端点0挂起。关于每种请求应该如何响应,可以参考FX2LP_SDK中的EZ-USB® Technical Reference Manual文档,在该文档的第2章Endpoint Zero中有详细的说明。在SetupCommand()函数的最后调用了这条语句:EP0CS |= bmHSNAK,这条语句非常重要,它的作用就是往EP0CS的HSNAK位写1清0,以此来完成一次完整的控制传输,否则这次的控制传输就不会结束,那么主机就会处于等待状态或者直接就是枚举失败。
固件框架中还有一个比较重要的就是中断系统,尤其是USB二级中断(见图6)。中断服务函数绝大多数在bulkloop.c中(唯一的例外是唤醒中断,该中断并不交给用户使用),这些中断服务函数中有一部分是空函数,有语句需要执行的只有几个USB二级中断,其中比较典型的有ISR_Sudav()和ISR_Susp()。ISR_Sudav()在接收到Setupdata数据并且可用的情况下就会触发,我们可以看到GotSUD = TRUE这条语句就是在这时候执行,这正好和前面讲的呼应了。ISR_Susp()与之类似,当有睡眠信号发生时就会触发,并且将Sleep变量赋值为TRUE,那么在while(TRUE)循环中就会调用进入睡眠的函数。需要用到的USB二级中断服务函数都会执行下面两条语句:EZUSB_IRQ_CLEAR();USBIRQ = bmSUSP;,它们的作用就是清除USB一级中断请求位以及相应的二级中断请求位,清除之后才能再次触发中断。

✦6 USB二级中断
最后,还剩下一个dscr.a51文件,这里存放的就是USB设备的描述符信息,这些描述符会在枚举的过程(SetupCommand()函数)中提交给主机。有关描述符以及本篇文章中其他的USB协议的概念需要等到解密USB2.0数据传输机理这篇文章发布时再做介绍。
再次感谢大家对大熊FPGA的关注,持续关注还能收到更多的干货哟!
庖丁解牛——CY7C68013A开发框架的更多相关文章
- Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms
行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...
- 从零开始编写自己的C#框架(27)——什么是开发框架
前言 做为一个程序员,在开发的过程中会发现,有框架同无框架,做起事来是完全不同的概念,关系到开发的效率.程序的健壮.性能.团队协作.后续功能维护.扩展......等方方面面的事情.很多朋友在学习搭建自 ...
- CRL快速开发框架系列教程十三(嵌套查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程十二(MongoDB支持)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程十一(大数据分库分表解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程十(导出对象结构)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程九(导入/导出数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程七(使用事务)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程六(分布式缓存解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
随机推荐
- 使用websocket-sharp来创建c#版本的websocket服务
当前有一个需求,需要网页端调用扫描仪,javascript不具备调用能力,因此需要在机器上提供一个ws服务给前端网页调用扫描仪.而扫描仪有一个c#版本的API,因此需要寻找一个c#的websocket ...
- js模版引擎开发实战以及对eval函数的改进
简介 前段时间,想着自己写一个简单的模版引擎,便于自己平时开发demo时使用,同时也算是之前学习的知识的一种总结吧! 首先我们先了解一下模版引擎的工作原理吧! 1. 模版引擎其实就是将指定标签的内容根 ...
- 【T-SQL进阶】03.执行计划之旅-1
到大牛们说执行计划,总是很惶恐,是对知识的缺乏的惶恐,所以必须得学习执行计划,以减少对这一块知识的惶恐,下面是对执行计划的第一讲-理解执行计划. 本系列[T-SQL]主要是针对T-SQL的总结. T- ...
- URL和HTTP协议(无图片)
URL...... 示例: http://localhost/phpwind/searcher.php?keyword=phpwind&type=thread 协议部分:一般是指URL中第一个 ...
- Tomcat常用配置修改
Tomcat常用配置修改 说明 运行需要设置环境变量 JAVA_HOME 即JDK安装目录 tomcat 默认登录地址 http://localhost:8080 配置tomcat 1.端口设置 打开 ...
- (转载)JProfiler试用手记
JProfiler是一款Java的性能监控工具.可以查看当前应用的对象.对象引用.内存.CPU使用情况.线程.线程运行情况(阻塞.等待等),同时可以查找应用内存使用得热点,这里提供有几篇文章供参考:获 ...
- Chrome浏览器扩展开发系列之七:override页面
Chrome浏览器通常提供了一些默认页面,如标签管理器页面chrome://bookmarks.浏览历史记录页面chrome://history或新建Tab页面chrome://newtab等. Ch ...
- Oracle锁表处理操作笔记
--查看锁表进程SQL语句1: SELECT sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, ...
- DOM事件代码小结
以下代码出自<DOM Enlightenment>一书1.三种事件形式 <body onclick="alert('触发内联属性事件')"> <div ...
- Abp(.NetCore)开发与发布过程2
在Abp(.NetCore)开发过程中遇到很多问题,今天记录下Abp的防CSRF功能(AntiForgeryToken ), 背景知识. AntiForgeryToken 可以说是处理/预防CSRF的 ...