EDN首页   博客首页

3

关于投票
USB Mass Storage 学习笔记(5)

本文PDF文档下载

此外,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)通过下式计算:

<!--[if !supportLists]-->     <!--[endif]-->READ_BL_LEN=WRTIE_BL_LEN

<!--[if !supportLists]-->     <!--[endif]-->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)可以给我留言或短消息。

后面的章节就要进入实验了。希望大家能跟我一起学下去.....
系统分类: 接口电路
用户分类: 无分类
标签: USB Mass Storage
来源: 原创
发表评论 阅读全文(796) | 回复(2)

3

关于投票
选择正确的电平转换方案(二)

本文PDF文档下载

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开关的好处:

<!--[if !supportLists]-->     <!--[endif]-->很短的传播时延

<!--[if !supportLists]-->     <!--[endif]-->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电平是可用的。但是这种应用有两个弊端:

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

<!--[if !supportLists]-->2.       <!--[endif]-->因为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)器件,在双向应用中就不用方向控制了。

点击看大图

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


系统分类: 接口电路
用户分类: 无分类
标签: Level shifter 电平转换 接口
来源: 原创
发表评论 阅读全文(489) | 回复(0)
总共 , 当前 /