| 
 
| 最近做一个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 />
  | 
 |