首先要实现对寄存器的配置,可以参考手册《Development kit  User Guide》,如下图所示:

此文件包含在 文件中。上述的应用文档详细介绍了如何利用KEIL实现对固件程序的编写。

对于USB 配置程序,下图是几个重要的模块,其中fw.c是主程序框架,periph.c文件是用户用来进行配置的主程序。

在《Development kit  User Guide》手册中,有如下描述:

手册中也有讲到,TD_init需要用户针对所用设备名称进行修改,fw.c中的程序可以不用修改。

  1.TD_init()

注意到TD_init()在此函数内进行设备的初始化,包括时钟频率,端口,FIFO的使用等,具体可以参看之前博客《EZ-USB重要寄存器的配置》。

  2.TD_Poll()

TD_Poll()是供用户外部设备使用,也就是在TD_Poll() 这个函数内写用户外部接口程序,控制外部设备。

  3.TD_suspend()

这个函数是当主函数进入挂起模式时被调用,在这个函数内写程序可以执行低功耗,关闭其他外部设备。如返回ture指示主函数使得FX2LP进入USB挂起模式。false可以使得不进入挂起模式。

  4.TD_resume()

这个函数是针对挂起模式函数而言的,当主函数退出挂起模式时,此函数被调用

下图是官方固件中给出的函数。

图上的TD_Suspend()和TD_resume

  5.EZ library

EZUSB-library 包含了EZUSB所需要的所有的寄存器文件。

以上是简单的介绍了一下关于主函数内部函数和用户编程函数内部函数介绍,更多的介绍请参看DVK手册。

  6.端点配置以及缓冲区域

   在之前的博客《EZ-USB重要寄存器的配置》中,关于端点的缓冲区和定义使用哪几个端点如图所示:

   上述是对于端口配置的解释,在设置为EP2CFG = 0xE0 ,缓冲区设置的是4缓冲区,每个缓冲区的大小为512字节。

关于缓冲区的设置原因,有如下的说法:(转载自某网友的回复)

 
  1,说FIFO满了就自动上传给电脑——这话是错的。USB2.0及1.1设备不能中断主机,只能是主机主动去访问设备。就是说,即便FIFO满了,如果主机不取,数据依然在设备的RAM里,RAM写满之后固件就不应该再写了。
  2,端点0,1比较简单,缓冲区长度固定,64字节,没有多重缓冲。端点2468比较灵活,4和8可以配置成512字节的双缓冲,2和6可以配置成512字节、1024字节的2、3、4倍缓冲。
  3,多重缓冲的目的是,主机(USB数据)可以和端点外部逻辑(如DSP,FPGA)直接交换信息,数据不用从CPU导进导出,从而提高了性能。多重缓冲的目的,可以提高系统性能,减少大数据进出时的等待,使突发数据变得平滑。这样说更恰当。
  4,缓冲是指对于端点有效的内存区块数。比如,双重缓冲,在USB数据进出一个端点的同时,外部逻辑的信息也可以进出同一端点。这是手册说的。
  5,假定端点2缓冲区设置为512字节,4倍缓冲,尽管这一端点占有了2048字节RAM,但CPU只认识“激活的”512字节缓冲区。这可以从寄存器长度看得出来,比如,EP2BCH:L是11位,可对1024字节的最大缓冲区长度进行计数,EP4BCH:L是10位,可对512自己的最大缓冲区长度进行计数。
  6,从第5点可以看出,FIFO读写数据是自动完成的,至于乒乓方式也是隐式实现的,CPU不了解也无需了解如何乒乓。CPU可以对FIFO进行少量的控制,传输有自动和CPU干预两种。了解FIFO的工作状况,可以通过中断、获取其EPxBCH:L长度、空、满、空闲等等一系列寄存器。寄存器太多了,所以显得这块特别复杂。
  7,一般地,在TD_Poll循环中,对输出缓冲区判断是否空,空则继续写给外部逻辑,将主机来的USB数据写到外部逻辑;对输入缓冲区判断是否满,满则不再写,外部逻辑来的数据将被固件自行抛弃。这可以回答你的第二个问题,缓冲区满是指所有输入缓冲区都满了,不管几重缓冲区都没地可写了。
  8,再深入地探讨一下。对输入缓冲区,如果主机长时间不读取USB设备的数据,那么它再次读到的数据,将是设备之前写满的数据。而外部逻辑新来的数据,将在主机将缓冲区读出空间之后才能更新。实际上,此时的数据会“跳”。你所说的“交替传输”将无法实现。这是USB2.0不能申请主机中断的弊病,在实时采集时,主机必需有个线程不停地读数。据介绍,USB3.0可以中断主机,值得期待。

USB2.0学习笔记连载(十七):keil实现寄存器的配置及相关函数讲解(一)的更多相关文章

  1. USB2.0学习笔记连载(十八):keil实现寄存器的配置及相关函数讲解(二)

    其实之前也有提及过,Cypress公司提供的官方文件和应用手册真的可以解决很多问题.做的也很人性化,操作也及其简单,几乎只要在 TD_int()里面配置一些常用的参数即可,其他都可以不用操作. 作为一 ...

  2. USB2.0学习笔记连载(一):CY7C68013特性简介

    上一篇博客已经给出了整个视频板卡架构,那么对于USB接口部分需要着重理解和学习. 对于目前来说,若是利用FPGA去模拟USB2.0内核,难度还是挺大的,整个状态的收发都不好控制.现在目前都在使用桥接芯 ...

  3. USB2.0学习笔记连载(十九):EZ-USB TRM手册重要部分介绍

        TRM手册中给出了所有的寄存器配置,在 slave fifo模式或者 GPIF模式等,所以对于用到的各种寄存器配置需要查看此手册,当然还可以配合着应用手册<AN61345>.   ...

  4. USB2.0学习笔记连载(六):USB2.0硬件设计需要注意事项

    笔者在设计USB2.0时找到了一个官方给的硬件设计正确设计指南,其中有些内容还挺nice的.不单单只是USB的设计,其中有些思想可以应用到其他的场合中. 对于USB2.0而言,全速状态下可以达到480 ...

  5. USB2.0学习笔记连载(五):EZ-USB重要寄存器的配置

    本篇博客主要讲解EZ-USB一些重要寄存器的配置,首先对于本篇博客所讲的内容,读者应该到官网上去下载相关的手册,其中包括<EZ-USB Technical Reference Manual> ...

  6. USB2.0学习笔记连载(三):通用USB驱动程序解析

    对于USB驱动的开发,读者可以使用Windows DDK.DriverStudio等多种开发工具来实现USB的驱动,但是驱动程序的开发过程都比较复杂,而且很容易致使USB主机内存泄露而死机.那么对于笔 ...

  7. USB2.0学习笔记连载(二):USB基础知识简介

    USB接口分为USB A型.USB B型.USBmini型.USBmicro型.USB3.0其中每种都有相应的插座和插头. 图1 图2 上图是USBA型接口,图1为插座,图2为插头.插座指向下行方向, ...

  8. USB2.0学习笔记连载(十四):USB驱动安装及固件程序的编写

    在之前的博客中已经讲过,驱动程序最核心的两个文件,一个是xxx.sys文件,一个是xxx.inf文件,主机是寻找xxx.inf文件. 在下面的文件中有相关关于USB驱动的说明.对于用户来说,xxx.s ...

  9. USB2.0学习笔记连载(十):关于WIN8及以上系统哈希值问题

    笔者上一篇博客讲解了关于驱动的安装,笔者使用的系统是win8.1系统,那么对于win8系统及以上系统,会对外部设备,没有在windows系统中进行签名过的,都是不允许在windows系统中进行安装的, ...

随机推荐

  1. [svc]centos6使用chkconfig治理服务和其原理

    centos6开机启动级别 $ cat /etc/inittab ... # 0 - halt (Do NOT set initdefault to this) # 1 - Single user m ...

  2. 【Unity】8.3 布局模式(GUILayout)

    分类:Unity.C#.VS2015 创建日期:2016-04-27 一.简介 在Unity 5.x中,GUI控件的布局方式有两种. 一种为固定布局,即在绘制控件的时候将位置参数传入,指定控件的精确位 ...

  3. Umeng社会化组件使用笔记

    1.申请umeng账号 2.下载umeng sdk,并且阅读友盟开放文档 3.申请各开放平台的账号,获取appid .appkey.appsecret:注意,这里需要配置安全域名sns.whalecl ...

  4. scala future

    https://docs.scala-lang.org/overviews/core/futures.html https://docs.scala-lang.org/overviews/index. ...

  5. pandas数组获取最大值索引的方法-argmax和idxmax

    pandas Series 的 argmax 方法和 idxmax 方法用于获取 Series 的最大值的索引值: 举个栗子: 有一个pandas Series,它的索引是国家名,数据是就业率,要找出 ...

  6. 【内核】几个重要的linux内核文件

    Preface 当用户编译一个linux内核代码后,会产生几个文件:vmlinz.initrd.img, 以及System.map,如果配置过grub引导管理器程序,会在/boot目录下看到这几个文件 ...

  7. JIRA python篇之展示多人未完成任务列表

    [本文出自天外归云的博客园] 通过python中的jira类我们可以方便的操作jira,获取一些我们想要再加工的信息. 这里举例,用html页面的形式展示分派给组内每个人的任务(未完成的.正在进行中的 ...

  8. BaseRecyclerViewAdapterHelper使用

    Reference: https://www.jianshu.com/p/1e20f301272e 一.框架引入 先在项目的 build.gradle(Project:XXXX) 的 reposito ...

  9. 好用的vim插件

    # 好用的vim插件 ### 简介------------------------------ 记录vim好用的插件 ### vimcdoc vim中文帮助文档-------------------- ...

  10. 【转】oracle & 和 ' 特殊字符处理 ( like 'GAC/&_%' escape '&'; 这里面的 / 居然将& 转义了 为什么?)

    原文地址:http://blog.csdn.net/gjswxhb/article/details/6083242 今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示(plsql 也一样 ...