「正点原子NANO STM32F103开发板资料连载 第32章 USB 读卡器实

科技网编2023-05-11 16:161720
设备及其相关接口。支持 BOT 传输的 Mass 设备接口描述符要求如下。表示设备支持 SCSI -2(SPC-2),前两种需要使用中断传输,Bulk-In 端点用来从设备向主机传送数据(本章用端点 1 实现),端点用来从主机向设备传送数据(本章用端点 2 实现)。我们在官方例程的基础上,并打印在串口调试助手(如果不存在,我们在第二十四章(实验 19)的基础上修改;

用读卡器怎样下载歌曲_读卡器怎么用_tf读卡器干嘛用

第三十二章 USB 读卡器实验

上一章我们向大家介绍了如何利用 STM32 的 USB 来做一个 USB 虚拟串口,本章我们将利用 STM32 的 USB 来做一个 USB 读卡器。本章分为如下几个部分:

32.1 USB 读卡器简介

32.2 硬件设计

323 软件设计

32.4 下载验证

32.1 USB 读卡器简介

NANO STM32 开发板板载了一个 2M 字节的 SPI FLASH 芯片,通过 STM32

的 USB 接口,我们可以实现一个简单的 USB 读卡器,来读写 SPI FLASH。

本章我们还是通过移植官方的 USB 例程来实现,该例程在 MDK 的安装目录

下可以找到(..\MDK\ARM\\ST\\Demos\)。

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

1)Bulk-Only 传输(BOT)

2)/Bulk/ 传输(CBI)

Mass 类规范定义了两个类规定的请求: 和 Mass Reset,所有

的 Mass 类设备都必须支持这两个请求。

(= and = )用来确认设备支持

的逻辑单元数。Max LUN 的值必须是 0~15。注意:LUN 是从 0 开始的。主机不能向不存在的

LUN 发送 CBW,本章我们定义 Max LUN 的值为 1,即代表 2 个逻辑单元。

Mass Reset(= and = )用来复位 Mass

设备及其相关接口。

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

接口类代码 =08h,表示为 Mass 设备;

接口类子代码 =06h,表示设备支持 SCSI -2(SPC-2);

协议代码 有 3 种:0x00、0x01、0x50,前两种需要使用中断传输,最后

一种仅使用批量传输(BOT)。

支持 BOT 的设备必须支持最少 3 个 :, Bulk-In 和 Bulk-Out。USB2.0 的规

范定义了控制端点 0。Bulk-In 端点用来从设备向主机传送数据(本章用端点 1 实现)。Bulk-Out

端点用来从主机向设备传送数据(本章用端点 2 实现)。

ST 官方的例程是通过 USB 来读写 SD 卡(SDIO 方式)和 NAND FALSH,支持 2 个逻辑

单元,我们在官方例程的基础上,只需要修改删除 SD 驱动部分代码,并将对 NAND FLASH

的操作修改为对 SPI FLASH 的操作。只要这两步完成了,剩下的就比较简单了,对底层磁盘的

读写,都是在 .c 文件实现的,所以我们只需要修改该函数的 、、

和 等 4 个函数,使之与我们的 SPI FLASH 对应起来即可。

32.2 硬件设计

本节实验功能简介:开机的时候先检测 SPI FLASH 是否存在,如果存在则获取其容量,

并打印在串口调试助手(如果不存在,则报错)。之后开始 USB 配置,在配置成功之后就可

以在电脑上发现两个可移动磁盘。我们用 DS1 来指示 USB 正在读写 SPI FLASH,并在串口助

手显示出来,同样我们还是用 DS0 来指示程序正在运行。

所要用到的硬件资源如下:

1) 指示灯 DS0 、DS1

2) 串口

3) USB SLAVE 接口

4) SPI FLASH

这几个部分,在之前的实例中都已经介绍过了,我们在此就不多说了。

32.3 软件设计

本章,我们在第二十四章(实验 19)的基础上修改,首先打开实验 19 的工程,在

文件夹所在的文件夹下新建一个 USB 的文件夹,并拷贝官方 USB 驱动库相关代

码到该文件夹下,即拷贝:光盘 → 8,STM32 参考资料→STM32 USB 学习资料→

-FS-.0.0→ 文件夹下的 -FS- 文件

夹到该文件夹下面。

然后,在 USB 文件夹下面新建 文件夹,用来存放 USB 读卡器实现的相关代码,

拷贝自:-FS-.0.0→→→src 和 inc 文件夹。注意:

部分代码是有修改的,并非完全照抄官方代码,具体代码我们就不细说了(详见光盘本例程源

码)。

接下来,我们在工程文件里面新建 和 分组,分别加入:

USB\-FS-\src 下面的代码和 USB\ 下面的代码。然后把

USB\-FS-\inc 和 USB\ 文件夹加入头文件包含路径。

打开 main.c 文件,我们修改 main 函数如下:

int main(void)

{

u8 =0;

u8 tct=0;

u8 ;

u8 ;

(); //初始化 HAL 库

(); //设置时钟,72M

(72); //初始化延时函数

();

//串口初始化为

();

//初始化与 LED 连接的硬件接口

("NANO STM32\r\n");

("DHT11 TEST\r\n");

();

//按键初始化

("NANO STM32\r\n");

("USB Card TEST\r\n");

();

if(!=) (" Error!\r\n");//检测 SPI FLASH 错误

else //SPI FLASH 正常

{

[0]=2048*1024;//前 2M 字节

[0] =512;

[0]=[0]/[0];

("SPI FLASH Size:\r\n");

}

(1800);

(0); //USB 先断开

(300);

(1); //USB 再次连接

("USB ...\r\n");//提示 USB 连接中

=(*2*4);

//为 USB 数据缓存区申请内存

=();

//申请内存

//USB 配置

g();

();

();

(1800);

while(1)

{

(1);

if(!=)//状态改变了

{

if(&0x01)//正在写

{

("USB ...\r\n");//提示 USB 正在写入数据

}

if(&0x02)//正在读

{

("USB ...\r\n");//提示 USB 正在读出数据

}

if(&0x04)("USB Write Err\r\n");//提示写入错误

if(&0x08)("USB Read Err\r\n");//提示读出错误

=;//记录最后的状态

}

if(!=)

{

if(==) ("USB \r\n");

//提示 USB 连接已经建立

else ("USB \r\n");//提示 USB 被拔出了

=;

}

tct++;

if(tct==200)

{

tct=0;

LED0=!LED0;//提示系统在运行

if(&0x10)

{

=0;//USB 连接了,则清除 计数器

=;

}else//没有得到轮询

{

++;

if(>10)=;

//2s 内没收到在线标记,代表 USB 被拔出了

}

=0;

}

}

}

通过此部分代码就可以实现了我们之前在硬件设计部分描述的功能,这里我们用到了一个

全局变量 ,用来标记 USB 的相关状态,这样我们就可以在串口调试助手查

看当前 USB 的状态了。

软件设计部分就为大家介绍到这里。

32.4 下载验证

在代码编译成功之后,我们通过下载代码 NANO 开发板上,在 USB 配置成功

后(注意:USB 数据线,要插在开发板的 口!),串口助手打印如图 32.4.1 所示:

tf读卡器干嘛用_读卡器怎么用_用读卡器怎样下载歌曲

图 32.4.1 USB 连接成功

此时,电脑提示发现新硬件,并自动安装驱动,如图 32.4.2 所示:

图 32.4.2 USB 读卡器被电脑找到

等 USB 配置成功后,DS1 不亮,DS0 闪烁,并且在电脑上可以看到我们的磁盘,如图 32.4.3

所示:

用读卡器怎样下载歌曲_tf读卡器干嘛用_读卡器怎么用

图 32.4.3 电脑找到 USB 读卡器的两个盘符

我们打开设备管理器,在通用串行总线控制器里面可以发现多出了一个 USB Mass

,同时看到磁盘驱动器里面多了 1 个磁盘,如图 32.4.4 所示:

图 32.4.4 通过设备管理器查看磁盘驱动器

此时,我们就可以通过电脑读写 SPI FLASH 里面的内容了。在执行读写操作的时候,就可

以看到 DS1 亮,并且会在串口调试助手上打印当前的读写状态。

注意,在对 SPI FLASH 操作的时候,最好不要频繁的往里面写数据,否则很容易将 SPI

FLASH 写爆!!

评论区