文号
926895
阅读
16969
回复
8
收藏
1
如何用51单片机作简易U盘
2023/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
😋有意思
nichengyan作者
2年11个月前IP:天津
927000
4楼

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

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

引用
评论
nichengyan作者
2年11个月前IP:天津
927001
5楼

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

引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的