一:CDC协议
CDC协议是通讯设备类的通用协议。官网上的CDC范例模拟的是CDC协议中的通讯接口类(02)和数据接口类(Oa),在PC上的用户界面就是串口,设备挂载在windows的“usbsersys”通用驱动程序上。使用普通串口助手,选择其中的“COMx”端口即可与CDC设备进行数据传输。
如果CDC设备当作Bridge(USB转串口桥接器),则上位机驱动传下来的波特率、校验位、停止位等参数均需要进行处理,然后将上位机传下来的数据再通过正确的波特率、校验位、停止位等格式将
串口数据下传到第三方器件。如果CDC设备只是作为普通的USB设备,直接PC进行数据传输,则可完全不用处理波特率、校验位、停止位等参数,此时CDC设备与PC之间的数据传输完全不会受到串口波特率的影响。实际测试的数据传输平均比特率可达2~4MBPS。
二:AI8051的USB转CDC
void usb_init()
{
P3M0 &= ~0x03;
P3M1 |= 0x03;
IRC48MCR = 0x80;
while (!(IRC48MCR & 0x01));
USBCLK = 0x00;
USBCON = 0x90;
usb_write_reg(FADDR, 0x00);
usb_write_reg(POWER, 0x08);
usb_write_reg(INTRIN1E, 0x3f);
usb_write_reg(INTROUT1E, 0x3f);
usb_write_reg(INTRUSBE, 0x07);
usb_write_reg(POWER, 0x00);
DeviceState = DEVSTATE_DEFAULT;
Ep0State.bState = EPSTATE_IDLE;
InEpState = 0x00;
OutEpState = 0x00;
UsbInBusy = 0;
UsbOutBusy = 0;
RxRptr = 0;
RxWptr = 0;
TxRptr = 0;
TxWptr = 0;
EUSB = 1;
}三:串口2的初始化,用来转发CDC的数据
void uart_init()
{
S2_S = 1;
P4M0 &= ~0x0c;
P4M1 &= ~0x0c;
S2CON = 0x50;
T2L = BR(115200);
T2H = BR(115200) >> 8;
T2x12 = 1;
T2R = 1;
PS2 = 1; //提高串口2中断优先级,防止数据丢失
ES2 = 1;
LineCoding.dwDTERate = 0x00c20100; //115200
LineCoding.bCharFormat = 0;
LineCoding.bParityType = 0;
LineCoding.bDataBits = 8;
}四:USB转CDC 与串口2的数据之间的互传过程:
void uart_polling()
{
BYTE dat;
BYTE cnt;
if (DeviceState != DEVSTATE_CONFIGURED)
return;
if (!UsbInBusy && (TxRptr != TxWptr))
{
EUSB = 0;
UsbInBusy = 1;
usb_write_reg(INDEX, 1);
cnt = 0;
while (TxRptr != TxWptr)
{
usb_write_reg(FIFO1, TxBuffer[TxRptr++]);
cnt++;
if (cnt == EP1IN_SIZE) break;
}
usb_write_reg(INCSR1, INIPRDY);
EUSB = 1;
}
if (!UartBusy && (RxRptr != RxWptr))
{
dat = RxBuffer[RxRptr++];
UartBusy = 1;
switch (LineCoding.bParityType)
{
case NONE_PARITY:
case SPACE_PARITY:
S2TB8 = 0;
break;
case ODD_PARITY:
ACC = dat;
S2TB8 = !P;
break;
case EVEN_PARITY:
ACC = dat;
S2TB8 = P;
break;
case MARK_PARITY:
S2TB8 = 1;
break;
}
S2BUF = dat;
while (UartBusy);
}
if (UsbOutBusy)
{
EUSB = 0;
if (RxWptr - RxRptr < 256 - EP1OUT_SIZE)
{
UsbOutBusy = 0;
usb_write_reg(INDEX, 1);
usb_write_reg(OUTCSR1, 0);
}
EUSB = 1;
}
}五:实物演示如下:

我要赚赏金
