227 lines
5.3 KiB
C
227 lines
5.3 KiB
C
|
#include "usbd_cdc_vcp.h"
|
|||
|
#include "string.h"
|
|||
|
#include "stdarg.h"
|
|||
|
#include "stdio.h"
|
|||
|
#include "mymem.h"
|
|||
|
//////////////////////////////////////////////////////////////////////////////////
|
|||
|
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
|
|||
|
//ALIENTEK STM32开发板
|
|||
|
//usb vcp驱动代码
|
|||
|
//正点原子@ALIENTEK
|
|||
|
//技术论坛:www.openedv.com
|
|||
|
//创建日期:2016/2/24
|
|||
|
//版本:V1.0
|
|||
|
//版权所有,盗版必究。
|
|||
|
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
|
|||
|
//All rights reserved
|
|||
|
//////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
//USB虚拟串口相关配置参数
|
|||
|
LINE_CODING linecoding =
|
|||
|
{
|
|||
|
115200, //波特率
|
|||
|
0x00, //停止位,默认1位
|
|||
|
0x00, //校验位,默认无
|
|||
|
0x08 //数据位,默认8位
|
|||
|
};
|
|||
|
|
|||
|
u8 USART_PRINTF_Buffer[USB_USART_REC_LEN]; //usb_printf发送缓冲区
|
|||
|
|
|||
|
|
|||
|
/* 传送数据时的格式 0xff,0xff开头,len_h,len_l长度,*/
|
|||
|
static u8 USB_USART_RX_BUF[USB_USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
|
|||
|
static int USB_USART_RX_LEN =0;
|
|||
|
|
|||
|
static int USB_USART_RX_DONE=0;
|
|||
|
|
|||
|
extern uint8_t APP_Rx_Buffer []; //虚拟串口发送缓冲区(发给电脑)
|
|||
|
extern uint32_t APP_Rx_ptr_in; //虚拟串口接收缓冲区(接收来自电脑的数据)
|
|||
|
|
|||
|
//虚拟串口配置函数(供USB内核调用)
|
|||
|
CDC_IF_Prop_TypeDef VCP_fops =
|
|||
|
{
|
|||
|
VCP_Init,
|
|||
|
VCP_DeInit,
|
|||
|
VCP_Ctrl,
|
|||
|
VCP_DataTx,
|
|||
|
VCP_DataRx
|
|||
|
};
|
|||
|
|
|||
|
//初始化VCP
|
|||
|
//返回值:USBD_OK
|
|||
|
uint16_t VCP_Init(void)
|
|||
|
{
|
|||
|
return USBD_OK;
|
|||
|
}
|
|||
|
//复位VCP
|
|||
|
//返回值:USBD_OK
|
|||
|
uint16_t VCP_DeInit(void)
|
|||
|
{
|
|||
|
return USBD_OK;
|
|||
|
}
|
|||
|
//控制VCP的设置
|
|||
|
//buf:命令数据缓冲区/参数保存缓冲区
|
|||
|
//len:数据长度
|
|||
|
//返回值:USBD_OK
|
|||
|
uint16_t VCP_Ctrl (uint32_t Cmd, uint8_t* Buf, uint32_t Len)
|
|||
|
{
|
|||
|
switch (Cmd)
|
|||
|
{
|
|||
|
case SEND_ENCAPSULATED_COMMAND:
|
|||
|
break;
|
|||
|
case GET_ENCAPSULATED_RESPONSE:
|
|||
|
break;
|
|||
|
case SET_COMM_FEATURE:
|
|||
|
break;
|
|||
|
case GET_COMM_FEATURE:
|
|||
|
break;
|
|||
|
case CLEAR_COMM_FEATURE:
|
|||
|
break;
|
|||
|
case SET_LINE_CODING:
|
|||
|
linecoding.bitrate = (uint32_t)(Buf[0] | (Buf[1] << 8) | (Buf[2] << 16) | (Buf[3] << 24));
|
|||
|
linecoding.format = Buf[4];
|
|||
|
linecoding.paritytype = Buf[5];
|
|||
|
linecoding.datatype = Buf[6];
|
|||
|
//打印配置参数
|
|||
|
// printf("linecoding.format:%d\r\n",linecoding.format);
|
|||
|
// printf("linecoding.paritytype:%d\r\n",linecoding.paritytype);
|
|||
|
// printf("linecoding.datatype:%d\r\n",linecoding.datatype);
|
|||
|
// printf("linecoding.bitrate:%d\r\n",linecoding.bitrate);
|
|||
|
break;
|
|||
|
case GET_LINE_CODING:
|
|||
|
Buf[0] = (uint8_t)(linecoding.bitrate);
|
|||
|
Buf[1] = (uint8_t)(linecoding.bitrate >> 8);
|
|||
|
Buf[2] = (uint8_t)(linecoding.bitrate >> 16);
|
|||
|
Buf[3] = (uint8_t)(linecoding.bitrate >> 24);
|
|||
|
Buf[4] = linecoding.format;
|
|||
|
Buf[5] = linecoding.paritytype;
|
|||
|
Buf[6] = linecoding.datatype;
|
|||
|
break;
|
|||
|
case SET_CONTROL_LINE_STATE:
|
|||
|
break;
|
|||
|
case SEND_BREAK:
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
return USBD_OK;
|
|||
|
}
|
|||
|
//发送一个字节给虚拟串口(发给电脑)
|
|||
|
//data:要发送的数据
|
|||
|
//返回值:USBD_OK
|
|||
|
uint16_t VCP_DataTx (uint8_t data)
|
|||
|
{
|
|||
|
APP_Rx_Buffer[APP_Rx_ptr_in]=data; //写入发送buf
|
|||
|
APP_Rx_ptr_in++; //写位置加1
|
|||
|
if(APP_Rx_ptr_in==APP_RX_DATA_SIZE) //超过buf大小了,归零.
|
|||
|
{
|
|||
|
APP_Rx_ptr_in = 0;
|
|||
|
}
|
|||
|
return USBD_OK;
|
|||
|
}
|
|||
|
//处理从USB虚拟串口接收到的数据
|
|||
|
//databuffer:数据缓存区
|
|||
|
//Nb_bytes:接收到的字节数.
|
|||
|
//返回值:USBD_OK
|
|||
|
uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len)
|
|||
|
{
|
|||
|
int i;
|
|||
|
u8 res;
|
|||
|
// for(i=0;i<Len;i++)
|
|||
|
// {
|
|||
|
// res=Buf[i];
|
|||
|
// if ((res==0xff)&&(USB_USART_RX_LEN==0))
|
|||
|
// {USB_USART_RX_BUF[USB_USART_RX_LEN]=res;USB_USART_RX_LEN++;}
|
|||
|
// else if ((res==0xff)&&(USB_USART_RX_LEN==1))
|
|||
|
// {USB_USART_RX_BUF[USB_USART_RX_LEN]=res;USB_USART_RX_LEN++;}
|
|||
|
// else if ((USB_USART_RX_LEN<USB_USART_REC_LEN)&&(USB_USART_RX_LEN>1))
|
|||
|
// { if (USB_USART_RX_DONE==0) {USB_USART_RX_BUF[USB_USART_RX_LEN]=res; USB_USART_RX_LEN++; }}
|
|||
|
// if (USB_USART_RX_LEN==USB_USART_REC_LEN)
|
|||
|
// { USB_USART_RX_DONE=1; }
|
|||
|
// if ((((USB_USART_RX_BUF[2]<<8)|(USB_USART_RX_BUF[3]))==(USB_USART_RX_LEN-2))&&(USB_USART_RX_LEN>2))
|
|||
|
// { USB_USART_RX_DONE=1; }
|
|||
|
// USB_USART_RX_BUF[i]=Buf[i];
|
|||
|
// Buf[i]=0;
|
|||
|
// }
|
|||
|
//把半个字节的数据整理成一个字节
|
|||
|
Len/=2;
|
|||
|
for (int i=0;i<Len;i++)
|
|||
|
{
|
|||
|
Buf[i]=(Buf[i*2]<<4)|(Buf[i*2+1]&0x0f);
|
|||
|
}
|
|||
|
extern void SysFile_UpdataByIrq (u8 *data,int len);
|
|||
|
SysFile_UpdataByIrq (Buf,Len);
|
|||
|
return USBD_OK;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//取得usb接收到的数据
|
|||
|
int usb_getRecvData (u8 *buff,int buffLen)
|
|||
|
{
|
|||
|
int ret=0;
|
|||
|
if (USB_USART_RX_DONE)
|
|||
|
{
|
|||
|
ret=buffLen;if (ret>USB_USART_RX_LEN) ret=USB_USART_RX_LEN;
|
|||
|
mymemcpy (buff,USB_USART_RX_BUF,ret);
|
|||
|
mymemset (USB_USART_RX_BUF,0,USB_USART_REC_LEN);
|
|||
|
USB_USART_RX_DONE=0;
|
|||
|
USB_USART_RX_LEN=0;
|
|||
|
}
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
//通过usb发送数据
|
|||
|
int usb_sendData (u8 *buff,int buffLen)
|
|||
|
{
|
|||
|
int ret=0;
|
|||
|
ret=buffLen;if (ret>USB_USART_REC_LEN) ret=USB_USART_REC_LEN;
|
|||
|
for (int i=0;i<ret;i++) VCP_DataTx (buff[i]);
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//usb虚拟串口,printf 函数
|
|||
|
//确保一次发送数据不超USB_USART_REC_LEN字节
|
|||
|
void usb_printf(char* fmt,...)
|
|||
|
{
|
|||
|
u16 i,j;
|
|||
|
va_list ap;
|
|||
|
va_start(ap,fmt);
|
|||
|
vsprintf((char*)USART_PRINTF_Buffer,fmt,ap);
|
|||
|
va_end(ap);
|
|||
|
i=strlen((const char*)USART_PRINTF_Buffer);//此次发送数据的长度
|
|||
|
for(j=0;j<i;j++)//循环发送数据
|
|||
|
{
|
|||
|
VCP_DataTx(USART_PRINTF_Buffer[j]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|