基于单片机的USB外设CDC实现

描述

9.1 原理图分析

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

接口

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

功能 引脚USB
USB USB_FS0
VBUS P407

9.2 USB接口配置

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

接口

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

接口

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

接口

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

接口

接口

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<SystemIncludes>, "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的虚拟串口COM9上发送数据,将会收到回显数据,另外Console串口上也会打印收到的数据。

接口

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

">
×
20
完善资料,
赚取积分