本文实验将USB配置为虚拟串口。
一、FSP configration

添加r_usb_pcdc

为USB配置48Mhz

pins->USB_FS0->Operation Mode:Device

设置CDC描述符名称
二、软件部分
1、复制一份CDC描述符文件到src
https://gitee.com/ramcu/ra-fsp-examples/tree/master/example_projects/ek_ra4m2/usb_pcdc/usb_pcdc_ek_ra4m2_ep/e2studio/src
复制r_usb_pcdc_descriptor.c到src
2、打开USB
err = R_USB_Open (&g_basic0_ctrl, &g_basic0_cfg);
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP(err);
}
3、USB事件处理
char firstPage[]="press 1 for Led 1\r\n";
char secondPage[]="press 2 for Led 2\r\n";
while (true)
{
err = R_USB_EventGet (&event_info, &usb_event);
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP(err);
}
switch (usb_event)
{
case USB_STATUS_CONFIGURED:
{
err = R_USB_Read (&g_basic0_ctrl, g_buf, READ_BUF_SIZE, USB_CLASS_PCDC);
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);
}
switch (g_buf[0])
{
case KIT_INFO:
{
print_to_console(firstPage);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, OFF);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, ON);
break;
}
case NEXT_STEPS:
{
print_to_console(secondPage);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, ON);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, OFF);
break;
}
case CARRIAGE_RETURN:
{
err = print_to_console(p_welcome);
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP(err);
}
break;
}
default:
{
break;
}
}
break;
}
caseUSB_STATUS_REQUEST :
{
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 );
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP(err);
}
}
elseif (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 );
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP(err);
}
}
elseif (USB_PCDC_SET_CONTROL_LINE_STATE == (event_info.setup.request_type & USB_BREQUEST))
{
err = R_USB_PeriControlStatusSet (&g_basic0_ctrl, USB_SETUP_STATUS_ACK);
if (FSP_SUCCESS != err)
{
APP_ERR_TRAP(err);
}
}
else
{
}
break;
}
caseUSB_STATUS_DETACH:
caseUSB_STATUS_SUSPEND:
{
b_usb_attach = false;
memset (g_buf, 0, sizeof(g_buf));
break;
}
caseUSB_STATUS_RESUME:
{
b_usb_attach = true;
break;
}
default:
{
break;
}
}
当串口收到1时,串口输出firstPage内容,并点亮led1
当串口收到2时,串口输出secondPage内容,并点亮led2
3、CDC串口输出函数
fsp_err_t print_to_console(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);
if (FSP_SUCCESS != err)
{
return err;
}
err = check_for_write_complete();
if (FSP_SUCCESS != err)
{
returnFSP_ERR_USB_FAILED;
}
return err;
}
staticfsp_err_tcheck_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;
}
三、运行

串口输出
