基于单片机的USB外设CDC实现-单片机usb接口作用

9.1 原理图分析

查看EK-RA6M4的原理图,如下图所示,该开发板上的 J11 提供了 Micro USB0接口。

基于单片机的USB外设CDC实现-单片机usb接口作用

根据原理图可知,USB接口的引脚分别为:

功能 引脚USB USB USB_FS0 VBUS P407

9.2 USB接口配置

首先,在FSP配置中将配置相关管脚为USB外设模式。

基于单片机的USB外设CDC实现-单片机usb接口作用

然后配置使能USB的48MHz时钟。

基于单片机的USB外设CDC实现-单片机usb接口作用

接着选择 Stacks ,点击 “New Stack” -> “Connectivity” -> “USB PCDC(r_usb_pcdc)” 添加 USB CDC 协议栈。

基于单片机的USB外设CDC实现-单片机usb接口作用

接下来设置USB CDC的相关配置,并重新生成代码。

基于单片机的USB外设CDC实现-单片机usb接口作用

基于单片机的USB外设CDC实现-单片机usb接口作用

9.3 源码修改

创建按键操作相关的头文件 src/r_usb_pcdc_descriptor.c ,该文件从瑞萨EK-RA6M4开发板的示例工程 ek_ra6m4\\usb_pcdc\\usb_pcdc_ek_ra6m4_ep 中拷贝过来。

复制/*********************************************************************************************************************** * File Name : r_usb_pcdc_descriptor.c * Description : USB PCDC Descriptor definition. **********************************************************************************************************************/ /*********************************************************************************************************************** * DISCLAIMER * This software is supplied by Renesas Electronics Corporation and is only intended for use with Renesas products. No * other uses are authorized. This software is owned by Renesas Electronics Corporation and is protected under all * applicable laws, including copyright laws. * THIS SOFTWARE IS PROVIDED “AS IS” AND RENESAS MAKES NO WARRANTIES REGARDING * THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. TO THE MAXIMUM * EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES * SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY REASON RELATED TO THIS * SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * Renesas reserves the right, without notice, to make changes to this software and to discontinue the availability of * this software. By using this software, you agree to the additional terms and conditions found by accessing the * following link: * http://www.renesas.com/disclaimer * * Copyright (C) 2020 Renesas Electronics Corporation. All rights reserved. ***********************************************************************************************************************/ /****************************************************************************** Includes <System Includes> , “Project Includes” ******************************************************************************/ #include <r_usb_basic.h> #include <r_usb_basic_api.h> #include “r_usb_basic_cfg.h” /****************************************************************************** Macro definitions ******************************************************************************/ /* bcdUSB */ #define USB_BCDNUM (0x0200U) /* Release Number */ #define USB_RELEASE (0x0200U) /* DCP max packet size */ #define USB_DCPMAXP (64U) /* Configuration number */ #define USB_CONFIGNUM (1U) /* Vendor ID */ #define USB_VENDORID (0x045BU) /* Product ID */ #define USB_PRODUCTID (0x5310U) /* Class-Specific Configuration Descriptors */ #define USB_PCDC_CS_INTERFACE (0x24U) /* bDescriptor SubType in Communications Class Functional Descriptors */ /* Header Functional Descriptor */ #define USB_PCDC_DT_SUBTYPE_HEADER_FUNC (0x00U) /* Call Management Functional Descriptor. */ #define USB_PCDC_DT_SUBTYPE_CALL_MANAGE_FUNC (0x01U) /* Abstract Control Management Functional Descriptor. */ #define USB_PCDC_DT_SUBTYPE_ABSTRACT_CTR_MANAGE_FUNC (0x02U) /* Union Functional Descriptor */ #define USB_PCDC_DT_SUBTYPE_UNION_FUNC (0x06U) /* Communications Class Subclass Codes */ #define USB_PCDC_CLASS_SUBCLASS_CODE_ABS_CTR_MDL (0x02U) /* USB Class Definitions for Communications Devices Specification release number in binary-coded decimal. */ #define USB_PCDC_BCD_CDC (0x0110U) /* Descriptor length */ #define USB_PCDC_QD_LEN (10U) #define USB_PCDC_CD1_LEN (67U) #define STRING_DESCRIPTOR0_LEN (4U) #define STRING_DESCRIPTOR1_LEN (16U) #define STRING_DESCRIPTOR2_LEN (44U) #define STRING_DESCRIPTOR3_LEN (46U) #define STRING_DESCRIPTOR4_LEN (22U) #define STRING_DESCRIPTOR5_LEN (18U) #define STRING_DESCRIPTOR6_LEN (28U) /* Descriptor data Mask */ #define USB_UCHAR_MAX (0xffU) #define USB_W_TOTAL_LENGTH_MASK (256U) #define USB_W_MAX_PACKET_SIZE_MASK (64U) #define USB_PCDC_BCD_CDC_MASK (256U) /****************************************************************************** Private global variables and functions ******************************************************************************/ /****************************************************************************** Exported global variables ******************************************************************************/ /****************************************************************************** Exported global functions (to be accessed by other files) ******************************************************************************/ /* Standard Device Descriptor */ uint8_t g_apl_device[USB_DD_BLENGTH + ( USB_DD_BLENGTH % 2)] = { USB_DD_BLENGTH, /* 0:bLength */ USB_DT_DEVICE, /* 1:bDescriptorType */ (USB_BCDNUM & (uint8_t) USB_UCHAR_MAX), /* 2:bcdUSB_lo */ ((uint8_t) (USB_BCDNUM >> 8) & (uint8_t) USB_UCHAR_MAX), /* 3:bcdUSB_hi */ USB_IFCLS_CDCC, /* 4:bDeviceClass */ 0, /* 5:bDeviceSubClass */ 0, /* 6:bDeviceProtocol */ (uint8_t) USB_DCPMAXP, /* 7:bMAXPacketSize(for DCP) */ (USB_VENDORID & (uint8_t) USB_UCHAR_MAX), /* 8:idVendor_lo */ ((uint8_t) (USB_VENDORID >> 8) & (uint8_t) USB_UCHAR_MAX), /* 9:idVendor_hi */ ((uint16_t) USB_PRODUCTID & (uint8_t) USB_UCHAR_MAX), /* 10:idProduct_lo */ ((uint8_t) (USB_PRODUCTID >> 8) & (uint8_t) USB_UCHAR_MAX), /* 11:idProduct_hi */ (USB_RELEASE & (uint8_t) USB_UCHAR_MAX), /* 12:bcdDevice_lo */ ((uint8_t) (USB_RELEASE >> 8) & (uint8_t) USB_UCHAR_MAX), /* 13:bcdDevice_hi */ 1, /* 14:iManufacturer */ 2, /* 15:iProduct */ 6, /* 16:iSerialNumber */ USB_CONFIGNUM /* 17:bNumConfigurations */ }; /************************************************************ * Device Qualifier Descriptor * ************************************************************/ uint8_t g_apl_qualifier_descriptor[USB_PCDC_QD_LEN + ( USB_PCDC_QD_LEN % 2)] = { USB_PCDC_QD_LEN, /* 0:bLength */ USB_DT_DEVICE_QUALIFIER, /* 1:bDescriptorType */ (USB_BCDNUM & (uint8_t) USB_UCHAR_MAX), /* 2:bcdUSB_lo */ ((uint8_t) (USB_BCDNUM >> 8) & (uint8_t) USB_UCHAR_MAX), /* 3:bcdUSB_hi */ 0, /* 4:bDeviceClass */ 0, /* 5:bDeviceSubClass */ 0, /* 6:bDeviceProtocol */ (uint8_t) USB_DCPMAXP, /* 7:bMAXPacketSize(for DCP) */ USB_CONFIGNUM, /* 8:bNumConfigurations */ 0 /* 9:bReserved */ }; /************************************************************ * Configuration Or Other_Speed_Configuration Descriptor * ************************************************************/ /* For Full-Speed */ uint8_t g_apl_configuration[USB_PCDC_CD1_LEN + ( USB_PCDC_CD1_LEN % 2)] = { USB_CD_BLENGTH, /* 0:bLength */ USB_SOFT_CHANGE, /* 1:bDescriptorType */ USB_PCDC_CD1_LEN % USB_W_TOTAL_LENGTH_MASK, /* 2:wTotalLength(L) */ USB_PCDC_CD1_LEN / USB_W_TOTAL_LENGTH_MASK, /* 3:wTotalLength(H) */ 2, /* 4:bNumInterfaces */ 1, /* 5:bConfigurationValue */ 0, /* 6:iConfiguration */ USB_CF_RESERVED | USB_CF_SELFP, /* 7:bmAttributes */ (10 / 2), /* 8:MAXPower (2mA unit) */ /* Interface Descriptor */ USB_ID_BLENGTH, /* 0:bLength */ USB_DT_INTERFACE, /* 1:bDescriptor */ 0, /* 2:bInterfaceNumber */ 0, /* 3:bAlternateSetting */ 1, /* 4:bNumEndpoints */ USB_IFCLS_CDCC, /* 5:bInterfaceClass */ USB_PCDC_CLASS_SUBCLASS_CODE_ABS_CTR_MDL, /* 6:bInterfaceSubClass */ 1, /* 7:bInterfaceProtocol */ 0, /* 8:iInterface */ /* Communications Class Functional Descriptorss */ 5, /* 0:bLength */ USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */ USB_PCDC_DT_SUBTYPE_HEADER_FUNC, /* 2:bDescriptorSubtype */ USB_PCDC_BCD_CDC % USB_W_TOTAL_LENGTH_MASK, /* 3:bcdCDC_lo */ USB_PCDC_BCD_CDC / USB_W_TOTAL_LENGTH_MASK, /* 4:bcdCDC_hi */ /* Communications Class Functional Descriptorss */ 4, /* 0:bLength */ USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */ USB_PCDC_DT_SUBTYPE_ABSTRACT_CTR_MANAGE_FUNC, /* 2:bDescriptorSubtype */ 2, /* 3:bmCapabilities */ /* Communications Class Functional Descriptorss */ 5, /* 0:bLength */ USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */ USB_PCDC_DT_SUBTYPE_UNION_FUNC, /* 2:bDescriptorSubtype */ 0, /* 3:bMasterInterface */ 1, /* 4:bSlaveInterface0 */ /* Communications Class Functional Descriptorss */ 5, /* 0:bLength */ USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */ USB_PCDC_DT_SUBTYPE_CALL_MANAGE_FUNC, /* 2:bDescriptorSubtype */ /* D1:1-Device can send/receive call management information over a Data Class interface. */ /* D0:1-Device handles call management itself. */ 3, /* 3:bmCapabilities */ 1, /* 4:bDataInterface */ /* Endpoint Descriptor 0 */ 7, /* 0:bLength */ USB_DT_ENDPOINT, /* 1:bDescriptorType */ USB_EP_IN | USB_EP3, /* 2:bEndpointAddress */ USB_EP_INT, /* 3:bmAttribute */ 16, /* 4:wMAXPacketSize_lo */ 0, /* 5:wMAXPacketSize_hi */ 0x10, /* 6:bInterval */ /* Interface Descriptor */ USB_ID_BLENGTH, /* 0:bLength */ USB_DT_INTERFACE, /* 1:bDescriptor */ 1, /* 2:bInterfaceNumber */ 0, /* 3:bAlternateSetting */ 2, /* 4:bNumEndpoints */ USB_IFCLS_CDCD, /* 5:bInterfaceClass */ 0, /* 6:bInterfaceSubClass */ 0, /* 7:bInterfaceProtocol */ 0, /* 8:iInterface */ /* Endpoint Descriptor 0 */ USB_ED_BLENGTH, /* 0:bLength */ USB_DT_ENDPOINT, /* 1:bDescriptorType */ USB_EP_IN | USB_EP1, /* 2:bEndpointAddress */ USB_EP_BULK, /* 3:bmAttribute */ USB_W_MAX_PACKET_SIZE_MASK, /* 4:wMAXPacketSize_lo */ 0, /* 5:wMAXPacketSize_hi */ 0, /* 6:bInterval */ /* Endpoint Descriptor 1 */ USB_ED_BLENGTH, /* 0:bLength */ USB_DT_ENDPOINT, /* 1:bDescriptorType */ USB_EP_OUT | USB_EP2, /* 2:bEndpointAddress */ USB_EP_BULK, /* 3:bmAttribute */ USB_W_MAX_PACKET_SIZE_MASK, /* 4:wMAXPacketSize_lo */ 0, /* 5:wMAXPacketSize_hi */ 0, /* 6:bInterval */ }; /* For High-Speed */ uint8_t g_apl_hs_configuration[USB_PCDC_CD1_LEN + ( USB_PCDC_CD1_LEN % 2)] = { 9, /* 0:bLength */ USB_SOFT_CHANGE, /* 1:bDescriptorType */ USB_PCDC_CD1_LEN % USB_W_TOTAL_LENGTH_MASK, /* 2:wTotalLength(L) */ USB_PCDC_CD1_LEN / USB_W_TOTAL_LENGTH_MASK, /* 3:wTotalLength(H) */ 2, /* 4:bNumInterfaces */ 1, /* 5:bConfigurationValue */ 0, /* 6:iConfiguration */ USB_CF_RESERVED | USB_CF_SELFP, /* 7:bmAttributes */ (10 / 2), /* 8:MAXPower (2mA unit) */ /* Interface Descriptor */ 9, /* 0:bLength */ USB_DT_INTERFACE, /* 1:bDescriptor */ 0, /* 2:bInterfaceNumber */ 0, /* 3:bAlternateSetting */ 1, /* 4:bNumEndpoints */ USB_IFCLS_CDCC, /* 5:bInterfaceClass */ USB_PCDC_CLASS_SUBCLASS_CODE_ABS_CTR_MDL, /* 6:bInterfaceSubClass */ 1, /* 7:bInterfaceProtocol */ 0, /* 8:iInterface */ /* Communications Class Functional Descriptorss */ 5, /* 0:bLength */ USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */ USB_PCDC_DT_SUBTYPE_HEADER_FUNC, /* 2:bDescriptorSubtype */ USB_PCDC_BCD_CDC % USB_PCDC_BCD_CDC_MASK, /* 3:bcdCDC_lo */ USB_PCDC_BCD_CDC / USB_PCDC_BCD_CDC_MASK, /* 4:bcdCDC_hi */ /* Communications Class Functional Descriptorss */ 4, /* 0:bLength */ USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */ USB_PCDC_DT_SUBTYPE_ABSTRACT_CTR_MANAGE_FUNC, /* 2:bDescriptorSubtype */ 2, /* 3:bmCapabilities */ /* Communications Class Functional Descriptorss */ 5, /* 0:bLength */ USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */ USB_PCDC_DT_SUBTYPE_UNION_FUNC, /* 2:bDescriptorSubtype */ 0, /* 3:bMasterInterface */ 1, /* 4:bSlaveInterface0 */ /* Communications Class Functional Descriptorss */ 5, /* 0:bLength */ USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */ USB_PCDC_DT_SUBTYPE_CALL_MANAGE_FUNC, /* 2:bDescriptorSubtype */ /* D1:1-Device can send/receive call management information over a Data Class interface. */ /* D0:1-Device handles call management itself. */ 3, /* 3:bmCapabilities */ 1, /* 4:bDataInterface */ /* Endpoint Descriptor 0 */ 7, /* 0:bLength */ USB_DT_ENDPOINT, /* 1:bDescriptorType */ USB_EP_IN | USB_EP3, /* 2:bEndpointAddress */ USB_EP_INT, /* 3:bmAttribute */ 16, /* 4:wMAXPacketSize_lo */ 0, /* 5:wMAXPacketSize_hi */ 0x10, /* 6:bInterval */ /* Interface Descriptor */ 9, /* 0:bLength */ USB_DT_INTERFACE, /* 1:bDescriptor */ 1, /* 2:bInterfaceNumber */ 0, /* 3:bAlternateSetting */ 2, /* 4:bNumEndpoints */ USB_IFCLS_CDCD, /* 5:bInterfaceClass */ 0, /* 6:bInterfaceSubClass */ 0, /* 7:bInterfaceProtocol */ 0, /* 8:iInterface */ /* Endpoint Descriptor 0 */ 7, /* 0:bLength */ USB_DT_ENDPOINT, /* 1:bDescriptorType */ USB_EP_IN | USB_EP1, /* 2:bEndpointAddress */ USB_EP_BULK, /* 3:bmAttribute */ 0, /* 4:wMAXPacketSize_lo */ 2, /* 5:wMAXPacketSize_hi */ 0, /* 6:bInterval */ /* Endpoint Descriptor 1 */ 7, /* 0:bLength */ USB_DT_ENDPOINT, /* 1:bDescriptorType */ USB_EP_OUT | USB_EP2, /* 2:bEndpointAddress */ USB_EP_BULK, /* 3:bmAttribute */ 0, /* 4:wMAXPacketSize_lo */ 2, /* 5:wMAXPacketSize_hi */ 0, /* 6:bInterval */ }; /************************************* * String Descriptor * *************************************/ /* UNICODE 0x0409 English (United States) */ uint8_t g_cdc_string_descriptor0[STRING_DESCRIPTOR0_LEN + ( STRING_DESCRIPTOR0_LEN % 2)] = { STRING_DESCRIPTOR0_LEN, /* 0:bLength */ USB_DT_STRING, /* 1:bDescriptorType */ 0x09, 0x04 /* 2:wLANGID[0] */ }; /* iManufacturer */ uint8_t g_cdc_string_descriptor1[STRING_DESCRIPTOR1_LEN + ( STRING_DESCRIPTOR1_LEN % 2)] = { STRING_DESCRIPTOR1_LEN, /* 0:bLength */ USB_DT_STRING, /* 1:bDescriptorType */ R, 0x00, /* 2:wLANGID[0] */ E, 0x00, N, 0x00, E, 0x00, S, 0x00, A, 0x00, S, 0x00, }; /* iProduct */ uint8_t g_cdc_string_descriptor2[STRING_DESCRIPTOR2_LEN + ( STRING_DESCRIPTOR2_LEN % 2)] = { STRING_DESCRIPTOR2_LEN, /* 0:bLength */ USB_DT_STRING, /* 1:bDescriptorType */ C, 0x00, D, 0x00, C, 0x00, , 0x00, U, 0x00, S, 0x00, B, 0x00, , 0x00, D, 0x00, e, 0x00, m, 0x00, o, 0x00, n, 0x00, s, 0x00, t, 0x00, r, 0x00, a, 0x00, t, 0x00, i, 0x00, o, 0x00, n, 0x00, }; /* iInterface */ uint8_t g_cdc_string_descriptor3[STRING_DESCRIPTOR3_LEN + ( STRING_DESCRIPTOR3_LEN % 2)] = { STRING_DESCRIPTOR3_LEN, /* 0:bLength */ USB_DT_STRING, /* 1:bDescriptorType */ C, 0x00, o, 0x00, m, 0x00, m, 0x00, u, 0x00, n, 0x00, i, 0x00, c, 0x00, a, 0x00, t, 0x00, i, 0x00, o, 0x00, n, 0x00, s, 0x00, , 0x00, D, 0x00, e, 0x00, v, 0x00, i, 0x00, c, 0x00, e, 0x00, s, 0x00 }; /* iConfiguration */ uint8_t g_cdc_string_descriptor4[STRING_DESCRIPTOR4_LEN + ( STRING_DESCRIPTOR4_LEN % 2)] = { STRING_DESCRIPTOR4_LEN, /* 0:bLength */ USB_DT_STRING, /* 1:bDescriptorType */ F, 0x00, /* 2:wLANGID[0] */ u, 0x00, l, 0x00, l, 0x00, -, 0x00, S, 0x00, p, 0x00, e, 0x00, e, 0x00, d, 0x00 }; /* iConfiguration */ uint8_t g_cdc_string_descriptor5[STRING_DESCRIPTOR5_LEN + ( STRING_DESCRIPTOR5_LEN % 2)] = { STRING_DESCRIPTOR5_LEN, /* 0:bLength */ USB_DT_STRING, /* 1:bDescriptorType */ H, 0x00, /* 2:wLANGID[0] */ i, 0x00, -, 0x00, S, 0x00, p, 0x00, e, 0x00, e, 0x00, d, 0x00 }; /* iSerialNumber */ uint8_t g_cdc_string_descriptor6[STRING_DESCRIPTOR6_LEN + ( STRING_DESCRIPTOR6_LEN % 2)] = { STRING_DESCRIPTOR6_LEN, /* 0:bLength */ USB_DT_STRING, /* 1:bDescriptorType */ 0, 0x00, /* 2:wLANGID[0] */ 0, 0x00, 0, 0x00, 0, 0x00, 0, 0x00, 0, 0x00, 0, 0x00, 0, 0x00, 0, 0x00, 0, 0x00, 0, 0x00, 0, 0x00, 1, 0x00, }; uint8_t *g_apl_string_table[] = { g_cdc_string_descriptor0, g_cdc_string_descriptor1, g_cdc_string_descriptor2, g_cdc_string_descriptor3, g_cdc_string_descriptor4, g_cdc_string_descriptor5, g_cdc_string_descriptor6 }; /****************************************************************************** Renesas Abstracted Peripheral Communications Devices Class Driver API functions ******************************************************************************/ /****************************************************************************** End Of File ******************************************************************************/

修改 src/hal_entry.c 源文件,在里面添加 USB CDC相关代码如下。

复制… … #define APP_ERR_TRAP(a) if(a) {__asm(“BKPT #0 “);} /* trap the error location */ /* Global variables */ extern uint8_t g_apl_device[]; extern uint8_t g_apl_configuration[]; extern uint8_t g_apl_hs_configuration[]; extern uint8_t g_apl_qualifier_descriptor[]; extern uint8_t *g_apl_string_table[]; #define LINE_CODING_LENGTH (0x07U) #define READ_BUF_SIZE (8U) #define NUM_STRING_DESCRIPTOR (7U) const usb_descriptor_t usb_descriptor = { g_apl_device, /* Pointer to the device descriptor */ g_apl_configuration, /* Pointer to the configuration descriptor for Full-speed */ g_apl_hs_configuration, /* Pointer to the configuration descriptor for Hi-speed */ g_apl_qualifier_descriptor, /* Pointer to the qualifier descriptor */ g_apl_string_table, /* Pointer to the string descriptor table */ NUM_STRING_DESCRIPTOR }; usb_status_t usb_event; static bool b_usb_attach = false; static fsp_err_t usb_pcdc_echo_back(char *p_data); … … void hal_entry(void) { /* TODO: add your own code here */ fsp_err_t err = FSP_SUCCESS; usb_event_info_t event_info = {0}; uint8_t g_buf[READ_BUF_SIZE] = {0}; static usb_pcdc_linecoding_t g_line_coding; R_BSP_PinAccessEnable(); /* Enable access to the PFS registers. */ console_initialize(); printf(“Hello EK-RA6M4 Board “); /* Open USB instance */ err = R_USB_Open (&g_basic0_ctrl, &g_basic0_cfg); /* Handle error */ if (FSP_SUCCESS != err) { /* Turn ON RED LED to indicate fatal error */ turn_led(BSP_LEDRED, BSP_LEDON); APP_ERR_TRAP(err); } while (1) { /* Obtain USB related events */ err = R_USB_EventGet (&event_info, &usb_event); /* Handle error */ if (FSP_SUCCESS != err) { /* Turn ON RED LED to indicate fatal error */ turn_led(BSP_LEDRED, BSP_LEDON); APP_ERR_TRAP(err); } /* USB event received by R_USB_EventGet */ switch (usb_event) { case USB_STATUS_CONFIGURED: { err = R_USB_Read (&g_basic0_ctrl, g_buf, READ_BUF_SIZE, USB_CLASS_PCDC); /* Handle error */ if (FSP_SUCCESS != err) { /* Turn ON RED LED to indicate fatal error */ turn_led(BSP_LEDRED, BSP_LEDON); APP_ERR_TRAP(err); } break; } case USB_STATUS_READ_COMPLETE: { if(b_usb_attach) { err = R_USB_Read (&g_basic0_ctrl, g_buf, READ_BUF_SIZE, USB_CLASS_PCDC); } /* Handle error */ if (FSP_SUCCESS != err) { /* Turn ON RED LED to indicate fatal error */ turn_led(BSP_LEDRED, BSP_LEDON); APP_ERR_TRAP(err); } usb_pcdc_echo_back((char *)g_buf); printf(“USB read data: 0x%02x->%c “, g_buf[0], g_buf[0]); break; } case USB_STATUS_REQUEST : /* Receive Class Request */ { /* Check for the specific CDC class request IDs */ if (USB_PCDC_SET_LINE_CODING == (event_info.setup.request_type & USB_BREQUEST)) { err = R_USB_PeriControlDataGet (&g_basic0_ctrl, (uint8_t *) &g_line_coding, LINE_CODING_LENGTH ); /* Handle error */ if (FSP_SUCCESS != err) { /* Turn ON RED LED to indicate fatal error */ turn_led(BSP_LEDRED, BSP_LEDON); APP_ERR_TRAP(err); } } else if (USB_PCDC_GET_LINE_CODING == (event_info.setup.request_type & USB_BREQUEST)) { err = R_USB_PeriControlDataSet (&g_basic0_ctrl, (uint8_t *) &g_line_coding, LINE_CODING_LENGTH ); /* Handle error */ if (FSP_SUCCESS != err) { /* Turn ON RED LED to indicate fatal error */ turn_led(BSP_LEDRED, BSP_LEDON); APP_ERR_TRAP(err); } } else if (USB_PCDC_SET_CONTROL_LINE_STATE == (event_info.setup.request_type & USB_BREQUEST)) { err = R_USB_PeriControlStatusSet (&g_basic0_ctrl, USB_SETUP_STATUS_ACK); /* Handle error */ if (FSP_SUCCESS != err) //if (FSP_SUCCESS != g_err) { /* Turn ON RED LED to indicate fatal error */ turn_led(BSP_LEDRED, BSP_LEDON); APP_ERR_TRAP(err); } } else { /* none */ } break; } case USB_STATUS_DETACH: case USB_STATUS_SUSPEND: { b_usb_attach = false; memset (g_buf, 0, sizeof(g_buf)); break; } case USB_STATUS_RESUME: { b_usb_attach = true; break; } default: { break; } } } #if BSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif } /***************************************************************************************************************** * @brief Check for write completion * @param[in] None * @retval FSP_SUCCESS Upon success * @retval any other error code apart from FSP_SUCCESS ****************************************************************************************************************/ static fsp_err_t check_for_write_complete(void) { usb_status_t usb_write_event = USB_STATUS_NONE; int32_t timeout_count = UINT16_MAX; fsp_err_t err = FSP_SUCCESS; usb_event_info_t event_info = {0}; do { err = R_USB_EventGet (&event_info, &usb_write_event); if (FSP_SUCCESS != err) { return err; } –timeout_count; if (0 > timeout_count) { timeout_count = 0; err = (fsp_err_t)USB_STATUS_NONE; break; } }while(USB_STATUS_WRITE_COMPLETE != usb_write_event); return err; } /***************************************************************************************************************** * @brief Prints the message to console * @param[in] p_msg contains address of buffer to be printed * @retval FSP_SUCCESS Upon success * @retval any other error code apart from FSP_SUCCESS, Write is unsuccessful ****************************************************************************************************************/ static fsp_err_t usb_pcdc_echo_back(char *p_data) { fsp_err_t err = FSP_SUCCESS; uint32_t len = ((uint32_t)strlen(p_data)); err = R_USB_Write (&g_basic0_ctrl, (uint8_t*)p_data, len, USB_CLASS_PCDC); /* Handle error */ if (FSP_SUCCESS != err) { return err; } err = check_for_write_complete(); if (FSP_SUCCESS != err) { /* Did not get the event hence returning error */ return FSP_ERR_USB_FAILED; } return err; }

9.4 编译运行

代码修改完成后,在开发板上编译运行。将J11上的Micro USB接到电脑上,在Window的设备管理器上将会看到新的串口设备(如下面的COM9)。

基于单片机的USB外设CDC实现-单片机usb接口作用

接下来在USB的虚拟串口COM9上发送数据,将会收到回显数据,另外Console串口上也会打印收到的数据。

基于单片机的USB外设CDC实现-单片机usb接口作用

免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:基于单片机的USB外设CDC实现-单片机usb接口作用 https://www.yhzz.com.cn/a/5879.html

上一篇 2023-04-12 16:09:11
下一篇 2023-04-12 16:12:47

相关推荐

联系云恒

在线留言: 我要留言
客服热线:400-600-0310
工作时间:周一至周六,08:30-17:30,节假日休息。