最新日志

发表于:2008-7-7 22:56:12
标签:无标签

1

USB Mass Storage 学习笔记(5)

此外,CBWCB的第一个字节是接收到的命令的操作码。它会用来解码命令并作相应的处理(通过MSDCommandHandler)。有可能有命令不需要作任何数据传输。在这种情况下,Direction位被置为‘0MSD_State被设为MSD_DATA_OUT。如果给定的命令不需要数据传输,命令被执行并且通过sendCSW()函数来设置状态。根据命令执行的结构,来设置dDataResiduebCSWStauts的值。

11显示了MSDDataIn()函数的流程。此函数被用来发送在MSDCommandHandler()处理的命令获得的数据。数据方向是从设备到主机,使用MSD_BD_IN。在命令执行后,dCSWDataResidue体现了被发送到主机的命令执行的结果包含的数据的字节数。一旦出现了错误(bCSWStatus!=0x00),会将主机期望的数据大小(dCBWDataTransferLength)置为0发送出去。如果发送数据的大小大于MSD_IN_EP_SIZE64字节,端点1 IN的缓冲区大小),则发送数量等于MSD_IN_EP_SIZE的数据;否则,利用MSD_BD_IN缓冲区发送数量等于dCSWDataResidue大小的数据。

点击看大图


注意,只有WRITE(10)命令的数据需要从主机读出。在MSD_WAIT态,MSD_BD_OUT指向msd_cbw结构体以便于读下一个命令块(command block)。但是当收到了一个WRITE(10)命令后,设备边为MSD_DATA_OUT态。在此状态中,设备必须从主机读取更多的数据并将数据写入SD卡。这些数据写入SD卡都是通过512字节的msd_buffer。因此,在MSD_DATA_OUT态中,MSD_BD_OUT(端点1 OUT)缓冲指向msd_buffer。为了读取完整的512数据块,在每次读操作后,MSD_BD_OUT指针在msd_buffer中的增加是根据MSD_OUT_EP_SIZE的(端点1 OUT缓冲大小)。一旦msd_buffer被填满(8次读取64字节),数据通过SECTORwrite(…)函数(在sdcard.c中定义)被写入SD卡的特定位置。如果多个数据块要写入SD卡就重复上述的过程。WRITE(10) CBWCBLBA域给出了LBA的起始地址;WRITE(10) CBWCB TRANSFER LENGTH域表示LBA被连续写入的长度的。

Out端点的大小被配置为64字节。Msd_buffer的大小在USB双口RAM区中被定义为512字节。SD卡的block大小为512字节。通过多次的从MSD_BD_OUT读取64字节数据,Msd_buffer可从主机读取512字节。一旦从主机读取了512字节后(msd_buffer被填满),就通过SETCTORWrite()函数将整块的数据写入SD卡。对于TRANSFER LENGTH>1WRITE(10)命令,多个512字节的数据块被写入根据LBA描述起始地址的连续的扇区。LBA和物理地址的转换是根据:因为每个扇区有2^9512字节,物理地址是通过将LBA左移9位获得。同样,对于READ(10)命令,先通过SECTORread()函数从SD卡读取512字节,然后通过64字节的MSD_BD_IN缓冲发送到主机。

每次从MSD_BD_OUTMSD_BD_IN进行读和写后,都要调用mUSBDriverService()函数来清除TRNIF位。mUSBBufferReady(MSD_BD_IN)mUSBBufferReadyMSD_BD_OUT)宏被用来读写BD寄存器中的数据。

FW仅支持固定格式来响应INQUIRY命令。根据规范,在对应的INQUIRY命令发生时不能产生媒介访问延迟。标准INQUIRY命令的数据最少为36字节,最多可达96字节。

READ CAPACITY命令的8字节响应表示了LBA的数量和Block的字节长度。为了获得这些信息,我们通过调用CSDread(…)函数从SD卡读取Card Specific DataCSD)。CSDread函数向SD卡发送SPI命令CSD_READ, 并且将反馈的数据存入全局变量gblCSDReg。卡容量可以通过CSD寄存器的C_SIZEC_SIZE_MULTREAD_BL_LEN计算获得。

Memory容量=BLOCKNR*BLOCK_LEN,

BLOCKNR=(C_SIZE+1)*MULTMULT=2^C_SIZE_MULT+2)。

Block lengthBLOCK_LEN)通过下式计算:

     READ_BL_LEN=WRTIE_BL_LEN

     BLOCK_LEN2^READ_BL_LEN

 

 

(frm 注:这篇AN的基本章节就学习到这里了。通过这个AN我们了解了单片机实现USB Mass Storage设备时用到的基本概念和软件的基本流程。后面要通过分析和移植Cypress的例程,真正实现一个类似DFUUSB Mass Storage的设备。)

 

大家要更加系统的学习USB Mass Storage的知识,可以参考以下的经典书目:

USB Complete: Everything You need to Develop Custom USB Peripherals By Jan Axelson

USB Mass StorageDesigning and Programming Devices and Embedded Hosts By Jan Axelson

大家要是希望得到以上的书籍(PDF)可以给我留言或短消息。

后面的章节就要进入实验了。希望大家能跟我一起学下去.....

点击此处查看原文 >>

系统分类: 接口电路   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(359)
发表于:2008-7-7 22:37:19
标签:无标签

0

选择正确的电平转换方案(二)

3.1 应用举例-应用SN74LVC2G07实行电平转换

       6显示了SN74LVC2G07一个Buffer1.8V5V的转换,另一Buffer3.3V1.8V的转换。

点击看大图

器件的电源电压为1.8V。它可以保证器件将输入最低的VIH识别为有效的高电平。输出上拉电阻的最小值取决于器件开漏脚的最大灌电流能力(maximum current-sinking capability Iol max)。而最大灌电流能力是受限于输出信号的最大允许的上升时间的。

Rpu(min) Vpu-Vol/ Iol(max)

对于图6中的SN74LVC2G07,假设Vpu1=5V±0.5VVpu2=1.8V±0.15V,而且电阻的精度为5%

Rpu1(min)((5.5V-0.45V)/4mA)×(1/0.95)=1.33kΩ

最接近的标称值为1.5kΩ。

Rpu2(min)=((1.8V-0.45V/4mA)× 1/0.95)=394.73Ω

最接近的标称值为430Ω。

7显示了在不同上拉电阻值的情况下具有10pF容性负载情况下的输出波形。当上拉电阻值增大后,输出信号的上升时间也增加了。

点击看大图

点击看大图

 

3.2 不要在CMOS驱动的输出端加上拉电阻

       在电平转换时,系统设计者不能在CMOS器件的输出端加上拉电阻。这种作法有很多弊端,应该避免使用。一个问题是在输出为低时增加了功耗。当CMOS驱动输出为高是也会产生另一个危害。高电平的电源会通过上拉电阻对低电平电源灌电流。此时,下部的N沟道晶体管是关闭的,上部的P沟道晶体管是导通的。电流灌入低电平的电源会产生无法预料的后果。

点击看大图

4 FET开关

  TICB3T,CBT,CBTDTVC系列的总线开关可以用作Level-shifterFET开关非常适用于不需要电流驱动并有很短传播时延的电平转换应用。

FET开关的好处:

     很短的传播时延

     TVC器件(或者将CBT器件配置为TVC)不用方向控制就可以实现双向电平转换

   TICB3T系列器件可以用于5V3.3V转换。图9显示了CB3T器件用作双向电平转换的一些应用。

点击看大图

在图9中,SN74CB3T3306被用来连接3V5V总线。CB3T的电源为3V。当信号从5V总线到3V总线时,CB3T器件将输出电压设置为3V。当信号从3V总线到5V总线时,5V端的输出电压为2.8V。这对于5V TTL器件的Vih电平是可用的。但是这种应用有两个弊端:

1.       CB3T33062.8VVoh电平降低了5V端的高电平噪声余度(margin)。此时的噪声余度为2.8V-2.0V=800mV

2.       因为CB3T器件的输出高电平没有被驱动到VCC的电压轨,5V接收端会出现额外的电源功耗ΔIcc 电流(在第6节会详细讨论ΔIcc

注意:VCC=3VTA=25Io=1uA时,Voh电平为2.8V。对于5V CMOS接收端而言2.8V不是有效的Vih电平。因此,CB3T器件不能3V总线向5V CMOS总线的升压转换。

 

4.1 CBTCBTD器件

       CBTCBTD系列器件可以用来作5V系统与3.3V系统的连接。这类器件只能用来作5V CMOS系统与3.3V系统的降压转换。它们还可以用于5V TTL系统与3.3V系统的双向转换。

10显示了SN74CBT1G3845V3.3V的转换。器件的VCC脚与5V电源间必须连接一个外部的二极管。外部的二极管将导通三极管的门电压将为4.3V。再加上Vgs上的1V压降,Pin2上的电压就为3.3V了。增加的二极管可用于将输出置为很低的电压。有时,二极管上的静态电流太小,不能使二极管导通,就需要在二极管与地之间加个电阻R来提供足够的偏置电流。

点击看大图

11显示了5V3.3V的波形。从输入端到输出端的传输时延非常小。CBT器件也可以配置为Translation Voltage Clamp(TVC)器件,在双向应用中就不用方向控制了。

点击看大图

未完,待续.......


点击此处查看原文 >>

系统分类: 接口电路   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(165)
发表于:2008-7-1 7:50:41
标签:无标签

2

USB Mass Storage 学习笔记(4)

接着上节的SCSI 命令。

     READ10)(Opcode 28h

READ(10)命令定义了设备服务器读指定的逻辑块(Logical blocks)并且将数据发送到Data-In 缓冲区。READ(10)命令是在第18和第19字节定义了TRANSFER LENGTH10字节的CBWCB。(参考:“SCSI Command and Data Format”)。TRANSFER LENGTH定义了数据的连续逻辑块的数量。

     WRITE10)(Opcode 2Ah

     REQUEST SENSE6)(Opcode 03h

     MODE SENSE6)(Opcode 1Ah

     PREVENT ALLOW MEDIUM REMOVALOpcode 1Eh

     TEST UNIT READYOpcode 00h

     VERIFY10)(Opcode 2Fh

     START/STOPOpcode 1Bh

不支持的命令

如果CBWCB中的命令操作码是不支持的,SENSE KEY被设为无效请求,表示CDB中有无效的参数。

MASS STORAGE 设备(MSD)固件

本固件实现了一个支持SD卡的USB Mass Storage 设备。当插入USB口后,固件将SD卡枚举为可移动磁盘而且允许用户执行磁盘驱动的所有功能。用户可以像操作任何可移动磁盘一样的写,读,编辑和删除 MSD上的文件。本应用也允许用户将SD卡格式化为下列的FAT文件格式:FAT16FAT32NTFS。固件通过读取SD卡的CSD 寄存器(Card Specific Data)计算SD卡的容量。这些信息通过响应READ CAPACITY命令将SD卡容量信息返回给PC 主机。磁盘的准确容量可以通过观察PC上的磁盘属性获得。

FW目录结构

(frm注:全部的Firmware可以从Microchip的网站下载。)

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en024394


6显示了MSD应用的FW的目录结构。

函数功能描述

1和表2msd.csdcard.c文件中的函数进行了描述。

点击看大图

点击看大图

内存管理

数据内存的Data Bank 47被映射到特定的双口RAM(见例程2)。当USB模块被禁用时,这些Bank中的通用功能寄存器(General Purpose Registers GPRs)也可像数据内存空间中的其它BankGPRs一样使用。当USB模块有效后,内存中的这些Bank被分配为USB操作的缓冲RAM。这些区域由MCU的核与SIE共享,用于两者之间的数据交换。注意,链接器的脚本已经将MSD定义为512字节的单数据Bank512字节 msd_buffer已经在MSD数据Bank中定义了(见例程1)。


7显示了包括端点缓冲的完整的内存映射。



FW描述

8显示了FW中各文件间的相互关系。USB框架文件的更详细描述可以通过PICDEM FS USB演示板的用户指南获得。本AN仅注重USB Mass Storage应用和SD 卡通信。

点击看大图

USB请求可以分为标准请求或类相关请求。USB标准请求由USBCheckStdRequest()函数处理。它负责处理USB2.0规范的第9章描述的标准请求。Msd.c中的固件负责处理USB Mass Storage类规定的请求。如果有USBCheckStdRequest()不能处理的请求,它会调用USBCheckMSDRequest()函数。USBCheckMSDRequest()函数判断请求是否是一个类相关请求。(SetupPkt.RequestType==CLASS)而且SetupPkt.bRequest==FFhBulk-Only Mass Storage Reset)或FEhGet Max LUN)。如果收到了Bulk-Only Mass Storage Reset请求,FW清除STALL状态并且开始初始化Endpoint1Get Max LUN请求的响应是包含设备支持的最大LUN数的一个字节。例如,如果设备支持3LUN,那么LUN的序号为0~2,而且返回‘2。本应用中,LUN1,所以返回值为‘0

Usb9.c主要处理USB枚举过程。USBStdSetCfgHandler()函数处理SET_CONFIGURATION请求。这个函数调用函数MSDInitEP()。函数MSDInitEP()配置并初试化一个Bulk-In和一个Bulk-Out端点。

Main.c文件中的main()函数实现一个无限循环来执行两个不同的任务-USBMass Storage应用任务。USB任务由USBDriverService()函数来处理。它负责处理全部的USB硬件中断。Mass Storage任务由ProcessIO()函数处理。

frm注:main()函数的代码及说明)

void main(void)

{

    InitializeSystem();

    while(1)

    {

          USBTasks();         // USB Tasks—此处调用了USBDriverService()函数

        ProcessIO();        // See msd.c & msd.h

    } //end while

}//end main

 

ProcessIO()函数是mass storage 与端点1通信的核心。图9显示了ProcessIO()函数的流程。

点击看大图

当端点1被初始化后,MSD_State被设置为MSD_WAITFW基本上是在等待Endpoint1接收CBW。如果接收到一个有意义的CBW,就要将CSW的数据准备好。基本上是将CBW中的dCBWTag拷贝到CSWdCSWTag中,并将dCSWSignature设置为“53425355h”。读取Direction位来判断数据传输的方向(例如,从主机到设备或相反)并将MSD_State设置为MSD_DATA_OUTMSD_DATA_IN(详见图10)。

点击看大图

这篇够长,争取下一篇将这个AN学完。就要进入实际的USB Mass Storage开发的实验了。
待续...................

点击此处查看原文 >>

系统分类: 接口电路   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(717)
发表于:2008-6-30 16:59:35
标签:无标签

0

USB Mass Storage学习笔记(3)

接着学习Microchip的AN。相关文章的原文在上一篇博客中。


MICROCHIP AN1003 USB Mass storage Device Using a PIC MCU

通信概述

本章对SD卡和PC直接的通信进行概述。图4描述了整个系统的框图。

点击看大图

设备驱动被称为“任何负责硬件设备与CPU接口的代码”。USB通信中采用分层的驱动模型,每一层负责一部分的通信处理。在本应用中,MSD被枚举为支持BOTMass Storage Device。因此,主机使用USB 存储设备驱动(usbstor.sys)作为功能驱动。主机还调用Disk.sysPartMgr.sysVolSnap.sys作为应用程序与设备驱动间的过滤器驱动。Root Hub驱动(usbhub.sys)管理端口初始化和设备驱动与总线类驱动。总线类驱动(usbd.sys)管理总线电源,枚举,及Root Hub驱动与主机控制驱动之间的USB传输和通信。

MSD这端,PIC18F4550的串行接口引擎(SIE)负责底层USB通信。USB数据在MCU核与SIE之间移动是通过称为USB RAM的内存空间。PIC18F4550提供配置和控制16个双向端点的能力。在本应用中,仅使用了两个双向端点。端点0对于所有的USB设备都是必须的。Mass storage 硬盘将端点1配置成Bulk In,Out端点用于Bulk-Only传输。它也与SD卡通信。

frm注:以上部分对USB的驱动部分的分层功能的说明很有价值)

 

SCSI 命令

frm注:MSD设备必须要支持以下的SCSI命令)

在成功枚举了目标USB设备后,主机根据枚举过程中接口描述符中的bInterfaceSubClass规定初始化命令。

USB MSD应用规定bInterfaceSubClass=06h,表示本设备将支出SCSI Primary Command-2SPC-2)。在接口描述符中的bInterfaceProtocol=0x50,表示支出BOT协议。如图3所示,BOT传输是以CBW为起始的。设备成功接收了CBW应该有对应的响应。如果在命令传输阶段,主机发现了Bulk-Out端点有STALL, 主机会尝试传输由dCBWDataTransferLengthDirection位定义的剩下的数据字节。设备会通过Bulk-In端点向主机发送CSW

本节我们主要说明MSD支持的SCSI命令。读者可以参考SCSI Primary Commands-3SPC-3)和SCSI Primary Commands-2(SPC-2)规范。CBWCB的第一个字节总是操作码(Operation Codeopcode

     INQUIRYOpcode 12h

INQUIRY命令请求SCSI目标设备向主机发送逻辑单元(logical unit)信息。SPC-3规定即使设备服务器还在忙于其它命令也要回复INQUIRY数据。而且,标准INQUIRY数据应该是无任何媒介访问延迟的。标准INQUIRY数据最少为36个字节。

     READ CAPACITYOpcode 25h

READ CAPACITY命令请求设备的容量和Data-In缓冲的媒体格式。READ CAPACITY命令的响应由4字节的Logical Block Address4字节的块长度组成。返回的Logical Block Address(LBA)是之间访问块设备的最后的逻辑块的LBA。如果逻辑块的数量超过了返回的LBA规定的最大值,设备应将返回的LBA设为FFFFFFFFh

SCSI命令部分待续......



点击此处查看原文 >>

系统分类: 接口电路   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(511)
发表于:2008-6-26 23:38:14
标签:无标签

1

USB Mass Storage 学习笔记(2)

了解了USB Mass Storage BOT的规范。接下来学习一下Microchip 单片机实现USB Mass Storage设备的经典Application Notes。

MICROCHIP AN1003 USB Mass storage Device Using a PIC MCU

pdf

本文描述了使用SD卡来设计实现USB Mass storage设备(MSD)。本文对USB Mass storage方案的开发人员会有很大的帮助。这个应用可以作为独立的MSD或一个SD卡读写器。

本设计有下列组件构成:

     PIC18F4550 MCU

     PICDEM FS USB Demo

     PICtail 板(SDMMC卡)

     Windows操作系统

 

枚举过程

下面总结了USB设备的枚举步骤而且说明了在枚举过程中设备如何从PoweredDefaultAddressConfigured状态。

1.       用户将USB设备插入USB口。Hub给端口供电,设备处于Powered状态。

2.       Hub识别设备。

3.       Hub通过一个终端PIPE去向Host报告event

4.       Host 发送 Get_Port_Status 请求获得关于设备更详细的信息。

5.       Hub识别设备是LowSpeedFullSpeed。并且将Get_Port_Status的响应信息发送给主机。

6.       主机发送Set_Port_Feature请求,要求Hub去复位端口port

7.       Hub复位设备。

8.       主机获悉Full-Speed 设备是否支持High-Speed操作(使用Chirp K信号)。

9.       主机利用Get_Port_Status判断设备是否已经推出Reset状态。

10.   此时,设备处于Default状态(设备已经准备好通过缺省PipeEndpoint0响应控制传输,缺省地址是00h。而且设备可以从总线获得最大100mA)。

11.   主机发送Get_Descriptor 来获得最大封包大小(注意:设备描述符的第八个字节是bMaxPacketSize

12.   主机通过发送Set_Address 请求为设备分配地址。设备现在处于Address状态。

13.   主机发送Get_Descriptor来获得设备的更多的信息。

14.   主机分配并调用一个设备驱动。

15.   主机的设备驱动通过发送一个Set_Configuration请求来选择一个配置。现在设备处于Configured状态。

16.   主机为复合设备的接口分配驱动。

17.   如果hub检测到过流状态,或主机响应hub关闭电源。设备将从USB总线上下电。这时,设备和主机不能通讯而且设备处于Attached状态。

18.   如果设备在总线上有3ms没有动作。它将进入Suspend状态。此时,设备消耗总线上最小的功耗。

 注:这篇AN里,这部分枚举过程的描述比较经典呀!


控制传输

控制传输允许主机和设备交换关于设备配置和其它控制消息的信息。控制传输是由Setup Stage,可选的Data StageStatus Stage组成。

Standard USB Device Requests”总共有11USB 标志控制传输请求。所有的USB设备都必须响应这些请求(即使仅响应了STALL)。处理标志的请求,每个USB类也会定义本类的设备请求。例如:Mass Storage设备要实现Get_Max_LUN请求来使主机能够知道设备支持的逻辑单元数。

 

Mass Storage

Mass Storage类支持两个传输协议:

     Bulk-Only 传输(BOT

     Control/Bulk/Interrupt传输(CBI

Mass Storage类规范定义了两个类规定的请求:Get_Max_LUNMass Storage Reset,所有的Mass Storage类设备都必须支持这两个请求。

Bulk-Only Mass Storage ResetbmRequestType=00100001b and bRequest= 11111111b)用来复位Mass Storage设备及其相关接口。

Get_Max_LUNbmRequestType= 10100001b and bRequest= 11111110b)用来确认设备支持的逻辑单元数。Max LUN的值必须是0~15。注意:LUN是从0开始的。主机不能向不存在的LUN发送CBW

 

支持BOT传输的Mass Storage设备接口描述符要求如下:

bInterfaceClass=08h,表示为Mass Storage设备;

bInterfaceSubClass=06h,表示设备支持SCSI Primary Command-2SPC-2);

bInterfaceProtocol=</