嵌入式操作系统中USB双向通信的设计与实现
循环队列满时,先发一个信号量通知BulkInDataSet函数应从队列中取走数据,再复位自身信号量,接着调用等待信号量的函数,直到信号量到时才接着写入,若超时,则向嵌入式操作系统发出超时通知,同时通过向控制包中写入超时状态(0x02)来向上位机(PC)发出超时信号。
(4) USB块传输函数
USB块传输函数是直接和USB硬件打交道的函数,他们直接读取IN和OUT传输通道的FIFO。voi d BulkInDataSet(void):其功能是IN传输过程,即从IN循环队列中读取数据并向IN FIFO中写入数据,再对嵌入式操作系统信号量做相应处理。
void BulkOutDataGet(void)其功能是OUT传输过程,即从OUT FIFO中读出数据并向OUT循环队列中写入数据,再对嵌入式操作系统信号量做相应处理。
(5) 嵌入式操作系统USB 任务调用函数
void SystemInit(void):MCU初始化(微处理器各控制寄存器和状态初始化过程)
void USBInit(void):USB初始化(包括对循环队列分配内存等)
void USBThread(void):USB运行体(USB工作过程对USB中断进行处理主要包括USB块传输函 数、USB中断状态分析处理等)。
void FreeUSB(void):关闭USB和释放由malloc函数分配的循环队列所占内存
3.2上位机(PC)部分
USB函数层(USBD及HCD)由Windows98提供,负责管理USB设备驱动程序与USB控制器之间的通信、加载及卸载USB驱动程序等。具体方法是通过DriverWorks软件生成上位机(PC)机端USB驱动程序模板[3],根据下位机的情况处理相应的读写部分,最后通过封装基本API函数ReadFile,WriteFile来实现用户态应用程序与PC机USB驱动程序的隔离,使PC的应用层对USB的使用如同对串口的使用一样方便,给用户态应 用程序提供有了3个接口函数:
unsigned char Read(void *pReadBuffer,DWORD Size):从下位机中读取数据
参数说明:void *pBuffer:存放读取数据的缓冲,DWORD Size:需读取数据的大小(字节数)
返回值:
0x10:驱动出错(指Windows USB 驱动程序出错)
0x20:内存空间不足?
0x30:请求的数据大小为0 B
0x02:下位机发送软超时
0x08:读取成功
unsigned char Write(void *pWriteBuffer,DWORD Size):发送数据到下位机
参数说明:void *pBuffer; 存放写入数据的缓冲,DWORD Size; 需写入数据的大小(字节数)。
返回值:
0x10:USB驱动出错(Windows USB 驱动程序出错)
0x20:内存空间不足
0x30:请求的数据大小为0 B
0x01:下位机读取数据软超时
0x04:发送成功
void RequestUSB(void *pRequestBuffer,DWORD Size=5):读取下位机返回的操作状态。
参数说明:void *pRequestBuffer:5 B控制包缓冲
其中每次Read或Write函数的调用被分为若干次读/写发送。具体处理是: 设待读写的数据字节数为X B,当X=5B时,分割为X1=4 B和X2=1 B两次发送(由于自定义包是5 B,为了与自定义控制包区分开);当5 B16 kB时则分割以16kB为单位的数据进行发送,不足16 kB的部分再发送一次。每次读/写发送分3个阶段:发控制包,读/写数据,读控制包状态。
4结语
基于S1C33L11芯片在嵌入式操作系统基础上实现的USB双向通信严格遵循USB1.1协议,充分利用了S1C33L11芯片的内置功能和嵌入式操作系统的作用,具有交互作用强、嵌入式操作系统中设备无关性好的特点。
设计 实现 通信 双向 操作系统 USB 嵌入式 相关文章:
- 直接变频接收机设计可实现多标准/多频带运行(10-11)
- 基于蓝牙芯片的无线通信模块设计与开发(02-03)
- 无线通信网络设计与现场测试(10-10)
- WiMAX数据传输加密方案设计与实现(05-25)
- 高性能TD-SCDMA接收机的设计(03-15)
- 初步设计WiMAX射频系统(03-29)