STM32
直播中

哈哈哈

11年用户 963经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

cube下模拟U盘,速度超级慢,为什么?

模拟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)

李鸿

2024-5-11 17:26:15
从您的描述来看,模拟U盘的速度慢可能有以下几个原因:

1. **单片机性能限制**:单片机的处理器速度和内存可能限制了数据传输的速度。如果单片机的性能不足以快速处理USB协议和SPI通信,那么整体速度就会受到影响。

2. **USB协议实现**:USB协议的实现可能不够高效。如果USB协议的实现没有充分利用硬件特性,或者存在一些不必要的延迟,那么速度也会受到影响。

3. **SPI通信速度**:SPI通信速度可能不够快。如果SPI接口的速度较慢,那么在与SD卡通信时,整体速度也会受到影响。

4. **缓冲区管理**:您提到了可能需要一个USB的缓冲区。确实,为了提高数据传输速度,通常会使用缓冲区来减少对单片机内存的访问次数。如果缓冲区管理不当,可能会导致速度变慢。

5. **SD卡性能**:SD卡的性能也可能影响整体速度。如果SD卡的读写速度较慢,那么即使USB和SPI通信速度很快,整体速度也会受到限制。

为了提高速度,您可以尝试以下方法:

1. **优化单片机性能**:尽量选择性能较好的单片机,以提高数据处理速度。

2. **优化USB协议实现**:检查USB协议的实现,看看是否有可以优化的地方,以减少不必要的延迟。

3. **提高SPI通信速度**:尝试提高SPI通信的速度,以提高与SD卡的通信效率。

4. **使用缓冲区**:合理使用缓冲区,减少对单片机内存的访问次数,以提高数据传输速度。

5. **选择高性能SD卡**:使用读写速度较快的SD卡,以提高整体速度。

6. **检查代码**:仔细检查您的代码,看看是否有可以优化的地方,以提高速度。

希望这些建议能帮助您解决速度慢的问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分