历史上的今天
返回首页

历史上的今天

今天是:2024年11月06日(星期三)

正在发生

2019年11月06日 | PIC单片机的USB接口的应用 一个简单的USB HID 测试程序

2019-11-06 来源:51hei

 

1)HID  是Human Interface Device的缩写,由其名称可以了解HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。
2)CDC 虚拟串口,可与PC机直接联机通讯,如同RS232。
3)USB MSC (Mass Storage class) MSC是一种计算机和移动设备之间的传输协议,它允许一个通用串行总线(USB)设备来访问主机的计算设备,使两者之间进行文件传输。设备包括:移动硬盘,移动光驱,U盘,SD、TF等储存卡读卡器,数码相机,手机等等
..........

注意:每一个USB设备,都需要一个独立的身份编码 (ID),它由 2 组数字组成,一个是开发商代码(Vender ID),另一个是产品代码(Product ID)。如果是PIC使用者,可以向Microchip公司申请获得免费的身份编码。

以下介绍一个简单的HID 测试程序范例,希望对大家有帮助。

HID Custom Demo

[font=Tahoma][size=2]/* 

* Project name:

     HID Custom Demo

* Description

     Example showing usage of USB custom HID class. Attach usb cable in order to connect

     development board to PC. After connection, the board is recognized as USB HID

     device. Open HID Terminal from Tools menu and select HID Custom Demo device. When

     sending data to device, data is echoed and result is displayed in the terminal

     window.

* Test configuration:

     MCU:             P18F87J50

     dev.board:       MikroMMB_for_PIC18FJ_hw_rev_1.10

                      [url]http://www.mikroe.com/mikromedia/pic18fj/[/url]

     Oscillator:      HS-PLL, 48.000MHz

     Ext. Modules:    None.

     SW:              mikroC PRO for PIC

                      [url]http://www.mikroe.com/mikroc/pic/[/url]

*/


#include


// Buffer of 64 bytes

char buffer[64] absolute 0x500;

volatile char dataReceivedFlag = 0;


void interrupt(){

  // Call library interrupt handler routine

  USBDev_IntHandler();

}


// USB Device callback function called for various events

void USBDev_EventHandler(uint8_t event) {

//--------------------- User code ---------------------//

}


// USB Device callback function called when packet received

void USBDev_DataReceivedHandler(uint8_t ep, uint16_t size) {

  dataReceivedFlag = 1;

}


// USB Device callback function called when packet is sent

void USBDev_DataSentHandler(uint8_t ep) {

//--------------------- User code ---------------------//

}


void main(void){

  PLLEN_bit=1;                           // PLL turned on

  Delay_ms(150);                         // wait for a while to oscillator stabilizes


  ANCON0 = 0xFF;                         // Default all pins to digital

  ANCON1 = 0xFF;


  // Initialize HID Class

  USBDev_HIDInit();

  

  // Initialize USB device module

  USBDev_Init();


  // Enable USB device interrupt

  IPEN_bit = 1;

  USBIP_bit = 1;

  USBIE_bit = 1;

  GIEH_bit = 1;


  // Wait until device is configured (enumeration is successfully finished)

  while(USBDev_GetDeviceState() != _USB_DEV_STATE_CONFIGURED)

    ;


  // Set receive buffer where received data is stored

  USBDev_SetReceiveBuffer(1, buffer);


  // Infinite loop

  while(1){

    if(dataReceivedFlag){

      dataReceivedFlag = 0;

      // Send 64 bytes of data from buffer buff

      USBDev_SendPacket(1, buffer, 64);


      // Prepere buffer for reception of next packet

      USBDev_SetReceiveBuffer(1, buffer);

    }


  }


}


HID_Descriptor.c

/*

* Project name

     HID Custom Demo

* Project file

     HID_Descriptor.c

*/


#include


const uint8_t _USB_HID_MANUFACTURER_STRING[]  = "Mikroelektronika";

const uint8_t _USB_HID_PRODUCT_STRING[]       = "HID Custom Demo";

const uint8_t _USB_HID_SERIALNUMBER_STRING[]  = "0x00000003";

const uint8_t _USB_HID_CONFIGURATION_STRING[] = "HID Config desc string";

const uint8_t _USB_HID_INTERFACE_STRING[]     = "HID Interface desc string";


// Sizes of various descriptors

const uint8_t _USB_HID_CONFIG_DESC_SIZ   = 34+7;

const uint8_t _USB_HID_DESC_SIZ          = 9;

const uint8_t _USB_HID_REPORT_DESC_SIZE  = 33;

const uint8_t _USB_HID_DESCRIPTOR_TYPE   = 0x21;


// Endpoint max packte size

const uint8_t _USB_HID_IN_PACKET  = 64;

const uint8_t _USB_HID_OUT_PACKET = 64;


// Endpoint address

const uint8_t _USB_HID_IN_EP      = 0x81;

const uint8_t _USB_HID_OUT_EP     = 0x01;


//String Descriptor Zero, Specifying Languages Supported by the Device

const uint8_t USB_HID_LangIDDesc[0x04] = {

  0x04,

  _USB_DEV_DESCRIPTOR_TYPE_STRING,

  0x409 & 0xFF,

  0x409 >> 8,

};



// device descriptor

const uint8_t USB_HID_device_descriptor[] = {

  0x12,       // bLength

  0x01,       // bDescriptorType

  0x00,       // bcdUSB

  0x02,

  0x00,       // bDeviceClass

  0x00,       // bDeviceSubClass

  0x00,       // bDeviceProtocol

  0x40,       // bMaxPacketSize0

  0x00, 0x00, // idVendor

  0x00, 0x03, // idProduct

  0x00,       // bcdDevice

  0x01,

  0x01,       // iManufacturer

  0x02,       // iProduct

  0x03,       // iSerialNumber

  0x01        // bNumConfigurations


};


//contain configuration descriptor, all interface descriptors, and endpoint

//descriptors for all of the interfaces

const uint8_t USB_HID_cfg_descriptor[_USB_HID_CONFIG_DESC_SIZ] = {

  // Configuration descriptor

  0x09,                                   // bLength: Configuration Descriptor size

  _USB_DEV_DESCRIPTOR_TYPE_CONFIGURATION, // bDescriptorType: Configuration

  _USB_HID_CONFIG_DESC_SIZ & 0xFF,        // wTotalLength: Bytes returned

  _USB_HID_CONFIG_DESC_SIZ >> 8,          // wTotalLength: Bytes returned

  0x01,                                   // bNumInterfaces: 1 interface

  0x01,                                   // bConfigurationValue: Configuration value

  0x04,                                   // iConfiguration: Index of string descriptor describing  the configuration

  0xE0,                                   // bmAttributes: self powered and Support Remote Wake-up

  0x32,                                   // MaxPower 100 mA: this current is used for detecting Vbus


  // Interface Descriptor

  0x09,                                   // bLength: Interface Descriptor size

  0x04,                                   // bDescriptorType: Interface descriptor type

  0x00,                                   // bInterfaceNumber: Number of Interface

  0x00,                                   // bAlternateSetting: Alternate setting

  0x02,                                   // bNumEndpoints

  0x03,                                   // bInterfaceClass: HID

  0x00,                                   // bInterfaceSubClass : 1=BOOT, 0=no boot

  0x00,                                   // nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse

  5,                                      // iInterface: Index of string descriptor


  // HID Descriptor

  0x09,                                   // bLength: HID Descriptor size

  _USB_HID_DESCRIPTOR_TYPE,               // bDescriptorType: HID

  0x01,                                   // bcdHID: HID Class Spec release number

  0x01,

  0x00,                                   // bCountryCode: Hardware target country

  0x01,                                   // bNumDescriptors: Number of HID class descriptors to follow

  0x22,                                   // bDescriptorType

  _USB_HID_REPORT_DESC_SIZE,              // wItemLength: Total length of Report descriptor

  0x00,


  // Endpoint descriptor

  0x07,                                   // bLength: Endpoint Descriptor size

推荐阅读

史海拾趣

Celduc Relais公司的发展小趣事

为了确保产品质量和客户满意度,Celduc Relais公司投入大量资源建立了完善的质量管理体系。公司引入了先进的质量管理工具和方法,通过严格的质量控制和持续改进,不断提升产品质量和服务水平。这一举措不仅增强了客户对公司的信任,也为公司在激烈的市场竞争中保持领先地位提供了有力保障。

Bliley Technologies Inc公司的发展小趣事

二战期间,Bliley迎来了其历史上的一个重要时刻。由于战争对通信设备的巨大需求,Bliley的产品成为军事通信领域的关键组件。政府的大量采购合同使得Bliley的销售额直线上升,员工数量也急剧增加。为了满足战争期间的巨大需求,Bliley不得不扩建工厂,并实行昼夜不停的生产制度。这段时期,Bliley不仅在军事通信领域取得了显著成就,同时也为其在战后的发展奠定了坚实基础。

ATM [Advanced Technical Materials]公司的发展小趣事

在20世纪初期,电子技术和机械自动化的发展为ATM的出现奠定了基础。1939年,美国的Luther Simjian提出了ATM的设计雏形,并成功说服一家公司制作了样板试验产品。然而,由于当时的技术限制和公众接受度不高,这些早期ATM并未得到广泛应用。

Cermetek Microelectronics公司的发展小趣事

在电子行业快速发展的背景下,Cermetek Microelectronics公司深知创新的重要性。公司不断加大对研发的投入,引进先进的研发设备和人才,持续推出具有创新性的微电子产品。这些新产品不仅具有更高的性能和更低的功耗,还更加符合市场需求,为公司带来了更多的商业机会。

优先(苏州)半导体公司的发展小趣事

某苏州半导体公司自成立以来就坚持国际化战略,积极拓展海外市场。公司拥有一支高素质的研发团队和技术人员队伍,不断引进国际先进技术和设备,提高产品质量和竞争力。同时,公司积极参与国际交流与合作,与国际知名半导体企业建立了长期稳定的合作关系。这些举措使公司在国际市场上获得了良好的声誉和地位,产品远销欧美、日韩等国家和地区。随着公司规模的不断扩大和实力的不断增强,某苏州半导体公司将继续秉承国际化战略,推动公司向更高层次、更广领域发展。

这些故事展示了苏州半导体公司在不同领域和方面的发展和成就。这些公司凭借自身的技术实力、创新能力和市场洞察力,在激烈的竞争中脱颖而出,成为电子行业的佼佼者。

DSMI Electronics SA公司的发展小趣事

DSMI Electronics SA公司始于20世纪90年代末,由一群志同道合的电子工程师和科研人员创立。在创业初期,公司就明确了自己的技术定位:专注于电子元件和模块的研发与生产,特别是针对嵌入式系统和工业自动化领域。他们凭借深厚的技术积累和不懈的努力,成功开发出了一系列性能稳定、质量可靠的电子元件,赢得了市场的初步认可。

问答坊 | AI 解惑

毕业设计

现在要做毕业设计了,题目是《太阳能手机充电器的设计与制作》,请个位大哥给给帮帮忙!谢谢…

查看全部问答>

关于无话费手机的设想

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 (文中S—发射端,R—接收端) 今日有一让大家的使用手机而无需缴纳话费的设想,愿与大家共同分享,也希望其中的一些尚未解决之处大家集思广益。 首先,为什么我们要向移动、联通等运营商 ...…

查看全部问答>

PIC控制MAX518

有谁用 PIC自带的I2C连接MAX518么?一直不能实现数模转换,急求高手!!!…

查看全部问答>

二层交换机最小系统开发板v1.0

本开发板命名为Landbcm 2008 下面开始介绍介绍Landbcm 2008 1.Landbcm 2008系统框图: 1.Landbcm 2008学习板提供了 硬件: 1个WAN口, 1个100M以太网口, 4M Flash,16M SDRAM , 主控芯片为BCM47XX , 交换芯片为BCM5XXX 软件: 全套开 ...…

查看全部问答>

关于使用MFC-CDC类内存泄漏的问题

网上有文章说,使用从CWnd派生类中的GetDC()和ReleaseDC()会出现内存泄漏,不知道是否属实? 我使用以下代码进行测试: 使用一Timer,进行窗口Invalidate()。 void CTestDCDlg::OnPaint() {     //CPaintDC dc(this); // device con ...…

查看全部问答>

关于蓝牙的问题

最近想用蓝牙进行无线数据传输,开发环境是VC2005+WM5.0,手上有台惠普的PDA,带了蓝牙模块! 微软也提供了一个btsearch的例子,可是在调用WSALookupServiceBegin时候就会出错,通过WSAGetLastError得到的错误码是10108,运行其他人的例子也是这个 ...…

查看全部问答>

数据库同步 SqlCeRemoteDataAccess.Pull 里面的trackoption 参数设置问题

需要同步PDA和服务器数据库。用SQLCE3.0 SqlCeRemoteDataAccess.Pull方法可以下载服务器数据库的数据到PDA, 其中有个参数叫trackoption 。 当我把这个参数设置为TRACKINGOFF,也就是不跟踪数据变化时,没有任何问题,可以下载数据。 但当把它 ...…

查看全部问答>

MDK注册机新版加旧版大全

选上新板   再上旧版   我的MDK用旧板好用,新板反而不好用不知怎地 ;P …

查看全部问答>

请问这个积分电路输出。。。

参数都是按照书上写的,输入方波,输出应该是三角波,可为什么会是这样?  …

查看全部问答>

解决了一个不可解决的问题

  一块段显小屏,LCM046 一个单片机STC89C58RD+,一个串口下载器。   要完成一个大任务的一个小部分-----------点亮段式LCD。   呵呵,这个对我来说小菜一盘,没太在意。   因为我以前就点亮过只不过那个东东存在(对人 ...…

查看全部问答>