新闻中心

EEPW首页>嵌入式系统>设计应用> USB接口芯片SL811HS在51单片机系统中应用

USB接口芯片SL811HS在51单片机系统中应用

作者: 时间:2012-03-08 来源:网络 收藏

在本系统中,SL811HS占用的地址空间为0xA000-0xBFFF,下面的读写函数中采用“自动地址增加模式”来降低SL811HS读写设备时占用的系统资源:

  xdata unsigned char SL811_ADDR_at 0xA000;

  //USB主机控制寄存器地址

  xdata unsigned char SL811_DATA _at_ 0xA001;

  //USB主机数据基址

  void wr811(unsigned char address, unsigned char value)

  { SL811_ADDR = address; 

  SL811 DATA = value;} 

  unsigned char rd811(unsigned char address)

  { SL811_ADDR = address;

  return SL811_DATA;}

  下面是读写缓冲区的代码函数:

  // addr = 缓冲区起始偏移地址

  // s = 进行缓冲区读写操作时的数据指针

  // c = 进行缓冲区读写操作时的数据数量

  void SL811BufRead(unsigned char addr, unsigned char *s, unsigned char c)

  { SL811_ADDR = addr;

  while(c--)

  { *s++= SL811_DATA;}

  }

  void SL811BufWrite(unsigned char addr, unsigned char *s, unsigned char c)

  { SL811 ADDR = addr;

  while (c--)

  { SL811_DATA=*s++;}

  }

4.2 应用程序设计

USB总线一般包含四种基本数据传输类型:控制传输、中断传输、批传输以及同步传输,本系统使用的是控制传输和批腀输。這面以爱国者迷你王U盘为例,介绍在该盘上建立目录及写文件的具体方法。

  爱国者迷你王(64M)属Mass storageclass,支持Bulk-only传输,命令集为SCSI传输命令集。Bulk-Only传输时,其命令、数据及状态均通过Bulk端点传送。爱国者迷你王(64M)有三个端点,端点0为缺省控制通道,端点1为Bulk out端点,端点2为Bulk in端点。首先要用read(读block0)及 read capacity 命令读取U盘参数,随后即可对U盘进行读写。

其中dCBWSignature的值为43425355LSB ,表示当前发送的是一个CBW;将dCBWTag的内容在状态阶段原样发送给HOST可以验证命令执行的是否正确;dCBWDataTransferLength为数据阶段要传送的字节数;BmCBWFlags表明数据阶段传送的方向;Re-served是保留位,通常可以置零;bCBWLUN用于指明该命令传送给哪个逻辑单元;BCBWCBLength为后续字符串中命令字节的长度,CBWCB为真正要传送的命令。CBW命令发出后,U盘从CBW中解析出CB-WCB然后执行相应的操作,之后返回一个CSW命令块,表明命令执行情况。爱国者迷你王(64M)每次至少读取或写入512字节,因此在改写某些字节时,必须把整个逻辑块一次读出,修改后再一次性写入。

用W78E54控制SL811HS来读写U盘的工作过程可以简单地概括为:当SL811HS从USB总线检测到U盘插入后,通过中断方式将此信息通知系统,系统通过调用枚举模块可以获得与此次传输有关的各种参数,并根据具体的传输参数调用数据读写模块以对SL811HS的控制寄存器和数据寄存器进行相应的操作,最终完成对U盘的读写。其写文件流程图见图3所示。

5 结束语

使用USB主机接口控制器SL811HS实现对U盘的读写,可为数据采集系统大容量数据存储提供一种通用、方便和可靠的解决方案,目前该方案已成功应用到笔者自主研发的温室环境信息采集系统中,并经过长时间测试证明了它的实用性和可靠性。由于SL811HS同时具有从机工作模式,因此,也可将此方案经简单修改后开发USB接口从设备,从而满足不同场合的需要。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭