如何用51单片机作简易U盘
nichengyan2023/11/12计算机电子学 IP:天津

        好早就想自己整个U盘这个向同学显摆。但有几个关键问题让想法仅还是想法。


        用51做优盘,若用io模拟时序了话USB协议首先把我劝退,大篇幅的文档着实抽象💀💀💀。另外据所知网上用51做优盘的确实不多,一搜单片机优盘,出的大多是stm32方案,51资料少。


        直到在宏晶官网瞟见8h8k64u的宣传资料,这货带usb!而且它的开发板例程里就有个是msc(大容量储存设备)应用。


        那就简单了啊!

        

        材料.硬件:stc8h8k64u单片机(本人用的是40脚直插)、25Q80闪存芯片(尽量买新的吧,拆的可能写保护)、sop8-dip8转接板、usb头(♂)、1117稳压ic、led*2。

        材料.软件:stc8h8k64u试验箱v9.6资料、stc_isp和下载器、keil

        找到试验箱资料里的msc示例项目,按照实验箱电路图里的接法把flashh挂在硬件spi2脚位上,其中wp脚直接接3v3即可,上上拉电阻可省略。


jixian.jpg

再接两颗led到任意io口,显示状态用。如果要usb下载了话,再焊一个按钮就好了。

微信图片_202311121052321.jpg 微信图片_20231112105232.jpg

       搭好外围电路,预先跑一个flash测试程序,无误。编译烧录、插入电脑,只听插入时电脑发出愉快的叫声,不一会资源管理器也显示出了可移动磁盘字样,,,

诶,但是怎么格式化不了呢???

       插入电脑后声音正确说明usb部分工作了,但没法读写很明显是flash驱动这块有毛病。例程里flash物理层对应的是memeory.c和memory.h两个文件。

       其中BOOL flash_check()是用来检测flash类型的。根据代码不难看出它通过读取3字节的id,只识别华邦(W)、兆易(GD)的spiflash,并且容量也只支持128,256,512,1024kbyte。如果你的flash型号和容量不符合要求,那ckeck_flash就会不通过,usb握手后程序也不会再往下进行;只要把if里面的判断条件改为恒成立,就可以让它强制支持你的flash了。

        而static BYTE shift(BYTE dat)是读写函数,里面用的是硬件spi2口读写flash。因为某些的原因(我也很发迷,还得等大佬来解答)硬件spi读取flash总是失败,读到的一直是0xff,check_flash也自然不会通过。没办法,就手写了个io模拟spi替换掉原来的shift函数,然后就顺利通过check_flash,顺利往下进行了。(可以在语句中加入led闪烁来判断是否运行到这一步,也可以让两个led以iic的时序慢速闪烁来显示变量二进制信息)

微信图片_202311121052301.jpg

        把flash调通了,U盘也就能用了。插上电脑等一小会就会提示你格式化。格式化完就可以正常使用了!当然,因为是8位

主控加软件spi,速度快不到哪去,还会弄得电脑很卡。经测试写入速度可达50kb/s(频率拉到40Mhz时),读取速度只会比这更快。

  

微信图片_202311121052331 - 副本.jpg

微信图片_20231112105235.jpg

微信图片_20231112113103.jpg

还有好多好玩的呢-------

如果想让电脑识别出不同的东西,可以去scsi.c里改;

如果想改变容量,分区大小,可以去memory.c里改;

如果想更换存储介质,比如把flash换成sd卡搞一个简易读卡器,就可以接驳自己的物理层读写函数。

如果想实现只读,就把写操作嘎掉就好了(电脑会报错或者直接就卡到那不让你删除)。

如果.........总之大家尽情探索吧,把这个代码摸透彻对学习软硬件都很有帮助呢


总之官方例程的移植还算是顺利,要是上网多买个stc8h8k64u的16脚贴片款,再多来点spiflash,就能批量制作了(滑稽)


last but not the least,这个优盘的寿命估计不会很长。根据代码很容易看出,致命的一点是它并没有支持坏块和磨损平衡(所以才叫它简易优盘,,)。也就是说较靠前的那些扇区会被反复擦写,最先爆金币,然后因为没有坏块管理整个盘就会因此而报废。当然,just for fun了话数十万次的擦写寿命也就够用了。

+0.49  科创币    山雨欲来风满楼    2023/11/12 😋有意思
来自:计算机科学 / 计算机电子学动手实践:实验报导
8
9
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
山雨欲来风满楼
5个月16天前 IP:海南
926901

最近也有这个想法……读卡器坏了,想拿Raspberry Pi Pico做一个读卡器使使,结果看了一眼USB协议,直接被劝退了😥它自带的那个MicroUSB好像没法用,只能传固件或者烧录程序。

……好麻烦


引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
The_integral_of_ix
5个月16天前 IP:山西
926911

好玩,正好最近在学51 sticker

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
smith
5个月16天前 IP:广东
926912

现在的带usb phy还好了, 我读书的时候, 是用的外挂usb phy的, 如果有老的IDE硬盘, 还可以用GPIO模拟IDE时序驱动硬盘, 就成移动硬盘了

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
nichengyan作者
5个月13天前 IP:天津
927000

优盘的读写速度和flash性能直接挂钩。如果用的flash非常垃圾了话----- IMG_20231116_133042.jpg IMG_20231116_133111.jpg

就会出现罕见的字节级读写速度(这我之前还真没见过呢。)

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
nichengyan作者
5个月13天前 IP:天津
927001

Flash 采用的是24位地址,理论上来说W25Q256之前的容量都是可以用的。此外还偶然发现,flash容量越大,U盘读写速度越拉胯。4M的明显慢于2M的,而他们都比不上1M的

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
chadJ
5个月12天前 IP:陕西
927010

还是赶紧换stm32,资源多用SD卡挂载为u盘很好搞。

stc的小单片机还是很好用得,之前需要做一个断电保存参数的功能,用stc8x加两个电容,引出TxRx解决,够用就行

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
20!Dopaminor
5个月12天前 修改于 5个月12天前 IP:广东
927016

https://www.kechuang.org/t/72361    stm32版本  15年金坷居士做的

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
cdyqj
5个月10天前 IP:云南
927063

20年以前我搞过at89s51芯片加上PHY做路由器,速度很慢,只能达到5KB,基本没啥用,而且只能实现基础的tcp/IP协议,没啥用

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}