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