飞哥 发表于 2023-6-21 09:44:50

U盘-STC-USB,将SPI Flash存储器模拟成U盘,简单快速下载字库图片数据教程

    单片机本身的代码空间终归是有限的,很多应用和数据都需要大容量存储。目前单片机常用的存储器有Flash芯片、SD卡、U盘等。每种存储器都有其特点:Flash芯片容量合适、可以带文件系统也可以不带、适合内置,SD卡一般都搭配文件系统、需使用卡槽、适合拆卸、可跨平台使用,U盘需要USB HOST去驱动、适合外带。以25系列SPI NAND flash芯片为主的存储器在很多场合都得到广泛应用。由于STC8H8K64U、STC32G12K128等单片机均已集成USB DEVICE和SPI硬件,这里我们以W25Q40为例,使用SPI硬件功能读写NAND flash芯片,下载相应固件就可以将其模拟成1个小U盘,利用USB硬件实现与电脑的连接。我们先演示制作一个带字库的模拟U盘,在下一个帖子中将会用到。STC单片机与25系列SPI flash存储芯片硬件连接很简单,通信接口均有外部上拉电阻(也可使能单片机内部上拉电阻实现);芯片3.3V供电,单片机IO口兼容3.3V电平,直连即可。如下:

SPI-      SS      MOSI      MISO      SCLK      -
IO口      P2.2      P2.3      P2.4      P2.5      P5.3
W25      1脚CE      5脚SI      2脚SO      6脚SCK      3脚WP

01.png

    对应配置SPI硬件的寄存器SPI_S=01,位于寄存器P_SW1中。WP脚为写保护,未用悬空上拉即可。25系列SPI NAND flash存储芯片支持SPI、QPI等通信方式,由Q或者X等区分,如果是SPI方式就通用。通过发指令(0x9F)读取芯片的JEDEC ID,可以获取对应的厂家、通信方式、容量等信息。

第3字节      型号      容量Mbit
0x11      25x10      1
0x12      25x20      2
0x13      25x40      4      
0x14      25x80      8                        
0x15      25x16      16
0x16      25x32      32
0x17      25x64      64
0x18      25x128      128
0x19      25x256      256

    这里写的25x与25Q容量一样,因为8Mbit=1MB,那么W25x40就是512KB。约7千个汉字的16*16点阵GB2312字库占用240多KB(不算空位),W25x40刚好够,还有些许剩余。若要更大更多字库就得换W25x64等存储器。把STC8H8K64U V9.3实验箱提供的例程“65-模拟U盘(Mass Storage Class)协议范例”稍微修改,以便支持多个厂家和识别多个容量。修改后的代码见附件,欢迎帮测试和继续完善。因为用到USB功能,在下载时选择24MHz时钟。下载后单片机的P3.0、P3.1就是USB的D-、D+,通过USB-A双头USB线或者Micro/TypeC USB线直连电脑的USB口,而不需要USB转串口等工具。

02.png

    图为STC8H8K64U 9.3实验箱连接电脑,实验箱下面的是STC一箭双雕模块,用来接实验箱USB口转串口临时测试用。若烧录了USB-CDC串口代码则可略过了。其它STC开发板也可以照着图修改下。


03.jpg

    连接到电脑后,不用另外安装驱动,就会出现一个“可移动磁盘”。此时的模拟U盘是没有任何数据和文件系统的,为RAW状态,需要分区和格式化或者恢复镜像后才能正常使用。


04.jpg

可以用“DiskGenius”软件,也可以用Windows系统自带的磁盘工具进行分区与格式化。两者实际是有点区别,“DiskGenius”会把第0扇区分成一个起始扇区(占用4096字节),里面有MBR引导信息,实际可用的分区会从第1扇区(0x1000地址)开始,浪费了没必要。要格式化成FAT12文件系统(FAT12和FAT16都称为FAT文件系统),同时还要选择扇区大小为4KB,跟25系列可擦除扇区大小一致。


05.jpg


06.jpg

    再打开U盘文件夹,把字库文件拷入这个模拟U盘的根目录。这里推荐用“WinHex19.8”恢复已经制作好的带字库的U盘镜像:


07.jpg

    点击菜单→文件→恢复镜像文件→打开解压出来的镜像文件“STC USB-Mass-Storage.001”→在弹出的“选择目标盘”对话框选择 物理驱动器的“RM1: STC USB-Mass-Storage (512 KB, USB)”→确定→恢复完成后提示“128个扇区被成功复制”→关闭“移动存储介质1”。


08.jpg


09.jpg


10.jpg

    然后插拔一下USB线或者给实验箱断电上电,在资源管理器里出现了这个带字库的模拟U盘。


11.jpg

    以上几秒钟就写入好了,这样就完成了文件系统的制作和字库文件的下载。顺带一提,这个代码还可以把开发板当成25系列读写器,^_^。
    这个带有文件系统的SPI flash芯片,读写都应遵循FAT文件系统的要求进行。增、删、改文件会对文件分配表进行修改,需要给单片机跑嵌入式的文件系统代码。而且flash有写入寿命,不可对同一个扇区擦写次数过多。如果单片机只是读取不需修改的文件系统里的文件,可采取在电脑上用WinHex查看模拟U盘的内容,确定对应文件所在地址。方法为:点击“菜单”→工具→打开磁盘→选择物理驱动器的“RM1: STC USB-Mass-Storage (512 KB, USB)”。

12.jpg

    之前在根目录里存放的“16.DZK”这个字库文件,通过WinHex可以看到文件系统的主引导记录MBR(也就是起始扇区)是否存于地址0x000000,这里没有。然后就是分区(volume)位于0x000000,分区包括引导扇区DBR和数据记录。双击打开分区,可以看到接下来的记录数据有根目录、16.DZK文件,以及未显示的文件分配表、保留扇区等等,后续的记录数据都从这个分区开始,故物理地址都得把分区的相对偏移加上MBR(这里为0x000000)。再点击“16.DZK”文件直接跳过去,看到相对偏移为0x007000,得出那个文件的实际绝对地址 =0x000000+0x007000 =0x007000。

13.jpg

    之前的镜像已经固定这个地址就在程序里直接调用即可,如果是自己复制文件到模拟U盘的话就在程序里改下那两个地址。接下来把实际地址给SPI_Read_Nbytes()函数进行调用,把32字节的字模数据读到缓存中即可。发送的地址为SPI flash的真实物理地址,跟是否有文件系统无关。
    其它文件的存储与寻址也同理。关于FAT文件系统具体内容,可百度搜索了解下原理与数据结构,也可以搜索开源的ZNFAT、FATFS、SPIFFS等文件系统。有了这些基础,放几张图片和读取也容易了。接下来的一个帖子,会教你把这个字库文件在液晶屏上显示出来。

附件:






沈洁 发表于 2023-6-21 13:42:36

fat12其实太老了。4k的蔟大小,用fat16就ok了

飞哥 发表于 2023-6-21 14:42:47

沈洁 发表于 2023-6-21 13:42
fat12其实太老了。4k的蔟大小,用fat16就ok了

太小的存储器只能用FAT12,用FAT16反而事倍功半。其实也存放不了几个文件。

电子DIY小家 发表于 2023-6-30 09:35:21

{:4_197:}感谢飞哥,一下格局打开了。以前都是习惯了用串口更新数据,现在换模拟U盘更新flash数据了
{:4_165:}

飞哥 发表于 2023-6-30 10:23:01

电子DIY小家 发表于 2023-6-30 09:35
感谢飞哥,一下格局打开了。以前都是习惯了用串口更新数据,现在换模拟U盘更新flash数据了
{:4_16 ...

不客气的。等我的字库教程出来就可以开心显示各种文字了。{:biggrin:}

神农鼎 发表于 2023-7-2 22:32:33

建议飞哥加上:
TFT320240显示, TFT480320显示,
省钱也可以用OLED12864来显示
屏可以从下面这懂 屏的技术的 淘宝店获得
https://KCER001.taobao.com
据说这个店家发出来的屏都能正常使用,还有各种配套演示程序

飞哥 发表于 2023-7-3 21:07:52

字库教程来了,欢迎学习研究:

汉字编码简介与点阵字库在液晶屏的显示实验
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=2769

bogejiayou 发表于 2023-7-24 18:53:13

飞哥 发表于 2023-6-30 10:23
不客气的。等我的字库教程出来就可以开心显示各种文字了。

坐等飞哥更新啊

飞哥 发表于 2023-7-25 07:00:35

bogejiayou 发表于 2023-7-24 18:53
坐等飞哥更新啊

GB2312/GBK的基础实验已经发在上面的帖子链接了。UNICODE的差不多等于工程重写,编码间的共存问题差点把自己绕进去,已经写出来了只差个应用。正在加入FAT,用于显示长、短文件名(混编码),比预期复杂。GB18030的跟UNICODE差不多,出来一套其它就照着套。

bogejiayou 发表于 2023-8-17 08:40:43

飞哥 发表于 2023-7-25 07:00
GB2312/GBK的基础实验已经发在上面的帖子链接了。UNICODE的差不多等于工程重写,编码间的共存问题差点把 ...

确实UTF编码是另外一种规则了,事出必有因,飞哥做这些驱动和功能是不是有个大的项目计划?
页: [1] 2
查看完整版本: U盘-STC-USB,将SPI Flash存储器模拟成U盘,简单快速下载字库图片数据教程