ãã ããææ°ã®æšæºã¯ãã¹ãŠPCããCOMããŒããé€å€ããŠãããããMKäžã®ãããžã§ã¯ãã«ã¢ã¯ã»ã¹ããã«ã¯USB-UARTã¢ããã¿ãŒã䜿çšããå¿ èŠããããŸãã 圌ã¯åžžã«æå ã«ããããã§ã¯ãããŸããã ãã®ãããªã¢ããã¿ãŒã¯ããã©ã€ããŒã®åé¡ã«ãããåžžã«å®å®ããŠæ©èœãããšã¯éããŸããã ä»ã«ãæ¬ ç¹ããããŸãã
ããããUSBãŸãã¯ã·ãªã¢ã«ããŒãã®äœ¿çšã«ã€ããŠè©±ããã³ã«ãUARTã®è«ççãªã·ã³ãã«ãã奜ã人ãããããããŸãã ãããŠã圌ãã«ã¯ååãªçç±ããããŸãã ãããã代æ¿æ段ããããšããã§ããïŒ
STM32F103ã®äŸã䜿çšããŠãPCãšMKã®éã®ãã±ããããŒã¿äº€æãæŽçããæ¹æ³ãäŒããããã«é·ãéæ±ããããŠããŸããã å®æããäœæ¥ãã©ãããæäŸãããããç§ã®ããŒãºã«åãããæ¹æ³ã説æããŸãã ãããŠãããªãã¯ããªãããããå¿ èŠãšãããã©ãããèªåã§æ±ºããŸãã
USBããŒããŠã§ã¢ãµããŒããçµã¿èŸŒãŸããææ°ã®äœã³ã¹ããã€ã¯ãã³ã³ãããŒã©ãŒSTM32F103C8ãæèŒããããŒãããããŸãã
ç§ã¯ã ã·ãªã¢ã«ããŒãã«ã¯ä»ã®æ¬ ç¹ããããšèšã£ãïŒ
-å€ãã®å ŽåãCOMããŒãã¯PCãŸãã¯ã©ãããããã§ã¯äœ¿çšã§ããŸãã
-ããã€ã¹ã¯åå¥ã«é»æºãå ¥ããå¿ èŠããããŸã
-PCã«COMããŒããããå Žåã§ããä¿¡å·ã¬ãã«ã調æŽããå¿ èŠããããŸãïŒPCã¯ãå·®åä¿¡å·ã¬ãã«+ 15Vããã³-15Vã®RS232ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšãããã€ã¯ãã³ã³ãããŒã©ãŒã¯TTLã¬ãã«ïŒ+ 5Vã+ 3.3VããŠãããŒã©ïŒã䜿çšããŸãã
-å€ãã®å Žåãã·ã¹ãã ã«ã¯å€æ°ã®ä»®æ³COMããŒãã圢æãããããã€ã¹ã«äžèŽããããŒããèŠã€ããã®ã¯ç°¡åã§ã¯ãªãå ŽåããããŸãã
åæ§ã«ã USBã¯é·å¹Žã«ããã£ãŠäœ¿çšãããŠããŠããããã®å©ç¹ããããŸãã
-HOSTããã€ã¹ããé»åãäŸçµŠããæ©èœ
-䟿å©ãªããã±ãŒãžäº€æã®å®è£
-è€æ°ã®ããã°ã©ã ã䜿çšããŠããã€ã¹ã«åæã«æ¥ç¶ããæ©èœ
-æ¥ç¶ãããããã€ã¹ãäžæã«èå¥ããæ©èœ
-å€ãã®ææ°ã®MKã§ã®ããŒããŠã§ã¢ãµããŒãã«ãããã¢ããã¿ãŒãäžèŠ
USBã®æ©èœã¯éåžžã«è±å¯ã§ãããããã«ããåé¡ãçºçããŸããã·ãªã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ã®å Žåã»ã©ç解ã容æã§ã¯ãããŸããã ããã€ã¹ã«ã¯å¥ã®ã¯ã©ã¹ããããŸã-USB-HIDã¯ããã©ã€ããŒã®ã€ã³ã¹ããŒã«ãå¿ èŠãšãããç¹ã«äººéãããŸããŸãªå ¥åºåããã€ã¹ãšã®å¯Ÿè©±çšã«èšèšãããŠããŸãã MKãšã®ããŒã¿äº€æã®æŽçã«æé©ã§ãã å人çã«ã¯ããããå ±æã奜ãã§ãã ããã¯äŸ¿å©ãªæœè±¡åã§ãã ããã«ãåçŽãªãã€ãã¹ããªãŒã ãæäœãããããããããã¡ãã»ãŒãžãéã¢ã»ã³ãã«ããæ¹ãå€å°ç°¡åã§äŸ¿å©ã§ãã
HIDãããã¡ã€ã«ã®éžæ
USB-HIDã¯ããªãåºç¯ãªã¯ã©ã¹ã®ããã€ã¹ã§ãããããæåã«äœæããããã€ã¹ãéžæããå¿ èŠããããŸãã
ããŒããŒããããŠã¹ããžã§ã€ã¹ãã£ãã¯ããã®ä»ã®å ¥åããã€ã¹ã®ãšãã¥ã¬ãŒã·ã§ã³ãäœæã§ããŸããæšæºã®ããªãå³æ Œãªãã¬ãŒã ã¯ãŒã¯ã«äŸåãããPCãšèªç±ã«ããŒã¿ã亀æã§ããããã«ãç¬èªã®ããã€ã¹ãäœæã§ããŸãã
ã«ã¹ã¿ã HIDããã€ã¹ã®äœææ¹æ³ã説æããŸãã ããã«ãããæ倧éã®èªç±ãäžããããŸãã èšäºãåŒãåºããªãããã«ãã§ããã ãç°¡æœã«äŒããããšæããŸã-ãããã¯ãŒã¯äžã«æšæºã®èª¬æããããããããç§ãããŸããããå人çã«ã¯ç¹å®ã®åé¡ã解決ããå¿ èŠããããšãã«å°ãå©ããŠãããŸããã
ãããžã§ã¯ãæ§é
STM32ã§ã®éçºã«ã¯EmBlocksã䜿çšããŠããŸãã ä»»æã®äŸ¿å©ãªç°å¢ã䜿çšã§ããŸããããããžã§ã¯ãã®é©å¿ã¯ããã»ã©é£ãããããŸããã
以äžã¯ããããžã§ã¯ãã®åºæ¬æ§é ã«è¿œå ãããŸãã
- STM32F10xãSTM32L1xxãããã³STM32F3xx USB-FS-Device Driverã©ã€ãã©ãªããŒãžã§ã³4.0.0ãå«ãUSB-FSãã©ã«ã㌠ã
- Incããã³Srcãã©ã«ããŒã§ã¯ããã¡ã€ã«ïŒ
platform_config.h-ç¹å®ã®ããŒãããã³MKãã¡ããªã®å®çŸ©ã¯æ¬¡ã®ãšããã§ã
stm32_it.hãstm32_it.c-å²ã蟌ã¿ãã³ãã©ãŒã¯ããã§å®çŸ©ãããŸã
usb_conf.hãusb_endp.c-ãšã³ããã€ã³ãïŒãšã³ããã€ã³ãïŒããããã¡ãŒã®ãµã€ãºãšã¢ãã¬ã¹ããã³ãã©ãŒé¢æ°ãå®çŸ©ããŸã
usb_desc.hãusb_desc.c-ããã€ã¹èªäœã«é¢ããæ å ±ã¯ããã§åéãããŸã-PCãžã®æ¥ç¶æã«ã©ã®ããã«æ±ºå®ãããããŒã¿ãã±ããã®ãµã€ãºãšãã©ãŒãããã決å®ãããŸã
hw_config.c -PCãžã®ããŒã¿éä¿¡ã«é¢ãããã¹ãŠã®äœæ¥ãããã«åéãããŸã
hw_config.hãusb_istr.hãusb_prop.hãusb_pwr.h
usb_istr.cãusb_prop.cãusb_pwr.c -USB-FSã©ã€ãã©ãªãæ©èœããããã«å¿ èŠã§ããããããã«ç»ãå¿ èŠã¯ãããŸãã
USBã䜿çšããŠããããã®ãã¡ã€ã«ããã¹ãŠãããžã§ã¯ãã«è¿œå ããŸãã
USBã®åæå
USBã¢ãžã¥ãŒã«ãæ£ããåäœãããã«ã¯ãMKã®åšæ³¢æ°ãéèŠã§ãã ãã¹ãŠã®åšæ³¢æ°ã§USBã¯ããã¯ãæ£ããèšå®ã§ããããã§ã¯ãããŸããã ãã®äŸã§ã¯ã8 MHzã®æ°Žæ¶çºæ¯åšã䜿çšãããMKã¯72 MHzã®åšæ³¢æ°ã§åäœããUSBã¢ãžã¥ãŒã«ã¯48 MHzã§åäœããŸãã
main.cã«ãæ°è¡ã®ã³ãŒããå«ããã ãã§ã
main.c
/* Includes ------------------------------------------------------------------*/ #include "hw_config.h" #include "usb_lib.h" #include "usb_pwr.h" /* Private variables ---------------------------------------------------------*/ __IO uint8_t PrevXferComplete = 1; int main(void) { Set_System(); USB_Interrupts_Config(); Set_USBClock(); USB_Init(); while (1) { if (bDeviceState == CONFIGURED) { if (PrevXferComplete) { RHIDCheckState(); } } } }
Set_SystemïŒïŒé¢æ°ã§ã¯ãD +ã©ã€ã³ã®é»æºãžã®ãã«ã¢ããã®ãã³ã¯ãããã°ã©ã ã§PCããããã€ã¹ãæ¥ç¶/åæããããã«æ§æããïŒããŒãã§ã¯äœ¿çšãããŸããïŒãå²ã蟌ã¿ãæ§æããããã¢ãããžã§ã¯ãã®LEDãšãã¿ã³ãåæåãããŸãã
USB_Interrupts_ConfigïŒïŒã§ã¯ ãMKãã¡ããªã«å¿ããŠå²ã蟌ã¿ãæ§æãããŸãïŒF10xãF37xãL1xããµããŒããããŸãïŒã
USB_InitïŒïŒé¢æ°ã¯ãUSBã¢ãžã¥ãŒã«ãèµ·åããŸãã ãããã°ã®ããã«USBã®äœæ¥ãäžæçã«ç¡å¹ã«ããå¿ èŠãããå Žåã¯ããã®è¡ãã³ã¡ã³ãã¢ãŠãããŠãã ããã
次ã«ãç¡éã«ãŒãã§ãPCã«æ¥ç¶ãããšãã«USBã¢ãžã¥ãŒã«ãæ§æã§ãããã©ããã確èªããŸãã ãã¹ãŠãæ£åžžã«æ©èœããããã€ã¹ãæ£åžžã«æ¥ç¶ãããå ŽåãPCã®é»æºãå ¥ããçé»åã¢ãŒãã§ã¯ãªãå Žåãç¶æ ã¯CONFIGUREDã«ãªããŸãã
次ã«ãPCãžã®ä»¥åã®ããŒã¿è»¢éãå®äºãããã©ããã確èªããå®äºããå Žåã¯ã RHIDCheckStateïŒïŒé¢æ°ã§éä¿¡ããããã«æ°ãããã±ãããæºåããŸã
ãã±ãããµã€ãºãšéä¿¡é »åºŠ
USB-HIDããã€ã¹ã¯è»¢éèªäœãéå§ã§ããŸããã ãã¹ã¯ããã¹ãããã€ã¹ïŒPCïŒã«ãã£ãŠèª¿æŽãããŸãã ãã®ãããããã€ã¹ã®USBèšè¿°åãæºåãããšãã«ãããã€ã¹ã«åãåãããå¿ èŠãããé »åºŠãèšè¿°ããŸãã ä»æ§ã«ããã°ãæ倧ããŒãªã³ã°åšæ³¢æ°ã¯1 kHzã§ãäžåºŠã«éä¿¡ããããã±ããã®æ倧ãµã€ãºã¯64ãã€ãã§ãã ããã§ååã§ãªãå Žåã¯ãUSBãã«ã¯ãªã©ã®ä»ã®æäœã¢ãŒãã䜿çšããå¿ èŠããããŸããããã©ã€ããŒãªãã§ã¯å®è¡ã§ããŸããã
3ã€ã®ãã³ãã«ã¯ãPCãšã®å¯Ÿè©±ãã»ããã¢ãããã圹å²ãæãããŸãã
ããã€ã¹èšè¿°å
/* USB Standard Device Descriptor */ const uint8_t RHID_DeviceDescriptor[RHID_SIZ_DEVICE_DESC] = { RHID_SIZ_DEVICE_DESC, // USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType - , . - Device descriptor 0x00, 0x02, // bcdUSB - USB . 2.0 // , , USB. , 0x00, //bDeviceClass 0x00, //bDeviceSubClass 0x00, //bDeviceProtocol 0x40, //bMaxPacketSize - Endpoint 0 ( ) // VID PID, , . 0x83, 0x04, //idVendor (0x0483) 0x11, 0x57, //idProduct (0x5711) DEVICE_VER_L, DEVICE_VER_H, // bcdDevice rel. DEVICE_VER_H.DEVICE_VER_L // , , . // // VID/PID . 1, //Index of string descriptor describing manufacturer 2, //Index of string descriptor describing product 3, //Index of string descriptor describing the device serial number 0x01 // bNumConfigurations - . . } ; /* CustomHID_DeviceDescriptor */
ã³ã¡ã³ãã¯ãã¹ãŠéæã§ãã DEVICE_VER_LãDEVICE_VER_Hã«æ³šæããŠãã ããããããã¯usb_desc.hã®å®æ°ã§ãããããã€ã¹ã®ããŒãžã§ã³ãèå¥ããããã«å€æŽã§ããŸãã
æ§æèšè¿°åïŒããã€ã¹ã®æ©èœã«ã€ããŠèª¬æïŒ
/* USB Configuration Descriptor */ /* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ const uint8_t RHID_ConfigDescriptor[RHID_SIZ_CONFIG_DESC] = { 0x09, // bLength: USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType: - RHID_SIZ_CONFIG_DESC, 0x00, // wTotalLength: 0x01, // bNumInterfaces: 0x01, // bConfigurationValue: 0x00, // iConfiguration: , 0xE0, // bmAttributes: , USB 0x32, // MaxPower 100 mA: 100 /************** ****************/ 0x09, // bLength: USB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType: - 0x00, // bInterfaceNumber: - 0 0x00, // bAlternateSetting: , 0x02, // bNumEndpoints - . 0x03, // bInterfaceClass: - HID // , , // HID- 0x00, // bInterfaceSubClass : . 0x00, // nInterfaceProtocol : 0, // iInterface: , // , - HID /******************** HID ********************/ 0x09, // bLength: HID- HID_DESCRIPTOR_TYPE, // bDescriptorType: - HID 0x01, 0x01, // bcdHID: HID 1.1 0x00, // bCountryCode: ( ) 0x01, // bNumDescriptors: report HID_REPORT_DESCRIPTOR_TYPE, // bDescriptorType: - report RHID_SIZ_REPORT_DESC, 0x00, // wItemLength: report- /******************** (endpoints) ********************/ 0x07, // bLength: USB_ENDPOINT_DESCRIPTOR_TYPE, // - endpoints 0x81, // bEndpointAddress: 1(IN) 0x03, // bmAttributes: - Interrupt endpoint wMaxPacketSize, 0x00, // wMaxPacketSize: Bytes max 0x20, // bInterval: Polling Interval (32 ms) 0x07, /* bLength: Endpoint Descriptor size */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ /* Endpoint descriptor type */ 0x01, /* bEndpointAddress: */ /* Endpoint Address (OUT) */ 0x03, /* bmAttributes: Interrupt endpoint */ wMaxPacketSize, /* wMaxPacketSize: Bytes max */ 0x00, 0x20, /* bInterval: Polling Interval (32 ms) */ } ; /* RHID_ConfigDescriptor */
ããã§ã¯ãwMaxPacketSizeå®æ°ã«æ³šæãã䟡å€ããããŸããããã¯ãPCãšäº€æããæ倧ãã±ãããµã€ãºã決å®ããŸãã ãããžã§ã¯ãã¯ãå€æŽããããšãããã¡ã®ãµã€ãºãå€æŽãããããã«æ§æãããŠããŸãã ãã ããæšæºã§0x40ãè¶ ããå€ãæå®ããªãã§ãã ããã ãã®å®æ°ã«æ³šæããŠãã ãã-éä¿¡ããããã±ããã®ãµã€ãºãç°ãªãå Žåãåé¡ãçºçããŸãïŒ
ã³ã¡ã³ãbIntervalã®æ¬¡ã®å®æ°ã¯ãããªç§åäœã®ããã€ã¹ã®ããŒãªã³ã°æéã§ãã ããã€ã¹ã«ã¯32msãèšå®ãããŠããŸãã
ã¬ããŒããã³ãã«ïŒãããã³ã«ã®èª¬æïŒ
const uint8_t RHID_ReportDescriptor[RHID_SIZ_REPORT_DESC] = { 0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop) 0x09, 0x01, // USAGE (Vendor Usage 1) 0xa1, 0x01, // COLLECTION (Application) 0x85, 0x01, // REPORT_ID (1) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x01, // REPORT_COUNT (1) 0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) 0x85, 0x01, // REPORT_ID (1) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 0x85, 0x02, // REPORT_ID (2) 0x09, 0x02, // USAGE (Vendor Usage 2) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x01, // REPORT_COUNT (1) 0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) 0x85, 0x02, // REPORT_ID (2) 0x09, 0x02, // USAGE (Vendor Usage 2) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 0x85, 0x03, // REPORT_ID (3) 0x09, 0x03, // USAGE (Vendor Usage 3) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8) 0x95, RPT3_COUNT, // REPORT_COUNT (N) 0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) 0x85, 0x03, // REPORT_ID (3) 0x09, 0x03, // USAGE (Vendor Usage 3) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 0x85, 0x04, // REPORT_ID (4) 0x09, 0x04, // USAGE (Vendor Usage 4) 0x75, 0x08, // REPORT_SIZE (8) 0x95, RPT4_COUNT, // REPORT_COUNT (N) 0x81, 0x82, // INPUT (Data,Var,Abs,Vol) 0xc0 // END_COLLECTION }
ããã¯æãéèŠãªèšè¿°åã§ã-éä¿¡ãããã³ã«ãšããã€ã¹ã®æ©èœã説æããŸãã ãã®åœ¢æã¯ç°¡åãªäœæ¥ã§ã¯ãããŸããã èšè¿°åãäœæãããšãã«ééããå Žåãããã€ã¹ã¯åäœãåæ¢ããŸãã èšè¿°åã®åœ¢åŒã¯éåžžã«é£ããã§ãã ç¹å¥ãªHIDèšè¿°åããŒã«ãŠãŒãã£ãªãã£ããããŸãã ãŸãããããžã§ã¯ãã®ã«ãŒãã«ã¯ããã®ãŠãŒãã£ãªãã£ã§ç·šéããããã®äžèšã®èšè¿°åãæã€ãã¡ã€ã«ãRHID.hidãããããŸãã ããããããªããäœãããŠããã®ãç解ããŠããªãå Žåã¯ãé¢äžããªãæ¹ãè¯ãã§ãã
ç°¡åã«ããããã«ã2ã€ã®å®æ°ãäœæããŸããã
RPT3_COUNT -MKã«ãã±ãããéä¿¡ããããã®ãã€ãåäœã®åºåãããã¡ãŒãµã€ãºïŒäŸã§ã¯1ãã€ãïŒ
RPT4_COUNT-ãã±ãããPCã«è»¢éããããã®ãã€ãåäœã®INPUTãããã¡ãŒã®ãµã€ãºïŒäŸã§ã¯4ãã€ãïŒ
ãããã®ãããã¡ã®ãµã€ãºã¯wMaxPacketSizeãè¶ ããŠã¯ãªããŸããã å°ãªãããšãå¯èœã§ãã
ãšããã§ãReportDescriptorãæžãæããŠãæ§æèšè¿°åå ã®ããã€ã¹ã®ã¯ã©ã¹ãšãµãã¯ã©ã¹ãå€æŽããã ãã§ãã«ã¹ã¿ã HIDãå¥ã®HIDããã€ã¹ïŒããŒããŒãããžã§ã€ã¹ãã£ãã¯ãªã©ïŒã«å€ããããšãã§ããŸãã
ã¬ããŒããšã¯ïŒ
ãã¹ãïŒPCïŒãšããã€ã¹ïŒMKïŒã¯ãå®çŸ©æžã¿ã®æ§é ã®ããŒã¿ãã±ããã亀æããŸã-ã¬ããŒãã å€ãã®ããã±ãŒãžãååšããå¯èœæ§ããããŸããããšãã°ãããã€ã¹å ã®ããã€ãã®ã€ãã³ãã«é¢ããããŒã¿ãå«ãããã±ãŒãžãPCããèŠæ±ãããããŒã¿ãå«ãããã±ãŒãžãMKã®ã³ãã³ããå«ãããã±ãŒãžãªã©ãããããæ©äŒã«æäŸã§ããŸãã ããªãã欲ãããã®ã ãã ãããã¹ãŠã®ããã±ãŒãžã®æ§é ã¯RHID_ReportDescriptorã®æ§é ã§èšè¿°ãããå¿ èŠããããŸãã
PCãšMKã¯ããã±ããã®æåã®ãã€ãã§ããIDã«ãã£ãŠã¬ããŒããåºå¥ããŸãã
ãã®äŸã§ã¯ã4çš®é¡ã®ã¬ããŒãããããŸãã
- REPORT_ID = 1ããã³2-LED1 / LED2ããªã³/ãªãããMKã³ãã³ãã ç®çã®LEDç¶æ ã®1ããããã£ãŒã«ããå«ãŸããŠãããSET_REPORTã¡ãœãããšSET_FEATUREã¡ãœããã®äž¡æ¹ã«ããéä¿¡ããµããŒãããŠããŸãïŒè©³çŽ°ã¯åŸè¿°ïŒã
- REPORT_ID = 3-1ãã€ããMKã«è»¢éããŸãã MKããŒã¿ãéä¿¡ããæ¹æ³ã瀺ãã ãã§ãã ã¹ã©ã€ããŒã®äœçœ®ãæž¡ããŸãã
- REPORT_ID = 4ã¯ãPCããŒã¿ã転éããããã®ã¬ããŒãã§ãã LEDããã¿ã³ïŒååšããå ŽåïŒã®çŸåšã®ç¶æ ã«é¢ããæ å ±ãè¿ããID = 3ãã€ãã®ã¬ããŒãã§éä¿¡ãããããŒã¿ãè¿ããããŒã¿ãåä¿¡ãããããšã瀺ããŸãã
ã¬ããŒãèšè¿°åãäœæããæ¹æ³ãå®å šã«ç解ããŠããªãå Žåã¯ãRPT3_COUNTããã³RPT4_COUNTå®æ°ãå€æŽããïŒPCã®èŠ³ç¹ããïŒçºä¿¡ããã³çä¿¡ãã±ããã®ãµã€ãºãèšå®ããŸãã æ®ãã®ã¬ããŒãã¯åçŽã«å€æŽããããšã¯ã§ãããå·ã€ãããšã¯ãããŸããã æåã®ãã€ãã¯ã¬ããŒãIDã§ãªããã°ãªããªãããšã«æ³šæããŠãã ããã
亀æãµã€ã¯ã«
ãã®ãããPIDãVIDãããŒãžã§ã³çªå·ãèšå®ããŠããã€ã¹ãæ§æããçä¿¡ãã±ãããšçºä¿¡ãã±ããã®ãµã€ãºãæ§æããæºåãã§ããŸããã
æ§æèšè¿°åã§èŠæ±ããããã«ã32msããšã«ãã¹ããããŒãªã³ã°ããRHIDCheckStateé¢æ°ã§ãã§ãã¯ããŸã-éä¿¡ãããã®ãããå Žåããã¹ãã®ããŒã¿ãã±ããã圢æããŸãã
RHIDCheckState-ããŒã¿éä¿¡æ©èœ
/******************************************************************************* * Function Name : RHIDCheckState. * Description : Decodes the RHID state. * Input : None. * Output : None. * Return value : The state value. *******************************************************************************/ uint16_t btn1_prev, btn2_prev; uint8_t Buffer[RPT4_COUNT+1]; uint8_t RHIDCheckState(void) { uint16_t btn1=0, btn2=0; btn1 = GPIO_ReadInputDataBit(BTN1_PORT, BTN1_PIN); btn2 = GPIO_ReadInputDataBit(BTN2_PORT, BTN2_PIN); Buffer[0] = 4; Buffer[1] = btn1; Buffer[2] = btn2; Buffer[3] = (GPIO_ReadInputDataBit(LED_PORT, LED1_PIN) | GPIO_ReadInputDataBit(LED_PORT, LED2_PIN)<<1); /* Reset the control token to inform upper layer that a transfer is ongoing */ PrevXferComplete = 0; /* Copy buffer date info in ENDP1 Tx Packet Memory Area*/ USB_SIL_Write(EP1_IN, Buffer, RPT4_COUNT+1); /* Enable endpoint for transmission */ SetEPTxValid(ENDP1); return (btn1 | btn2<<1); }
uint8_tãããã¡ãŒ[RPT4_COUNT + 1]é åã¯ãçä¿¡ïŒåžžã«ãã¹ãã®èŠ³ç¹ããèæ ®ïŒãã±ãã+ãã€ãIDã®ãã€ããŒãã®ãµã€ãºãšããŠå®çŸ©ãããŸãã ããã¯éèŠã§ã-ãããã¡ãµã€ãºãç°ãªãå Žå-åé¡ããããŸãã ãããã£ãŠããããã¡ãµã€ãºãå€æŽããã«ã¯ãusb_desc.hã®å®æ°å€ãç·šéããŸãã
é¢æ°ã§ã¯ãããã±ãŒãžã«ããŒã¿ãåéããããŒã¿ãéä¿¡ãããŠããããšã瀺ããã©ã°PrevXferComplete = 0ãèšå®ããUSB_SIL_Writeããã³SetEPTxValidã©ã€ãã©ãªé¢æ°ãåŒã³åºããŠãã¹ãã«ããŒã¿ãéä¿¡ããŸãã
以äžã§ããã¹ããžã®ããŒã¿è»¢éã¯çµäºããŸããã
ããŒã¿ã®åä¿¡ã¯ããå°ãè€éã§ããããŒã¿ãããã€ã¹ã«éä¿¡ããæ¹æ³ã¯2ã€ãããŸãã1ã€ã¯ãã¬ããŒãèšè¿°åã«èšè¿°ãããŠããããã€ã¹ã®æ©èœãã SET_FEAUTREé¢æ°ãä»ããŠå¯Ÿå¿ãããã©ã¡ãŒã¿ãŒãšãšãã«äœ¿çšããæ¹æ³ã§ãã ããã¯ãäžé£ã®é¢æ°ã䜿çšããŠããã€ã¹ãçŸããå¶åŸ¡ããããã®æœè±¡åã§ããããã€ãã¹ããªãŒã ãéä¿¡ããã ãã§ãªããæå³ã®ããé¢æ°ãåŒã³åºãããšãã§ããŸãã
2çªç®ã®æ¹æ³ã¯ãããã€ã¹ããã¡ã€ã«ãšããŠæäœããããšã§ããããã±ãŒãžããã¡ã€ã«ãšããŠããã€ã¹ã«æžã蟌ãã ãã§ãã ãã®ã¡ãœããã¯SET_REPORTãšåŒã°ããŸã ã å®éãåäœã¯å°ãé ããªããŸãã
ã¬ããŒãèšè¿°åã§ãã¹ãã«äŒããããã«ãããã€ã¹ã¯äž¡æ¹ã®æ¹æ³ããµããŒãããŠããŸãã
SET_FEATUREã®åŠç
SET_FEAUTREã¡ãœããã«ãã£ãŠéä¿¡ãããããŒã¿ã¯ãusb_prop.cã§åŠçãããŸã
é¢æ°HID_Status_In
/******************************************************************************* * Function Name : HID_Status_In. * Description : HID status IN routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void HID_Status_In(void) { BitAction Led_State; if (Report_Buf[1] == 0) { Led_State = Bit_RESET; } else { Led_State = Bit_SET; } switch (Report_Buf[0]) { case 1: /* Led 1 */ if (Led_State != Bit_RESET) { GPIO_SetBits(LED_PORT,LED1_PIN); } else { GPIO_ResetBits(LED_PORT,LED1_PIN); } break; case 2: /* Led 2 */ if (Led_State != Bit_RESET) { GPIO_SetBits(LED_PORT,LED2_PIN); } else { GPIO_ResetBits(LED_PORT,LED2_PIN); } break; case 3: /* Led 1&2 */ Buffer[4]=Report_Buf[1]; break; } }
ããã§ãã¬ããŒãã®æåã®ãã€ãã確èªããããã«å¿ããŠãã±ããã®æ®ããåŠçããŸã-LEDãå¶åŸ¡ãããããã¹ãããéä¿¡ããããã€ãããã±ããã«å ¥ããŠãåŸã§RHIDCheckStateé¢æ°ã«éãè¿ãããã«ãã±ããã«å ¥ããŸãã
Report_Bufã§ã¯ããã¹ããéä¿¡ãããã¹ãŠã®ãã±ãããåãŸãããã«ãwMaxPacketSizeãã€ããäºçŽãããŠããŸãã
SET_REPORTã¡ãœããã«ãã£ãŠéä¿¡ãããããŒã¿ã¯ãusb_endp.cã§åŠçãããŸã
é¢æ°EP1_OUT_Callback
/******************************************************************************* * Function Name : EP1_OUT_Callback. * Description : EP1 OUT Callback Routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void EP1_OUT_Callback(void) { BitAction Led_State; /* Read received data (2 bytes) */ USB_SIL_Read(EP1_OUT, Receive_Buffer); if (Receive_Buffer[1] == 0) { Led_State = Bit_RESET; } else { Led_State = Bit_SET; } switch (Receive_Buffer[0]) { case 1: /* Led 1 */ if (Led_State != Bit_RESET) { GPIO_SetBits(LED_PORT,LED1_PIN); } else { GPIO_ResetBits(LED_PORT,LED1_PIN); } break; case 2: /* Led 2 */ if (Led_State != Bit_RESET) { GPIO_SetBits(LED_PORT,LED2_PIN); } else { GPIO_ResetBits(LED_PORT,LED2_PIN); } break; case 3: /* Led 1&2 */ Buffer[4]=Receive_Buffer[1]; break; } SetEPRxStatus(ENDP1, EP_RX_VALID); }
ããã§ã¯ã»ãšãã©åãã§ããUSB_SIL_ReadïŒEP1_OUTãReceive_BufferïŒãåŒã³åºããŠèªåã§ããŒã¿ãååŸããæåŸã«SetEPRxStatusïŒENDP1ãEP_RX_VALIDïŒãåŒã³åºããããšãéç¥ããã ãã§ãã
ããã€ã¹ãæ§æããå¿ èŠãªé »åºŠã§é©åãªãµã€ãºã®ãã±ããã§ããŒã¿ãéåä¿¡ããæ¹æ³ãåŠã³ãŸããã
ãããžã§ã¯ããçµã¿ç«ãŠãŠãããã€ã¹ã«ãã©ãã·ã¥ããŸãã
次ã®ããã«æ©èœããŸãã
ãã®ãããžã§ã¯ãã¯ãST Microelectronicsã®USB HID DemonstratorãŠãŒãã£ãªãã£ãšã®çžäºäœçšããµããŒãããŠããŸãã
[ããã€ã¹æ©èœ]ããŒãžã«ã¯ãã¬ããŒãèšè¿°åã§èª¬æãããŠããæ©èœã衚瀺ãããŸãã
å ¥åºå転éã䜿çšãããšãããã€ã¹ã«æåã§ããŒã¿ãéä¿¡ããããã€ã¹ããã®ãã±ããã確èªã§ããŸãã
ã°ã©ãã£ãã¯ãã¥ãŒã§ã¯ãLEDããã§ãã¯ããã¯ã¹Led 1ãLed 2ã察å¿ããã¬ããŒãIDã®èšå®ãããã³ã¹ã©ã€ããŒã§ã®ãã€ã転éãå¶åŸ¡ã§ããŸãïŒReportID = 3ïŒ
ãŸããã³ã³ãã¥ãŒã¿ãŒãžã®æ¥ç¶ãèªåçã«æ€åºããVIDãšPIDã§ããã€ã¹ãåæããã¹ããŒã¿ã¹ã衚瀺ããå°ããªãã¢ãœãããŠã§ã¢ãäœæããŸããã[èªåæ¥ç¶]ãã§ãã¯ããã¯ã¹ã®æšªã«ããã€ã³ãžã±ãŒã¿ãŒã§æ¥ç¶/åæããŸã
Send usingãªãã·ã§ã³ãã¿ã³ã䜿çšãããšãããã€ã¹ã«ããŒã¿ãéä¿¡ããæ¹æ³ãéžæã§ããŸãã
ReportïŒ ReportIDã§å§ãŸãããã€ã¹ãã€ãããåä¿¡ãããã±ããã衚瀺ããŸãã
äžã®LEDãã¯ãªãã¯ããŠãããã€ã¹ã®LEDãå¶åŸ¡ããŸãã ãããã®ã¹ããŒã¿ã¹ã«ã¯ãããã€ã¹ã®çŸåšã®ã¹ããŒã¿ã¹ã衚瀺ãããŸãã ããã€ã¹ããã®ã¬ããŒãããèªã¿åãããŸãã
ã¹ã©ã€ããŒãåãããŠãID = 3ã®ã¬ããŒããšã¹ã©ã€ããŒã®äœçœ®ã«å¯Ÿå¿ããå€ãéä¿¡ããŸãã ããã€ã¹ã¯ãã¬ããŒãã®4ãã€ãã§ãã®å€ãè¿ããŸãã
ã³ã³ãããã¯ã¹ã«ã¯ãã·ã¹ãã ã§èŠã€ãã£ãHIDããã€ã¹ã衚瀺ãããããã€ã¹ãèŠã€ãã£ãå Žåã¯ãã®ååã衚瀺ãããŸãã
GitHubã§å¿ èŠãªãã®ããã¹ãŠããŠã³ããŒãã§ããŸãã ã®æ§æïŒ
DT -HIDèšè¿°åããŒã«
tstHID-STM32F103-EmBlocksã®ãããžã§ã¯ã
USB HIDãã¢ã³ã¹ãã¬ãŒã¿ãŒ -ST Microelectronicsã®ãŠãŒãã£ãªãã£
HIDSTM32.exe -Delphiã®ãã¢ãœãããŠã§ã¢ã«ã¯åæ§ã®æ©èœããããŸãããæ§æã¯äžèŠã§ã
ã質åãããå Žåã¯ãã³ã¡ã³ããèšå ¥ããŠãã ããã çããããšããŸãã å ±éã®ç解ãåŸãããããã«ãç§ã¯ãšãã»ã³ã¹ãããããã®å°ããªãã®ã«drããããªãããã«ããŸããã æ®ãã¯ãããžã§ã¯ããç 究ããããšã§ãã§ã«ç解ã§ããŸãã ãã ããããã€ã¹ããã°ããäœæããå¿ èŠãããããžã£ã³ã°ã«ã«ç»ãæéããªãå Žå-å¿ èŠãªããšã¯ãã¹ãŠèª¬æããŸããã
PSããã©ã«ãã§ã¯ããã¹ããçé»åã¢ãŒãã«å ¥ããšãããã€ã¹ã¯ã¹ãªãŒãç¶æ ã«ãªããããã€ã¹ãã¹ãªãŒãç¶æ ã®PCã«æ¥ç¶ãããšããã¹ããã¹ãªãŒãç¶æ ã«ãªããŸãã ãããã£ãŠãåã«é»æºãããã€ã¹ã«æ¥ç¶ããããããããªãŒããé»åãäŸçµŠããå Žåãã¹ãªãŒãç¶æ ã®PCã«æ¥ç¶ãããŠãããšä»®å®ãããšæ©èœããŸããïŒæ§æããã±ãŒãžã¯PSUãã確å®ã«å±ããŸããïŒã ã©ã€ãã©ãªãå€æŽããŠãPSUã ããæ¥ç¶ããŠãããã€ã¹ãæ©èœããããã«ããŸããã ãããã£ãŠãããã€ã¹ã¯ãPCã«æ¥ç¶ããŠãããšããšèªåŸçã«åäœããŸãã ïŒãããç解ããã®ã«é·ãæéãããããŸãããïŒ