USB接口芯片SL811HS在51单片机系统中应用
signed 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的值为43425355LSB ,表示当前发送的是一个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接口从设备,从而满足不同场合的需要。
- USB接口芯片SL811HS的应用(05-09)
- 基于引言DSP平台的USB接口设计(11-30)
- 低成本USB接口密钥的设计方法(12-21)
- USB接口类型(12-15)
- C#实现USB接口的程序代码(12-14)
- USB接口的基础理论知识(12-14)