找回密码
 立即注册
查看: 2382|回复: 17

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

[复制链接]
  • TA的每日心情
    开心
    前天 23:14
  • 签到天数: 127 天

    [LV.7]常住居民III

    13

    主题

    52

    回帖

    1342

    积分

    金牌会员

    积分
    1342
    发表于 2023-6-21 09:44:50 | 显示全部楼层 |阅读模式
        单片机本身的代码空间终归是有限的,很多应用和数据都需要大容量存储。目前单片机常用的存储器有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

    01

    01.png

        对应配置SPI硬件的寄存器SPI_S[1:0]=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

    02

    02.png

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

    03

    03


    03.jpg

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

    04

    04


    04.jpg

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

    05

    05


    05.jpg

    06

    06

    06.jpg

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

    07

    07


    07.jpg

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

    08

    08


    08.jpg

    09

    09

    09.jpg

    10

    10

    10.jpg

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

    11

    11


    11.jpg

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

    12

    12

    12.jpg

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

    13

    13

    13.jpg

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

    附件:
    修改65-模拟U盘(Mass Storage Class)代码.rar (26.91 KB, 下载次数: 99)

    STC模拟U盘512KB带16x16字库镜像.rar (212.31 KB, 下载次数: 79)



    1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-29 09:35
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    14

    主题

    65

    回帖

    419

    积分

    荣誉版主

    积分
    419
    发表于 2023-6-21 13:42:36 | 显示全部楼层
    fat12其实太老了。4k的蔟大小,用fat16就ok了

    点评

    4K是扇区大小,要跟底层芯片一致,不然每次写入都拆成几个扇区,寿命降几倍。  发表于 2023-6-21 14:43
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 23:14
  • 签到天数: 127 天

    [LV.7]常住居民III

    13

    主题

    52

    回帖

    1342

    积分

    金牌会员

    积分
    1342
     楼主| 发表于 2023-6-21 14:42:47 | 显示全部楼层
    沈洁 发表于 2023-6-21 13:42
    fat12其实太老了。4k的蔟大小,用fat16就ok了

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

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 90 天

    [LV.6]常住居民II

    38

    主题

    986

    回帖

    6773

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6773
    QQ
    发表于 2023-6-30 09:35:21 | 显示全部楼层
    感谢飞哥,一下格局打开了。以前都是习惯了用串口更新数据,现在换模拟U盘更新flash数据了
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 23:14
  • 签到天数: 127 天

    [LV.7]常住居民III

    13

    主题

    52

    回帖

    1342

    积分

    金牌会员

    积分
    1342
     楼主| 发表于 2023-6-30 10:23:01 | 显示全部楼层
    电子DIY小家 发表于 2023-6-30 09:35
    感谢飞哥,一下格局打开了。以前都是习惯了用串口更新数据,现在换模拟U盘更新flash数据了
    {:4_16 ...

    不客气的。等我的字库教程出来就可以开心显示各种文字了。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9299

    回帖

    1万

    积分

    管理员

    积分
    14049
    发表于 2023-7-2 22:32:33 | 显示全部楼层
    建议飞哥加上:
    TFT320240显示, TFT480320显示,
    省钱也可以用OLED12864来显示
    屏可以从下面这懂 屏的技术的 淘宝店获得
    https://KCER001.taobao.com
    据说这个店家发出来的屏都能正常使用,还有各种配套演示程序

    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 23:14
  • 签到天数: 127 天

    [LV.7]常住居民III

    13

    主题

    52

    回帖

    1342

    积分

    金牌会员

    积分
    1342
     楼主| 发表于 2023-7-3 21:07:52 | 显示全部楼层
    字库教程来了,欢迎学习研究:

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-2-26 14:31
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    2

    主题

    23

    回帖

    166

    积分

    注册会员

    积分
    166
    发表于 2023-7-24 18:53:13 | 显示全部楼层
    飞哥 发表于 2023-6-30 10:23
    不客气的。等我的字库教程出来就可以开心显示各种文字了。

    坐等飞哥更新啊
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 23:14
  • 签到天数: 127 天

    [LV.7]常住居民III

    13

    主题

    52

    回帖

    1342

    积分

    金牌会员

    积分
    1342
     楼主| 发表于 2023-7-25 07:00:35 | 显示全部楼层

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-2-26 14:31
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    2

    主题

    23

    回帖

    166

    积分

    注册会员

    积分
    166
    发表于 2023-8-17 08:40:43 | 显示全部楼层
    飞哥 发表于 2023-7-25 07:00
    GB2312/GBK的基础实验已经发在上面的帖子链接了。UNICODE的差不多等于工程重写,编码间的共存问题差点把 ...

    确实UTF编码是另外一种规则了,事出必有因,飞哥做这些驱动和功能是不是有个大的项目计划?
    回复 支持 1 反对 0 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-3 12:28 , Processed in 0.078372 second(s), 73 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表