jihesong-101921 发表于 2016-3-7 19:35:17

cube下模拟U盘,速度超级慢,177K写入SD卡。

本帖最后由 jihesong-1019213 于 2016-3-8 14:33 编辑

    模拟U盘,把USB线连电脑后,像是插上U盘一样,能识别出板上SPI驱动的SD卡,和U盘一样,但很慢,枚举很慢,电脑显示写入时177K/秒也很慢;过程和挂载fatfs基本一样,很简单,就是在接口那里放上出和入的程序,照常满足3个参数。
    打上断点后,看到SPI的应答从没出错,问题是从来没连续块读写,觉得应该得有个USB的缓冲区吧,因为单片机的内存挺金贵的,目前应该是默认的安全模式,一个byte一个蹦,节省资源。
    usbd_storage_if.c里面增加上SPI的块读写就能识别SD卡容量,前提是SD卡需要先识别出,和fatfs无关。
    怎么样让块的连续读写生效,发挥作用啊????SPI速度有18M啊,速度全让单字节读写浪费了。
    虚拟串口和HOST+storage还没弄,但是我觉得路数应该一样的,hal库还是挺给力,要养成习惯就是把程序写在用户代码区。
/*******************************************************************************
* Function Name: STORAGE_Read_FS
* Description    :
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
int8_t STORAGE_Read_FS (uint8_t lun,
                        uint8_t *buf,
                        uint32_t blk_addr,                     
                        uint16_t blk_len)//这个blk_len长度从来都是1,就不肯大于1,正在找原因。
{
/* USER CODE BEGIN 6 */
    if(blk_len==1)
    {   
      if(SD_ReadBlock(buf, blk_addr*512, 512)!=SD_RESPONSE_NO_ERROR)
            SD_ReadBlock(buf, blk_addr*512, 512);
    }
    else
      SD_ReadMultiBlocks(buf, blk_addr*512, 512, blk_len);
return (USBD_OK);
/* USER CODE END 6 */
}

/*******************************************************************************
* Function Name: STORAGE_Write_FS
* Description    :
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
int8_t STORAGE_Write_FS (uint8_t lun,
                         uint8_t *buf,
                         uint32_t blk_addr,
                         uint16_t blk_len)
{
/* USER CODE BEGIN 7 */
    if(blk_len==1)
    {   
      if(SD_WriteBlock(buf,blk_addr*512, 512)!=SD_RESPONSE_NO_ERROR)
            SD_WriteBlock(buf,blk_addr*512, 512);
    }
    else
      SD_WriteMultiBlocks(buf, blk_addr*512, 512, blk_len);
return (USBD_OK);
/* USER CODE END 7 */
}
   
那个lun参数其实应该就是DRV,第几个硬件U口而已,既然板上只有1个U插口,当然是0,不用管了;
USB的hal库似乎比较新,看那注释是空的,看不到参数的解释。
送上个命令,在电脑的“运行”里输入 chkdsk G:/F ,可以修复被自己读写乱了的SD卡,G是SD卡的盘符,到连格式化都不行时候,这个命令可以救命。


页: [1]
查看完整版本: cube下模拟U盘,速度超级慢,177K写入SD卡。