前进的每一步,都是学习,是成长。
USBXpress程序员指南(AN169)— 3.器件接口函数[转载]
  • 首页 > 嵌入式系统 > 系统与软件设计
  • 作者:最爱香茗
  • 2018年5月17日 20:28 星期四
  • 浏览:434
  • 字号:
  • 评论:0
  •  

    器件接口函数

     

    USBXpress固件库内涵一组器件接口函数,向C8051F32x和C8051F34x微处理器提供应用程序接口(API)。

    这些函数提供一个MCU中USB控制器的简化的I/O接口,因此消除了理解和管理USB硬件或协议细节的需要。



    API以Keil C51工具预编译的库文件的形式提供。器件固件必须使用Kei软件C51工具开发。

    可用的器件接口函数如下:



     


    USB_Clock_Start()              初始化USB时钟

    USB_Init()                     使能USB接口

    Block_Write()                   写数据块到USB主机

    Block_Read()                   从USB主机读取数据块

    Get_Interrupt_Source()            获取API中断原因

    USB_Int_Enable()               使能API中断

    USB_Int_Disable()               禁止API中断

    USB_Suspend()                 关闭USB中断

    USB_Get_Library_Version()       获取USBXpress固件库版本



    API在中断模式中使用。使用者必须提供一个对‘F320/1/6/7器件’

    位于向量地址0x0083(interrupt 16),或对‘F34x器件’位于向量地址0x008B(interrupt 17)

    的中断处理程序。该处理程序将被任意USB API中断调用。

    一旦进入这个ISR,调用Get_Interrupt_Source决定中断来源(该调用同时清除等待的中断标志)。

     

    USBXpress固件库运行MCU的USB控制器在全速模式,使用每包64字节的数据有效负荷的批量输出类型。

    对特定的MCU器件系列(F320/1,F326/7,F34x)代码开发必须使用指定的USBXpress器件固件库。


    注意:位于向量地址0x0043(interrupt 8)的USB0硬件中断由USBXpress声明,它是用来处理低等级

    USB协议细节。USB API中断(interrupt 16(F320/1/6/7)和interrupt 17(F34x))是当使用者代码

    需要被USBXpress时间通知时,由USBXpress固件库产生的一个虚拟中断。

    事件在Get_Interrupt_Source函数的描述中定义。


    固件API的ISR例子:

    void USB_API_TEST_ISR(void) interrupt 16

    {

    BYTE INTVAL = Get_Interrupt_Source();

    if (INTVAL & TX_COMPLETE)

    {

    Block_Write(In_Packet, 8);

    }

    if (INTVAL & RX_COMPLETE)

    {

    Block_Read(Out_Packet, 8);

    }

    if (INTVAL & DEV_CONFIGURED)

    {

    // Initialize all analog peripherals here. This interrupt

    // tells the device that it can now use as much current as

    // specified by the MaxPower descriptor.

    Init(); // Note: example command, not part of the API

    }

    if (INTVAL & DEV_SUSPEND)

    {

    // Turn off all analog peripherals

    Turn_Off_All(); // Note: example command, not part of the API

    USB_Suspend(); // This function returns once resume

    // signalling is present.

    // Turn all analog peripherals back on

    Init(); // Note: example command, not part of the API

    }

    }



    3.1 USB_Clock_Start

    描述:

    使能内部振荡器,初始化时钟倍频器,同时设置USB时钟为48MHz达到USB全速运行。

    如果时钟倍频器已经初始化,则初始化过程跳过。该函数必须在调用USB_Init或访问在

    多达1024字节的XRAM中的任意变量前调用。

    CLKSEL[1:0]不受该函数影响。参见“附录A——在调用USB_Clock_Start和USB_Init后

    不应该配置的SFRs”。

    参考“附录C——固件库注意事项”,介绍如何使用外部振荡器作为USB时钟。

    支持器件:C8051F330320/1/6/7,C8051F330340/1/2/3/4/5/6/7

    原型:void USB_Clock_Start (void)

    参数:None

    返回值:None



    3.2 USB_Init

    描述:

    使能USB接口,USB时钟恢复功能和使用的器件接口函数。配置USB接口,同时C8051F32x全局中断

    被使能。用户软件不应该禁止全局中断(EA = 0),但可以通过在寄存器IE、EIE1、EIE2中的中断源

    中断使能标志来单独允许或禁止用户配置的中断。在调用USB_Init钱,USB_Clock_Start应被调用来

    配置USB时钟。参见“附录A——在调用USB_Clock_Start和USB_Init后不应该配置的SFRs”来了解更多。

    该函数允许用户指定供应商和产品ID以及制造商、产品描述和序列号字符,当USB连接时,

    它们作为器件USB描述的一部分发送给主机。



    支持器件:C8051F330320/1/6/7,C8051F330340/1/2/3/4/5/6/7

    原型:

    void USB_Init (UINT VendorID, UINT ProductID, BYTE *ManufacturerStr,

    BYTE *ProductStr, BYTE *SerialNumberStr, BYTE MaxPower, BYTE PwAttributes, UINT bcdDevice)

    参数:

    1.     VendorID——在USB连接器件,16bit供应商ID被返回给主机操作系统。

             设置为0x10C4使用默认的Silicon Labs供应商ID。

    2.     ProductID——在USB连接时,16bit产品ID被返回给主机操作系统。

              设置为0xEA61关联默认的USBXpress 驱动器。

    3.     ManufactureStr——字符串指针。格式参见附录B。不能为空指针,因为该字符串在库中没有默认值。

    4.     ProductStr——字符串指针。格式参加附录B。不能为空指针,因为该字符串在库中没有默认值。

    5.     SerialNumberStr——字符串指针。格式参加附录B。不能为空指针,因为该字符串在库中没有默认值。

    6.     MaxPower——指出器件需要多少总线电流。设定的值为实际需要电流值(mA)的一半。

            最大允许的电流是500mA,因此任何大于0xFA的值都会自动设置为0xFA。

             例如:设置为0x32要求100mA。

    7.     PwAttributes——如果器件是自供电则第6位置1,如果是总线供电则第6位置0。

             如果器件支持远程唤醒功能则第5位置1。第0位到第4位必须全为0,第7位必须为1。

    8.     bcdDevice——器件版本号用BCD码表示。在BCD码中,高字节表示整数,接着4位十分位,

               最后4位是百分位。

    返回值:None



    3.3 Block_Write

    描述:

    通过USB向主机写缓存的数据。最大的块大小是4096字节。返回实际写入的字节数。

    这与参数NumByte的值相等,除非发生错误。

    如果调用的Block_Write的NumBytes大于4096则返回0。如果NumBytes大于64字节,

    则Bulk Transaction传输会分成多个数据包,每个包含一个64字节的数据有效负荷(除了最后一个数据包)。

    Block_Write在复制最后一个数据包到器件USB传输缓存后返回值。

    TX_COMPLETE USB API中断会指示交换已完成。

    SI_Read可以读取0 ~ 64KB数据。如果在SI_Read被调用前多次调用Block_Write,

    则有根据读的数据量要求在主机缓存中读取全部数据的能力。

    例如,如果Block_Write被调用4次,且发送一字节数据到主机的每个块中,

    可以调用SI_Read要求4字节并可马上从全部4个Block_Write中获取数据。



    支持器件:C8051F330320/1/6/7,C8051F330340/1/2/3/4/5/6/7

    原型:UINT Block_Write (BYTE *Buffer, UINT NumBytes)

    参数:

    1.     Buffer——写入数据的存储器地址指针。

    2.     NumBytes——写入字节数(1~4096)。

    返回值:返回一个无符号16bit值,指示实际写入的字节数。



    3.4 Block_Read

    描述:

    通过USB读取从主机发出的数据。最大的块大小是64字节。数据块从USB接口复制到Buffer指针

    指向的存储器地址。

    无论全部缓存是否被Block_Read读取,器件的USB接收缓存都会被清空返回。

    从器件USB接收缓存中读取的最大字节数由NumBytes指定。

    实际读取的字节数(复制到缓存)通过函数返回。如果没有读到数据则返回0。一般的,

    Block_Read应该在接受一个数据包后被调用,通过RX_COMPLETE USB API中断指示。



    多次调用Block_Read也许需要读取全部已发送的数据,通过一次SI_Write调用,

    如果缓存发送到SI_Write大于64字节。



    支持器件:C8051F330320/1/6/7,C8051F330340/1/2/3/4/5/6/7

    原型:BYTE Block_Read (BYTE *Buffer, BYTE NumBytes)

    参数:

    1.     Buffer——指向数据复制的存储器地址的指针。

    2.     NumBytes——读的字节数(1~64)。

    返回值:返回一个无符号8bit值,指示实际读取的字节数。



    3.5 Get_Interrupt_Source

    描述:

    返回一个8bit值指出API中断的原因,并清除USB API中断等待标志。该函数必须要用户中断服务程序内

    的开头调用以决定发生什么事件。



    支持器件:C8051F330320/1/6/7,C8051F330340/1/2/3/4/5/6/7

    原型:BYTE Get_Interrupt_Source (void)

    参数:None

    返回值:

    返回一个无符号8bit代码指出API中断的原因。代码可以同时指出多于一个类型的中断。

    返回值代码如下所示:

    0x00                      无USB API中断发生

    0x01    USB_RESET         USB 复位中断

    0x02    TX_COMPLETE       发送完成中断

    0x04    RX_COMPLETE       接收完成中断

    0x08    FIFO_PURGE        从主机接收命令清除USB缓存

    0x10    DEVICE_OPEN       器件实例在主机端打开

    0x20    DEVICE_CLOSE      器件实例在主机端关闭

    0x40    DEV_CONFIGURED    器件进入设置状态

    0x80    DEV_SUSPEND       USB挂起在总线上的信号



    3.6 USB_Int_Enable

    描述:

    调用该函数允许USB API产生中断。如果使能,USB API会根据下列API事件产生中断:

    1.     USB复位

    2.     由调用Block_Write函数的发送安排已完成

    3.     由调用Block_Read函数的RX缓存已经准备好服务

    4.     来自主机的命令使USB缓存被清除

    5.     器件实例被主机打开或关闭

    可通过调用Get_Interrupt_Source知道中断的原因。如果USB API中断被允许,用户必须提供一个入口

    在interrupt 16(地址 = 0x0083)的中断服务程序。当该函数被调用,如果任何中断等待,

    控制器会在1ms内转换到interrupt 16处理器。



    支持器件:C8051F330320/1/6/7,C8051F330340/1/2/3/4/5/6/7

    原型:void USB_Int_Enable (void)

    参数:None

    返回值:None



    3.7 USB_Int_Disable

    描述:

    该函数禁止USB API中断产生。



    支持器件:C8051F330320/1/6/7,C8051F330340/1/2/3/4/5/6/7

    原型:void USB_Int_Disable (void)

    参数:None

    返回值:None



    3.8 USB_Disable

    描述:

    该函数禁止USB接口和器件接口函数的使用。USB接口不再可用且API中断关闭。

    除非系统时钟被设置为“4x Clock Multiple/2”选项(CLKSEL[1:0] = 10b),

    否则时钟倍频器关闭以减小功耗。



    支持器件:C8051F330320/1/6/7,C8051F330340/1/2/3/4/5/6/7

    原型:void USB_Disable (void)

    参数:None

    返回值:None



    3.9 USB_Suspend

    描述:该函数是器件符合USB暂停电流规格。为了兼容USB,USB器件必须支持暂停功能,

    降低其总功耗在500uA以下。

    该函数只当DEV_SUSPEND USB API中断被接收后才能调用。在调用该函数前,

    应该关闭所有不需要的用户外围设备,当调用返回后可以重新打开这些设备。

    该程序使USB收发器和时钟倍频器掉电,然后暂停内部振荡器知道USB恢复信号发生。

    一旦USB传输被识别,内部振荡器重启,USB_Clock_Start被调用,然后函数调用返回到用户代码。

    注意:USB_Suspend会设置系统时钟为默认的内部振荡器。当USB_Suspend被调用时,

    如果系统时钟设置为时钟倍频器,则该设置会在函数返回钱保存。如果需要对系统时钟使用其他任何设置,

    用户代码应在配置CLKSEL从USB_Suspend返回。



    支持器件:C8051F330320/1/6/7,C8051F330340/1/2/3/4/5/6/7

    原型:void USB_Suspend (void)

    参数:None

    返回值:None

    3.10 USB_Get_Library_Version

    描述:

    该函数返回以BCD格式表示的USBXpress 固件库版本号。该函数从USBXpress固件库2.4及以上版本有效。

    例如:Rev.2.41返回0x0241。



    支持器件:C8051F330320/1/6/7,C8051F330340/1/2/3/4/5/6/7

    原型:UINT USB_Get_Library_Version (void)

    参数:None

    返回值:以无符号16bit BCD格式返回USBXpress 固件库版本号。




    查看原文
     
      您阅读这篇文章共花了:  
    二维码加载中...
    本文作者:最爱香茗      文章标题: USBXpress程序员指南(AN169)— 3.器件接口函数[转载]
    本文地址:http://www.gcsjl8.com/?post=16
    版权声明:若无注明,本文皆为“成长记忆”原创,转载请保留文章出处。