新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 嵌人式操作系统中USB双向通信的设计与实现

嵌人式操作系统中USB双向通信的设计与实现

作者:时间:2013-11-08来源:网络收藏

  (3)嵌入式操作系统端应用程序读写过程

  读函数:void Read(unsigned char * ReadBuffer, DWORD size)函数:

  功能:嵌入式系统应用程序通过接口读取上位机(PC)的数据。

  参数说明:unsigned char*ReadBuffer存放数据的指针,DWORD size为要读出的数据的尺寸(单位:B)。

  实现过程:首先判断循环队列是否为空,不为空则判断自身信号量是否可用,若可用,则从队列中读取一字节,每读一字节后向USB任务中的BulkOutGet函数(直接读取OUT的FIFO函数)发出一个信号量,通知BulkOutGet函数队列此时可以向OUT循环队列中写入数据,接着重新判断,依次逐字节从OUT循环队列中读取数据,直到读完要求数据大小为止。当循环队列为空时,首先发一个信号量,通知BulkOutGet函数应向本队列中写入数据了,然后复位自身信号量,接着调用等待信号量的函数,直到信号量到时才接着读取。若超时,则向嵌入式操作系统发出超时通知,同时通过向控制包中写入超时状态(0x01)来向上位机(PC)发出超时信号。

  写函数:void WriteUSB(unsigned char*Write Buffer,DWORD size)函数:

  功能:嵌入式系统应用程序通过USB接口向上位机(PC)发送数据。

  参数说明:unsigned char * WriteBuffer 存放数据的指针,DWORD size为要写入的数据的尺寸(单位:B)。

  实现过程:首先判断循环队列是否满,不为满则判断自身信号量是否可用,若可用,则向队列中写入一字节,每写入一字节后向USB任务中的BulkInDataSet(直接写IN的FIFO函数)函数发出一个信号量通知此函数此时可以从IN循环队列中读取数据;然后接着重新判断依次逐字节向IN循环队列写入数据,直到写完要求数据大小的数据为止。当循环队列满时,先发一个信号量通知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; 需写入数据的大小(字节数)。



评论


相关推荐

技术专区

关闭