OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5581|回复: 4

stm32cube生成USB读卡器工程,但不能写入的问题

[复制链接]

8

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2013-5-15
在线时间
8 小时
发表于 2021-9-21 10:36:22 | 显示全部楼层 |阅读模式
1金钱
利用stm32cube生成USB读卡器代码,然后更新usbd_storage_if.c的代码,可以从SD卡拷贝文件到到电脑,但是电脑不能拷贝文件到SD卡,一拷贝就卡死,SD断开连接。
/* USER CODE BEGIN INQUIRY_DATA_FS */
/** USB Mass storage Standard Inquiry Data. */
const int8_t STORAGE_Inquirydata_FS[] = {/* 36 */

  /* LUN 0 */
  0x00,
  0x80,
  0x02,
  0x02,
  (STANDARD_INQUIRY_DATA_LEN - 5),
  0x00,
  0x00,
  0x00,
  'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */
  'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product      : 16 Bytes */
  ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
  '0', '.', '0' ,'1'                      /* Version      : 4 Bytes */
};
/* USER CODE END INQUIRY_DATA_FS */

/* USER CODE BEGIN PRIVATE_VARIABLES */

/* USER CODE END PRIVATE_VARIABLES */

/**
  * @}
  */

/** @defgroup USBD_STORAGE_Exported_Variables
  * @brief Public variables.
  * @{
  */

extern USBD_HandleTypeDef hUsbDeviceFS;

/* USER CODE BEGIN EXPORTED_VARIABLES */

/* USER CODE END EXPORTED_VARIABLES */

/**
  * @}
  */

/** @defgroup USBD_STORAGE_Private_FunctionPrototypes
  * @brief Private functions declaration.
  * @{
  */

static int8_t STORAGE_Init_FS(uint8_t lun);
static int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size);
static int8_t STORAGE_IsReady_FS(uint8_t lun);
static int8_t STORAGE_IsWriteProtected_FS(uint8_t lun);
static int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
static int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
static int8_t STORAGE_GetMaxLun_FS(void);

/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */

/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */

/**
  * @}
  */

USBD_StorageTypeDef USBD_Storage_Interface_fops_FS =
{
  STORAGE_Init_FS,
  STORAGE_GetCapacity_FS,
  STORAGE_IsReady_FS,
  STORAGE_IsWriteProtected_FS,
  STORAGE_Read_FS,
  STORAGE_Write_FS,
  STORAGE_GetMaxLun_FS,
  (int8_t *)STORAGE_Inquirydata_FS
};

/* Private functions ---------------------------------------------------------*/
/**
  * @brief  Initializes over USB FS IP
  * @param  lun:
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Init_FS(uint8_t lun)
{
  /* USER CODE BEGIN 2 */
        BSP_SD_Init();
  return (USBD_OK);
  /* USER CODE END 2 */
}

/**
  * @brief  .
  * @param  lun: .
  * @param  block_num: .
  * @param  block_size: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
  /* USER CODE BEGIN 3 */
  HAL_SD_CardInfoTypeDef info;
  int8_t ret = -1;  

       
  if(BSP_SD_IsDetected() != SD_NOT_PRESENT)
  {
    BSP_SD_GetCardInfo(&info);

    *block_num =  info.LogBlockNbr  - 1;
    *block_size = info.LogBlockSize;
    ret = 0;
  }
  return ret;
       
/*

            BSP_SD_GetCardInfo(&info);
            *block_num = info.LogBlockNbr - 1;
            *block_size = info.LogBlockSize;


        return 0;
*/
  /* USER CODE END 3 */
}

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

static int8_t prev_status = 0;
  int8_t ret = -1;

  if(BSP_SD_IsDetected() != SD_NOT_PRESENT)
  {
    if(prev_status < 0)
    {
      BSP_SD_Init();
      prev_status = 0;

    }
    if(BSP_SD_GetCardState() == SD_TRANSFER_OK)
    {
      ret = 0;
    }
  }
  else if(prev_status == 0)
  {
    prev_status = -1;
  }
                                           USB_STATUS_REG|=0X10;//标记轮询
  return ret;

/*
    int8_t ret = 0;   
    USB_STATUS_REG|=0X10;//标记轮询
    return ret;
                */
  /* USER CODE END 4 */
}

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

/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 6 */
       
   int8_t ret = -1;  

  if(BSP_SD_IsDetected() != SD_NOT_PRESENT)
  {  
                                                         USB_STATUS_REG|=0X02;//标记正在读数据
                __disable_irq();   // 关闭总中断(POLLING模式,严禁中断打断SDIO读写操作!!!)
               
     BSP_SD_ReadBlocks_DMA((uint32_t *)buf, blk_addr, blk_len);
                //HAL_SD_ReadBlocks(&hsd,(uint32_t *)buf, blk_addr, blk_len,1000);
                __enable_irq();    // 开启总中断

    // Wait for Rx Transfer completion
    while (readstatus == 0){}
    readstatus = 0;

    // Wait until SD card is ready to use for new operation
    while (BSP_SD_GetCardState() != SD_TRANSFER_OK){}
    ret = 0;
  }

  return ret;

        /*
            int8_t res=0;
        USB_STATUS_REG|=0X02;//标记正在读数据

                        //res=SD_ReadDisk(buf,blk_addr,blk_len);
      BSP_SD_ReadBlocks_DMA((uint32_t *)buf, blk_addr, blk_len);
        if(res)
        {
                USB_STATUS_REG|=0X08;//读错误!
        }
        return res;
        */
  /* USER CODE END 6 */
}

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

   int8_t ret = -1;  

  if(BSP_SD_IsDetected() != SD_NOT_PRESENT)
  {
                                                                          USB_STATUS_REG|=0X01;//标记正在写数据
                __disable_irq();   // 关闭总中断(POLLING模式,严禁中断打断SDIO读写操作!!!)
    BSP_SD_WriteBlocks_DMA((uint32_t *)buf, blk_addr, blk_len);
                //HAL_SD_WriteBlocks(&hsd,(uint32_t *)buf, blk_addr, blk_len,1000);
                __enable_irq();    // 开启总中断
    // Wait for Tx Transfer completion
    while (writestatus == 0){}
    writestatus = 0;

    // Wait until SD card is ready to use for new operation
    while (BSP_SD_GetCardState() != SD_TRANSFER_OK){}
    ret = 0;
  }
                                                   
  return ret;

        /*
            int8_t res=0;
        USB_STATUS_REG|=0X01;//标记正在写数据

                //        res=SD_WriteDisk(buf,blk_addr,blk_len);
      res=BSP_SD_WriteBlocks_DMA((uint32_t *)buf, blk_addr, blk_len);
        if(res)
        {
                USB_STATUS_REG|=0X04;//写错误!         
        }
        return res;
        */
  /* USER CODE END 7 */
}

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

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3627
金钱
3627
注册时间
2019-8-14
在线时间
1054 小时
发表于 2021-9-22 12:10:31 | 显示全部楼层
回复

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
783
金钱
783
注册时间
2021-4-15
在线时间
305 小时
发表于 2021-9-22 12:29:15 | 显示全部楼层
SD卡格式成FAT没有?

日常敲键--头秃一片
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2021-9-22 16:00:42 | 显示全部楼层
得仿真看下程序在什么地方出现卡死
回复

使用道具 举报

0

主题

668

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1926
金钱
1926
注册时间
2021-8-13
在线时间
262 小时
发表于 2021-9-23 10:06:21 | 显示全部楼层
   帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 12:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表