F407 HAL USB SD 速度

2019-07-20 07:11发布

本帖最后由 第109位梁山好汗 于 2018-7-16 13:51 编辑

测试基于CubeMX生成的模板,想把USB数据转存到SD,可是将USB和SD连接到一起的速度太太低了。这是我做的一些测试测试条件:STM32 F407 , hal, SDIO(24M), DMA闪迪 16G Class10       USBHS(USB3300)(MSC)       WIN10,USB2.0/USB3.0
测试 一:SD卡,多扇区连续访问(200k)       写:6.9MB/S       读:10.85MB/S
测试 二:       USB       写:10.6MB/S       读:14.4MB/S
测试 三:USB + SD       写:300KB/S       读:700KB/S

调试时,我把STORAGE_Read_HS(uint8_t lun, uint8_t *buf,uint32_t blk_addr, uint16_t blk_len)STORAGE_Write_HS(uint8_t lun, uint8_t *buf,uint32_t blk_addr, uint16_t blk_len)blk_len参数仿真查看,发现每次数据通讯都为 1 扇区,数据长度(512字节),怀疑是此处的时间开销,没有真正发挥 SDIO,DMA连续数据访问的优势。大家有遇到这种情况的吗?

int8_t STORAGE_Init_HS(uint8_t lun)
{
  /* USER CODE BEGIN 9 */
  return (USBD_OK);
  /* USER CODE END 9 */
}

/**
  * @brief  .
  * @param  lun: .
  * @param  block_num: .
  * @param  block_size: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_GetCapacity_HS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
  /* USER CODE BEGIN 10 */

    HAL_SD_CardInfoTypeDef pCardInfo;

    HAL_SD_GetCardInfo(&hsd, &pCardInfo);

    *block_num  = pCardInfo.LogBlockNbr;
    *block_size = pCardInfo.LogBlockSize;

    return (USBD_OK);
  /* USER CODE END 10 */
}

/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_IsReady_HS(uint8_t lun)
{
  /* USER CODE BEGIN 11 */

  if(HAL_SD_GetCardState(&hsd) == HAL_SD_CARD_TRANSFER)
    return (USBD_OK);
  else
    return (USBD_FAIL);

  /* USER CODE END 11 */
}

/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_IsWriteProtected_HS(uint8_t lun)
{
  /* USER CODE BEGIN 12 */
  return (USBD_OK);
  /* USER CODE END 12 */
}

/**
  * @brief  .
  * @param  lun: .
  * @param  buf: .
  * @param  blk_addr: .
  * @param  blk_len: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Read_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 13 */

    int8_t ret = USBD_FAIL;

    if( HAL_SD_ReadBlocks_DMA(&hsd, buf, blk_addr, blk_len) == HAL_OK )
    {
        ret = USBD_OK;
    }

    if( USBD_OK == ret )
    {
        while(HAL_SD_GetState(&hsd) == HAL_SD_STATE_BUSY){};

        while( HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER ){};
    }

    return ret;

  /* USER CODE END 13 */
}

/**
  * @brief  .
  * @param  lun: .
  * @param  buf: .
  * @param  blk_addr: .
  * @param  blk_len: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Write_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 14 */

    int8_t ret = USBD_FAIL;

    if( HAL_SD_WriteBlocks_DMA(&hsd, buf, blk_addr, blk_len) == HAL_OK )
    {
        ret = USBD_OK;
    }

    if( USBD_OK == ret )
    {
        while(HAL_SD_GetState(&hsd) == HAL_SD_STATE_BUSY){};

        while( HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER ){};
    }

    return ret;

  /* USER CODE END 14 */
}

/**
  * @brief  .
  * @param  None
  * @retval .
  */
int8_t STORAGE_GetMaxLun_HS(void)
{
  /* USER CODE BEGIN 15 */
  return (STORAGE_LUN_NBR - 1);
  /* USER CODE END 15 */
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
第109位梁山好汗
1楼-- · 2019-07-20 07:38
 精彩回答 2  元偷偷看……
正点原子
2楼-- · 2019-07-20 13:00
 精彩回答 2  元偷偷看……
第109位梁山好汗
3楼-- · 2019-07-20 13:58
正点原子 发表于 2018-7-17 01:50
我感觉你这速度不低了啊

@正点原子
原子哥,300k,700k,这个速度已经是比较快的速度了嘛?
那 usb3300 就浪费了

我单独测试SD,USB 两个部分的速度是满足需求的,可是连接到一块,这个速度。。。

测试的时候,发现 电脑 usb 主机每次访问的数据都是 1 扇区,应该是这个有太多的时间开销,没有进行连续的扇区访问。

我们想做写2M,读5M以上的设备,还有可以优化的地方嘛,或者方案不好
正点原子
4楼-- · 2019-07-20 18:08
 精彩回答 2  元偷偷看……

一周热门 更多>