微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 USB Mass Storage 例程调试笔记

STM32 USB Mass Storage 例程调试笔记

时间:11-20 来源:互联网 点击:

向和数量,返回该命令完成的状态,即由设备返回CSW包,端点2用于输出,端点1用于输入数据至主机。CBW的标志是0x55,0x53,0x42,0x43。

在USB主机和设备的通信过程中,数据会先被放到一个大小为512字节的专用SRAM缓冲区里面,然后再传输到主机或者USB设备。

USB主机通过发送 SCSI Read10 Command和SCSI Write10 Command命令来对从机进行读写,分别调用的是SCSI_Read10_Cmd和SCSI_Write10_Cmd函数,最终调用MAL_Read和MAL_Write,在这两个函数中判断是对SD卡还是NANDFLASH进行读写。具体的过程可以参考代码。

四、例程问题现象和解决方法

1.NAND FLASH盘可以被识别,格式化失败。既然NAND FLASH盘可以被识别,那就表明USB的控制传输没出现问题,USB批量传输出问题了,而且最可能的是NAND FLASH的驱动有问题,仔细看完代码,发现在建立坏块表,对Spare 区域进行读操作中,对NAND FLASH 有一个NAND_CMD_AREA_TRUE1命令操作,查看代码,

#define NAND_CMD_AREA_TRUE1 ((u8)0x30)

而30H这个命令在数据手册中找不到,在程序中把这行注释掉,编译代码,下载,还是无法格式化,最后研究了一下手册,在注释代码的这一行加上5微秒的延迟,然后编译,下载,NAND FLASH可移动磁盘可以正常的读写了。

2.SD盘也能被识别,不能格式化。开始用的是2G的SD卡,后来尝试1G和512M的,它们都能用,也就是说,这个SD卡驱动只识别1G和512M的SD卡。

在代码中添加调试信息,结果是写入的块长度出错。通过对读SD卡信息了解到,2G的SD卡,块大小是1024字节,其它的卡都是512字节。我在SDIO例程中设置块大小为1024字节,读写出错,设置512字节,居然是正确的。

USB MassStorage例程中是首先从SD卡中读取SD卡块大小的值,按照这个值来读写SD卡,而实际上2G的SD卡只能按照512字节来读写。所以在读取块大小的值后,把块的大小除以2,块数目乘以2,卡的总容量不变,程序运行后,一切正常了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top