(3)USB读函数主要完成从PC端接受数据工作。与其相对应的写函数笔者在此不再赘述,完整的工程代码可以向笔者索取。 static uint AT91F_UDP_Read(AT91PS_CDC pCdc, char *pData, uint length) { //变量及结构体声明 while (length) { if ( !AT91F_UDP_IsConfigured(pCdc) ) break; AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, 2); if ( pUdp->UDP_CSR[AT91C_EP_OUT] & currentReceiveBank ) { packetSize = MIN(pUdp->UDP_CSR[AT91C_EP_OUT] >> 16, length); length -= packetSize; if (packetSize < AT91C_EP_OUT_SIZE) length = 0; while(packetSize--) pData[nbBytesRcv++] = pUdp->UDP_FDR[AT91C_EP_OUT]; pUdp->UDP_CSR[AT91C_EP_OUT] &= ~(currentReceiveBank); if (currentReceiveBank == AT91C_UDP_RX_DATA_BK0) currentReceiveBank = AT91C_UDP_RX_DATA_BK1; else currentReceiveBank = AT91C_UDP_RX_DATA_BK0; } AT91F_PIO_SetOutput(AT91C_BASE_PIOA, 2); } pCdc->currentRcvBank = currentReceiveBank; return nbBytesRcv; } (4)主函数的实现代码如下,在主函数里主要完成USB设备的枚举、数据的收发等工作。在实现主函数时,读者需要注意的是:调试时无法在程序中设置断点,主要因为USB设备的枚举是个连续的过程,读者可以借助USB调试助手之类的工具来完成调试工作。 int main ( void ) { …// 变量声明 AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24); // 初始化USB设备 AT91F_USB_Open(); // 等待USB枚举结束 while (!pCDC.IsConfigured(&pCDC)); while (1) { length = pCDC.Read(&pCDC, data, MSG_SIZE); if (fir==0) { pCDC.Write(&pCDC, data,length); fir=1; } else { pCDC.Write(&pCDC, data,length); fir=0; } } } 经过上面的步骤后,全速运行工程,并将USB连接线的A型插头,插入主机(通常为PC机),至于B型端接口,读者可以在板子上留出B型插座,也可以按前面描述的方法,将USB的4根信号线一一对应连接即可。此时,你将发现主机提示发现新设备,根据提示设置到atm6124ser.inf文件所在目录,安装完成后,通过选择我的电脑—属性—硬件—设备管理—调制解调器,将看到如图-2所示的结果。
图2 USB虚拟串口
在图2中,我们看到在硬件设备管理中的调制解调器设备中多了一个设备,即:“ATMEL AT91 USB serial emulation”, 当然读者在实现过程中,可以修改atm6124ser.inf中的信息,以便更符合自己的应用需求。修改方法:在atm6124ser.inf文件中,找到下面的描述,修改成自己想定义的提示字符即可。 [Strings] Mfg = "ATMEL CORPORATION" AT91MSG = "ATMEL AT91 USB serial emulation" USBFilterString ="AT91 USB serial emulation" (5)通过上面的介绍,我们已经完成了USB虚拟串口的工作。下面简单描述测试方法: 在确定硬件连接无误后,并在程序中设置两标志位,即发数据前后各设一个标志位,程序运行后,通过串口调试助手软件,一次发送1024Bytes(1K Bytes)数据,并借助示波器观察两标志位状态变化时间,经过笔者测试,其数据传输率约为1K Bytes/ms,即与USB的全速状态下的数据传输率(12M bits/s)相吻合。
四、结语 至此,在AT91SAM7S256上通过CDC类实现USB虚拟串口的功能就介绍完毕,并经过笔者测试,文中所实现的USB虚拟串口的方法在实际的应用中是稳定的、可行的。
|