STM32 DIY“古老”U盘

[复制链接]
 楼主| qinshi1208 发表于 2009-7-7 17:15 | 显示全部楼层 |阅读模式
最近做一个STM32的USB,看到古道热肠AT45DB161搞成了一个“古老的U盘”,手头有几片那样的SPI&nbsp;FLASH,也想搞搞,但是遇到了些问题,如下:<br />&nbsp;&nbsp;&nbsp;&nbsp;移植的是STM32的USB库Mass&nbsp;Storage,读写AT45DB161的用了古道热肠的,读写都可以。也能格式化。<br />https://bbs.21ic.com/upfiles/img/20097/20097717936608.jpg<br />打开做的U盘,有:<br />&nbsp;https://bbs.21ic.com/upfiles/img/20097/200977171022425.jpg<br />按文件名以及在WinHex中看到的<br />&nbsp;https://bbs.21ic.com/upfiles/img/20097/200977171038923.jpg<br />发现是offset&nbsp;0中的数据<br />在U盘里建立一个文本文档<br />&nbsp;https://bbs.21ic.com/upfiles/img/20097/200977171052287.jpg<br />保存后,U盘里多了很多东西<br />&nbsp;https://bbs.21ic.com/upfiles/img/20097/20097717115984.jpg<br />很奇怪,其中的文件名称和在WinHex中看到的数据一样,怀疑就是读了那数据出来的。比如那个文件夹any&nbsp;key.to就是<br />&nbsp;https://bbs.21ic.com/upfiles/img/20097/200977171121313.jpg<br />1E0的内容<br />本应是FAT12字符的部分,在建立文本文档后也变成了<br />&nbsp;https://bbs.21ic.com/upfiles/img/20097/200977171135913.jpg<br /><br />我个人认为可能是USB读写FLASH过程中出了点问题<br />这是读函数<br />void&nbsp;Read_Memory(void)<br />{<br /><br />&nbsp;&nbsp;if&nbsp;(!Block_Read_count)&nbsp;&nbsp;//块读计数不为0<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;#ifdef&nbsp;_USE_MSD<br />&nbsp;&nbsp;&nbsp;&nbsp;MSD_ReadBlock(Data_Buffer,&nbsp;Memory_Offset,&nbsp;512);<br />&nbsp;&nbsp;#else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Read_Memory&nbsp;Block_offset:0x%x
&quot;,Memory_Offset);<br />&nbsp;&nbsp;&nbsp;&nbsp;DataFlash_ReadSector(Memory_Offset,Data_Buffer&nbsp;);<br />&nbsp;&nbsp;#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;UserToPMABufferCopy(Data_Buffer,&nbsp;ENDP1_TXADDR,&nbsp;BULK_MAX_PACKET_SIZE);<br />&nbsp;&nbsp;&nbsp;&nbsp;Block_Read_count&nbsp;=&nbsp;512&nbsp;-&nbsp;BULK_MAX_PACKET_SIZE;<br />&nbsp;&nbsp;&nbsp;&nbsp;Block_offset&nbsp;=&nbsp;BULK_MAX_PACKET_SIZE;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;UserToPMABufferCopy(Data_Buffer&nbsp;+&nbsp;Block_offset,&nbsp;ENDP1_TXADDR,&nbsp;BULK_MAX_PACKET_SIZE);<br />&nbsp;&nbsp;&nbsp;&nbsp;Block_Read_count&nbsp;-=&nbsp;BULK_MAX_PACKET_SIZE;<br />&nbsp;&nbsp;&nbsp;&nbsp;Block_offset&nbsp;+=&nbsp;BULK_MAX_PACKET_SIZE;<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;SetEPTxCount(ENDP1,&nbsp;BULK_MAX_PACKET_SIZE);<br />&nbsp;&nbsp;SetEPTxStatus(ENDP1,&nbsp;EP_TX_VALID);<br /><br /><br />&nbsp;&nbsp;Memory_Offset&nbsp;+=&nbsp;BULK_MAX_PACKET_SIZE;<br />&nbsp;&nbsp;Transfer_Length&nbsp;-=&nbsp;BULK_MAX_PACKET_SIZE;<br /><br />&nbsp;&nbsp;CSW.dDataResidue&nbsp;-=&nbsp;BULK_MAX_PACKET_SIZE;<br />&nbsp;&nbsp;Led_RW_ON();<br /><br />&nbsp;&nbsp;if&nbsp;(Transfer_Length&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Block_Read_count&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;Block_offset&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;Memory_Offset&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;Bot_State&nbsp;=&nbsp;BOT_DATA_IN_LAST;<br />&nbsp;&nbsp;&nbsp;&nbsp;Led_RW_OFF();<br />&nbsp;&nbsp;}<br />}<br /><br />这个是写函数<br />void&nbsp;Write_Memory(void)<br />{<br />&nbsp;&nbsp;u32&nbsp;temp&nbsp;=&nbsp;&nbsp;Counter&nbsp;+&nbsp;64;<br /><br /><br />&nbsp;&nbsp;i&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;for&nbsp;(;&nbsp;Counter&nbsp;&lt&nbsp;temp;&nbsp;Counter++)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Data_Buffer[Counter]&nbsp;=&nbsp;Bulk_Data_Buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;Memory_Offset&nbsp;+=&nbsp;Data_Len;<br />&nbsp;&nbsp;Transfer_Length&nbsp;-=&nbsp;Data_Len;<br /><br />&nbsp;&nbsp;if&nbsp;(!(Transfer_Length&nbsp;%&nbsp;512))<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Counter&nbsp;=&nbsp;0;<br />#ifdef&nbsp;_USE_MSD<br />&nbsp;&nbsp;&nbsp;&nbsp;MSD_WriteBlock(Data_Buffer,&nbsp;Memory_Offset&nbsp;-&nbsp;512,&nbsp;512);<br />#else<br />&nbsp;&nbsp;&nbsp;&nbsp;DataFlash_WriteSector(Memory_Offset&nbsp;-&nbsp;512,Data_Buffer);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Write_Memory:
Memory_Offset0x%x-&nbsp;0x200=0x%x
&quot;,Memory_Offset,(Memory_Offset&nbsp;-512));<br />#endif<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;CSW.dDataResidue&nbsp;-=&nbsp;Data_Len;<br />&nbsp;&nbsp;SetEPRxStatus(ENDP2,&nbsp;EP_RX_VALID);&nbsp;/*&nbsp;enable&nbsp;the&nbsp;next&nbsp;transaction*/<br /><br />&nbsp;&nbsp;Led_RW_ON();<br /><br />&nbsp;&nbsp;if&nbsp;((Transfer_Length&nbsp;==&nbsp;0)&nbsp;||&nbsp;(Bot_State&nbsp;==&nbsp;BOT_CSW_Send))<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Counter&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;Set_CSW&nbsp;(CSW_CMD_PASSED,&nbsp;SEND_CSW_ENABLE);<br />&nbsp;&nbsp;&nbsp;&nbsp;Led_RW_OFF();<br />&nbsp;&nbsp;}<br />}<br /><br />帮忙看看这个问题,好想我这个也类似古老的U盘也能跑起来,希望得到指点。特别是搞出来过的古道热肠&nbsp;&nbsp;!<br />
xwj 发表于 2009-7-7 17:22 | 显示全部楼层

目录表错位了

  
 楼主| qinshi1208 发表于 2009-7-7 17:41 | 显示全部楼层

谢谢楼上

头一次发这么多图片上来,不知道怎么搞的图片没了,哎~~&nbsp;以后多发帖~~<br /><br />谢谢楼上,哪么该如何修改呢?
古道热肠 发表于 2009-7-7 17:41 | 显示全部楼层

注意写扇区一定要写成功

AT45DB161D写扇区一定要等待的.<br />可以先等它写完后再返回主调函数.<br />也可以在下次读或写之前查忙.<br />您先用每一种方式调,效率较低,但很可靠.
 楼主| qinshi1208 发表于 2009-7-7 17:45 | 显示全部楼层

谢过

我借鉴的是您的读写函数,里面有查忙的函数呀。
古道热肠 发表于 2009-7-8 10:11 | 显示全部楼层

您再用BusHound跟踪一下通讯过程.

您离成功只有一步之遥了,自己多试试吧.
 楼主| qinshi1208 发表于 2009-7-8 16:44 | 显示全部楼层

奇怪

今天看了看,发现格式化成功后只有FAT12的引导扇区,FAT1里面也是和引导扇区的内容一样的。<br />&nbsp;&nbsp;古道热肠是否能帮忙将你的引导扇区和文件分配表等截图上来看看。谢谢
 楼主| qinshi1208 发表于 2009-7-9 15:05 | 显示全部楼层

谢谢各位

谢谢各位的帮助~!<br />慢慢摸索,总于将其搞定~~~<br />呵呵
古道热肠 发表于 2009-7-9 15:18 | 显示全部楼层

什么原因,害得我忙着给您截图呢.

古道热肠 发表于 2009-7-9 15:19 | 显示全部楼层

FAT区截图

古道热肠 发表于 2009-7-9 15:20 | 显示全部楼层

Boot Directory区

古道热肠 发表于 2009-7-9 15:20 | 显示全部楼层
古道热肠 发表于 2009-7-9 15:21 | 显示全部楼层

不好意思,贴错了.

  
古道热肠 发表于 2009-7-9 15:23 | 显示全部楼层

调试过程要重视调试信息的输出,只要将待写入Flash的数据送

并将送往USB的数据都送串口来监视,应该能分清究竟问题出在哪儿的.
 楼主| qinshi1208 发表于 2009-7-10 14:20 | 显示全部楼层

恩 谢谢

谢谢古道热肠,你真是一个热心人,是读写的时候,地址指向错了。呵呵,你贴上的图也很漂亮呀!<br />&nbsp;再次感谢~~
小智若愚 发表于 2009-7-21 00:28 | 显示全部楼层

12楼的贴图真漂亮

  
lpcfans 发表于 2009-7-21 12:41 | 显示全部楼层

女朋友????很漂亮。。。

  
古道热肠 发表于 2009-7-21 16:29 | 显示全部楼层

哈哈,回楼上

那有把自己的女友照到处贴的呀,显摆呀,网上Down的.
l404807906 发表于 2009-11-9 17:19 | 显示全部楼层
怎么加入这个组啊
zhaoxb 发表于 2010-3-17 22:06 | 显示全部楼层
能把AT45DB161搞成了一个“古老的U盘”的程序发给我吗?非常感谢,邮箱zhaoxbcari@126.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

60

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部