Nguyên văn bởi ngochoangims
Xem bài viết
queduong , duong_act cho mình hỏi hai code dưới đây sai chỗ nào mà ko chạy được (mình dùng MicroC Pro 6.3), mạch chỉ làm cho 8 nút bấm, các nút này được gán bằng cách quy đổi giá trị adc tại cổng AN0 :
1. Code chính thực hiện chương trình (Main.c):
2. Code Hid USB Joystick report descriptor (USB_DSC.c):
1. Code chính thực hiện chương trình (Main.c):
Code:
// unsigned char readbuff[64] absolute 0x500; unsigned char writebuff[64] absolute 0x540; unsigned char pov; unsigned char buttons; // void interrupt() { USB_Interrupt_Proc(); // USB servicing is done inside the interrupt } void main() { HID_Enable(&readbuff,&writebuff); // Enable HID communication while(1) { pov = ADC_Get_Sample(0) / 4; if(pov >= 0 && pov <= 32) buttons = 0b00000001; if(pov >= 33 && pov <= 64) buttons = 0b00000010; if(pov >= 65 && pov <= 96) buttons = 0b00000011; if(pov >= 97 && pov <= 128) buttons = 0b00000100; if(pov >= 129 && pov <= 160) buttons = 0b00000101; if(pov >= 161 && pov <= 192) buttons = 0b00000110; if(pov >= 193 && pov <= 224) buttons = 0b00000111; if(pov >= 225 && pov <= 230) buttons = 0b00001000; writebuff[0] = buttons; while(!HID_Write(&writebuff,1)); } }
Code:
const unsigned int USB_VENDOR_ID = 0x1234; const unsigned int USB_PRODUCT_ID = 0x0001; const char USB_SELF_POWER = 0x80; // Self powered 0xC0, 0x80 bus powered const char USB_MAX_POWER = 50; // Bus power required in units of 2 mA const char HID_INPUT_REPORT_BYTES = 64; const char HID_OUTPUT_REPORT_BYTES = 64; const char USB_TRANSFER_TYPE = 0x03; //0x03 Interrupt const char EP_IN_INTERVAL = 1; const char EP_OUT_INTERVAL = 1; const char USB_INTERRUPT = 1; const char USB_HID_EP = 1; const char USB_HID_RPT_SIZE = 45; // Con số này tính bằng cách nào?? thấy Mod queduong điền trong auto keyboard như vậy /* Device Descriptor */ const struct { char bLength; // bLength - Descriptor size in bytes (12h) char bDescriptorType; // bDescriptorType - The constant DEVICE (01h) unsigned int bcdUSB; // bcdUSB - USB specification release number (BCD) char bDeviceClass; // bDeviceClass - Class Code char bDeviceSubClass; // bDeviceSubClass - Subclass code char bDeviceProtocol; // bDeviceProtocol - Protocol code char bMaxPacketSize0; // bMaxPacketSize0 - Maximum packet size for endpoint 0 unsigned int idVendor; // idVendor - Vendor ID unsigned int idProduct; // idProduct - Product ID unsigned int bcdDevice; // bcdDevice - Device release number (BCD) char iManufacturer; // iManufacturer - Index of string descriptor for the manufacturer char iProduct; // iProduct - Index of string descriptor for the product. char iSerialNumber; // iSerialNumber - Index of string descriptor for the serial number. char bNumConfigurations; // bNumConfigurations - Number of possible configurations } device_dsc = { 0x12, // bLength 0x01, // bDescriptorType 0x0200, // bcdUSB 0x00, // bDeviceClass 0x00, // bDeviceSubClass 0x00, // bDeviceProtocol 8, // bMaxPacketSize0 USB_VENDOR_ID, // idVendor USB_PRODUCT_ID, // idProduct 0x0001, // bcdDevice 0x01, // iManufacturer 0x02, // iProduct 0x00, // iSerialNumber 0x01 // bNumConfigurations }; /* Configuration 1 Descriptor */ const char configDescriptor1[]= { // Configuration Descriptor 0x09, // bLength - Descriptor size in bytes 0x02, // bDescriptorType - The constant CONFIGURATION (02h) 0x29,0x00, // wTotalLength - The number of bytes in the configuration descriptor and all of its subordinate descriptors 1, // bNumInterfaces - Number of interfaces in the configuration 1, // bConfigurationValue - Identifier for Set Configuration and Get Configuration requests 0, // iConfiguration - Index of string descriptor for the configuration USB_SELF_POWER, // bmAttributes - Self/bus power and remote wakeup settings USB_MAX_POWER, // bMaxPower - Bus power required in units of 2 mA // Interface Descriptor 0x09, // bLength - Descriptor size in bytes (09h) 0x04, // bDescriptorType - The constant Interface (04h) 0, // bInterfaceNumber - Number identifying this interface 0, // bAlternateSetting - A number that identifies a descriptor with alternate settings for this bInterfaceNumber. 2, // bNumEndpoint - Number of endpoints supported not counting endpoint zero 0x03, // bInterfaceClass - Class code 0, // bInterfaceSubclass - Subclass code 0, // bInterfaceProtocol - Protocol code 0, // iInterface - Interface string index // HID Class-Specific Descriptor 0x09, // bLength - Descriptor size in bytes. 0x21, // bDescriptorType - This descriptor's type: 21h to indicate the HID class. 0x01,0x01, // bcdHID - HID specification release number (BCD). 0x00, // bCountryCode - Numeric expression identifying the country for localized hardware (BCD) or 00h. 1, // bNumDescriptors - Number of subordinate report and physical descriptors. 0x22, // bDescriptorType - The type of a class-specific descriptor that follows USB_HID_RPT_SIZE,0x00, // wDescriptorLength - Total length of the descriptor identified above. // Endpoint Descriptor 0x07, // bLength - Descriptor size in bytes (07h) 0x05, // bDescriptorType - The constant Endpoint (05h) USB_HID_EP | 0x80, // bEndpointAddress - Endpoint number and direction USB_TRANSFER_TYPE, // bmAttributes - Transfer type and supplementary information 0x40,0x00, // wMaxPacketSize - Maximum packet size supported EP_IN_INTERVAL, // bInterval - Service interval or NAK rate // Endpoint Descriptor 0x07, // bLength - Descriptor size in bytes (07h) 0x05, // bDescriptorType - The constant Endpoint (05h) USB_HID_EP, // bEndpointAddress - Endpoint number and direction USB_TRANSFER_TYPE, // bmAttributes - Transfer type and supplementary information 0x40,0x00, // wMaxPacketSize - Maximum packet size supported EP_OUT_INTERVAL // bInterval - Service interval or NAK rate }; const struct { char report[USB_HID_RPT_SIZE]; }hid_rpt_desc = { 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x04, // USAGE (Joystick) 0xa1, 0x01, // COLLECTION (Application) 0xa1, 0x00, // COLLECTION (Physical) 0x05, 0x09, // USAGE_PAGE (Button) 0x19, 0x01, // USAGE_MINIMUM (Button 1) 0x29, 0x08, // USAGE_MAXIMUM (Button 8) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x08, // REPORT_COUNT (8) 0x81, 0x02, // INPUT (Data,Var,Abs) 0xc0, // END_COLLECTION 0xc0 // END_COLLECTION }; //Language code string descriptor const struct { char bLength; char bDscType; unsigned int string[1]; } strd1 = { 4, 0x03, {0x0409} }; //Manufacturer string descriptor const struct{ char bLength; char bDscType; unsigned int string[11]; }strd2={ 24, //sizeof this descriptor string 0x03, {'d','i','e','n','t','u','v','i','e','t','n'} }; //Product string descriptor const struct{ char bLength; char bDscType; unsigned int string[6]; }strd3={ 14, //sizeof this descriptor string 0x03, {'U','S','B','S','W','C'} }; //Array of configuration descriptors const char* USB_config_dsc_ptr[1]; //Array of string descriptors const char* USB_string_dsc_ptr[3]; void USB_Init_Desc(){ USB_config_dsc_ptr[0] = &configDescriptor1; USB_string_dsc_ptr[0] = (const char*)&strd1; USB_string_dsc_ptr[1] = (const char*)&strd2; USB_string_dsc_ptr[2] = (const char*)&strd3; }
const char USB_HID_RPT_SIZE = 45 thành : const char USB_HID_RPT_SIZE = 26 Vì bên dưới có 26 bytes thôi ( Chỗ hid_rpt_desc ... rảnh ngồi mà đếm ). và Report byte in/out cũng sửa 64 thành 1 sẽ đẩy cao tốc độ ( vì bạn truyền có mỗi 1 byte thôi ). --- Và một điều nữa : Trong bảng chữ cái hoặc ký tự trên bàn phím ... giá trị từ 1 đến 8 một số nó chẳng ra cái của khỉ gì đâu. Nên dùng các giá trị từ 4 trở lên sẽ có được các kí tự a, b, c, d ..v.v Lúc đó ta có thể kiểm tra đơn giản bằng cách mở Notepad lên ... bấm phím xem nó có hiện đúng chữ không.
Comment