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


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

    image

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

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

    image

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

    image image

      手册中也有讲到,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() 

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

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

    image

    图上的TD_Suspend()和TD_resume  

      5.EZ library

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

    image

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

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

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

    image image

    image

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

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

    image 
      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可以中断主机,值得期待。

  • 相关阅读:
    Swoole实战之手撸HttpServer框架 16 关于服务的平滑重启与热加载与cli_set_process_title函数的使用、添加前置进程、修改代码服务器自动热更新
    Swoole实战之手撸HttpServer框架 17 里程碑 整合前置进程、热更新、Ioc容器
    axios取消请求
    echarts使用transform缩放后导致图标模糊
    vuex4的简单使用
    Vite 按需引入 Ant Design Vue 3.0
    TS声明promise返回来的数据类型
    JavaScript一种新的数据结构类型Map
    CF1453D Checkpoints(期望)
    PLOP: Learning without Forgetting for Continual Semantic Segmentation论文阅读笔记
  • 原文地址:https://www.cnblogs.com/raymon-tec/p/5365294.html
Copyright © 2020-2023  润新知