查看EK-RA6M4的原理图,如下图所示,该开发板上的 J11 提供了 Micro USB0接口。
根据原理图可知,USB接口的引脚分别为:
功能 | 引脚USB |
---|---|
USB | USB_FS0 |
VBUS | P407 |
首先,在FSP配置中将配置相关管脚为USB外设模式。
然后配置使能USB的48MHz时钟。
接着选择 Stacks ,点击 "New Stack" -> "Connectivity" -> "USB PCDC(r_usb_pcdc)" 添加 USB CDC 协议栈。
接下来设置USB CDC的相关配置,并重新生成代码。
创建按键操作相关的头文件 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;
}
代码修改完成后,在开发板上编译运行。将J11上的Micro USB接到电脑上,在Window的设备管理器上将会看到新的串口设备(如下面的COM9)。
接下来在USB的虚拟串口COM9上发送数据,将会收到回显数据,另外Console串口上也会打印收到的数据。
全部0条评论
快来发表一下你的评论吧 !