hpdell 发表于 2016-12-6 10:28:00

请教下,最近在折腾sd卡模拟u盘读写 ???

本帖最后由 hpdell 于 2016-12-7 09:59 编辑

请教下,最近在折腾sd卡模拟u盘读写 ,设备管理器里面可以识别到 ,电脑磁盘盘符也可以识别到(不能够识别sd卡容量),但就是不能够读写,

设备管理器识别:


最下面的 STM SDIO Flash USB Device 就是使用sd卡模拟出来的,

程序会不停的进入 下面的两个函数 :
STORAGE_Init_HS();

还有 STORAGE_Read_HS();

这两个函数里面,请教下是什么情况啊 ???

识别到的sd卡容量是正确的

进入 STORAGE_GetCapacity() 这个函数里面,获取到的sd卡容量是正确的

这个函数识别 sd卡容量是正确的
/*******************************************************************************
* Function Name: STORAGE_GetCapacity_HS
* Description    :
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
int8_t STORAGE_GetCapacity_HS (uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
HAL_SD_Get_CardInfo(&hsd2, &SDCardInfo2);

*block_num= SDCardInfo2.CardCapacity/512;
*block_size = STORAGE_BLK_SIZ;
return (USBD_OK);
}



const int8_tSTORAGE_Inquirydata_HS[] = {/* 36 */

/* LUN 0 */
0x00,               
0x80,               
0x02,               
0x02,
(STANDARD_INQUIRY_DATA_LEN - 5),
0x00,
0x00,      
0x00,
'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */

'S', 'D', 'I', 'O', ' ', 'F', 'l', 'a', /* Product      : 16 Bytes */

's', 'h', ' ', ' ', ' ', ' ', ' ', ' ',

'0', '.', '0' ,'1',                     /* Version      : 4 Bytes */
};




USBD_StorageTypeDef USBD_Storage_Interface_fops_HS =
{
STORAGE_Init_HS,
STORAGE_GetCapacity_HS,
STORAGE_IsReady_HS,
STORAGE_IsWriteProtected_HS,
STORAGE_Read_HS,
STORAGE_Write_HS,
STORAGE_GetMaxLun_HS,
(int8_t *)STORAGE_Inquirydata_HS,
};



int8_t STORAGE_Init_HS (uint8_t lun)
{
/* USER CODE BEGIN 9 */
static uint8_t i = 0;
uint8_t res=0;
res = BSP_SD_Init();
if(res != 0)
{
    printf("BSP SDIO Init Error \r\n");
    return USBD_FAIL;
}
printf("BSP SDIO Init HS OK%d\r\n", i++);
return res;    // (USBD_OK);
/* USER CODE END 9 */
}




int8_t STORAGE_Read_HS (uint8_t lun,
                        uint8_t *buf,
                        uint32_t blk_addr,                     
                        uint16_t blk_len)
{

uint16_t n;
      int8_t res=0;
long long lsector = blk_addr;

      if(SDCardInfo2.CardType != STD_CAPACITY_SD_CARD_V1_1)
      lsector <<= 9;
      if( ((uint32_t )buf % 4) != 0)
      {
      for(n=0; n < blk_len; n++)
      {
          res = HAL_SD_ReadBlocks_DMA(&hsd2, (uint32_t *)sdio_buff, lsector + (512 * n), 512, 1);//通过DMA读取SD卡一个扇区

          if(res == 0)//读取成功
          {
            //等待读取完成
            res = HAL_SD_CheckReadOperation(&hsd2,(uint32_t)100000000);
          }         

          memcpy(buf,sdio_buff, 512);
          buf += 512;
      }
      }
      else
      {

          res = HAL_SD_ReadBlocks_DMA(&hsd2, (uint32_t *)buf, lsector , 512, blk_len);//通过DMA读取SD卡一个扇区
          if(res == 0)//读取成功
          {
            //等待读取完成
             res = HAL_SD_CheckReadOperation(&hsd2,(uint32_t)100000000);
          }            
      }

      if(res)
      {
                USB_STATUS_REG|=0X08;//读错误!
      }
      return (USBD_StatusTypeDef)res;

}



int8_t STORAGE_Write_HS (uint8_t lun,
                         uint8_t *buf,
                         uint32_t blk_addr,
                         uint16_t blk_len)
{

uint16_t n;
      int8_t res=0;
long long lsector = blk_addr;

{

      if(SDCardInfo2.CardType != STD_CAPACITY_SD_CARD_V1_1)
      lsector <<= 9;
      if( ((uint32_t )buf % 4) != 0)
      {
      for(n=0; n < blk_len; n++)
      {

          memcpy(sdio_buff, buf, 512);
          res = HAL_SD_WriteBlocks_DMA(&hsd2, (uint32_t *)sdio_buff, lsector + (512 * n), 512, 1);//单个sector的写操作

          if(res == 0)//读取成功
          {
            //等待读取完成
            res = HAL_SD_CheckWriteOperation(&hsd2,(uint32_t)100000000);
          }         

          buf += 512;
      }
      }
      else
      {

          res = HAL_SD_WriteBlocks_DMA(&hsd2, (uint32_t *)buf, lsector , 512, blk_len);//通过DMA读取SD卡一个扇区
          if(res == 0)//读取成功
          {
            //等待读取完成
            res = HAL_SD_CheckWriteOperation(&hsd2,(uint32_t)100000000);
          }            
      }
}
      if(res)
      {
                USB_STATUS_REG |= 0X04;//写错误!         
      }
      return (USBD_StatusTypeDef)res;   
}




















adlu 发表于 2016-12-6 11:29:01

这个之前我也做个,但一直没有完成,遇到的问题和楼主的一样。
如果解决了,回复这个帖,通知我一声,谢谢!

hpdell 发表于 2016-12-6 12:19:04

adlu 发表于 2016-12-6 11:29
这个之前我也做个,但一直没有完成,遇到的问题和楼主的一样。
如果解决了,回复这个帖,通知我一声,谢谢 ...

好的好的,

jackten 发表于 2016-12-6 13:26:00

谢谢分享                  

没事逛荡 发表于 2016-12-6 14:01:48

STM32模拟成一个读卡器,读卡的操作看下有问题没。
不是很懂,帮顶。。。。

oktigerxia 发表于 2016-12-7 14:39:42

我有USB读取SD卡(模拟U盘)例程,有需要留邮箱

hpdell 发表于 2016-12-8 10:52:25

oktigerxia 发表于 2016-12-7 14:39
我有USB读取SD卡(模拟U盘)例程,有需要留邮箱

你好,这个我需要哟,我的 邮箱 : shewang131@163.com

hpdell 发表于 2016-12-8 11:07:00

本帖最后由 hpdell 于 2016-12-8 11:08 编辑

没事逛荡 发表于 2016-12-6 14:01
STM32模拟成一个读卡器,读卡的操作看下有问题没。
不是很懂,帮顶。。。。 ...
你好,我现在的情况是













貌似 吧sd卡模拟成u盘,操作时 函数没有关联一样
但是看程序貌似又是有关联的,所以现在就比较迷糊了

设备管理器里面能够识别到,说明usb通讯这块应该没有什么问题吧,




hpdell 发表于 2016-12-9 09:27:56

adlu 发表于 2016-12-6 11:29
这个之前我也做个,但一直没有完成,遇到的问题和楼主的一样。
如果解决了,回复这个帖,通知我一声,谢谢 ...
你好,我的终于搞定了哟,是usb的速度配置高了,吧他配置为 12Mbps就可以了,我之前配置的是 480Mbps,

adlu 发表于 2016-12-9 11:47:58

hpdell 发表于 2016-12-9 09:27
你好,我的终于搞定了哟,是usb的速度配置高了,吧他配置为 12Mbps就可以了,我之前配置的是 480Mbps, ...
你也是用CubeMX配置生成的MDK工程吗?
上传工程我看看,或者发我邮箱547068172@qq.com。

我的是STM32F407平台,正点原子的开发板,USB速度配置没有错,是FS的。
识别出U盘了,但是电脑要求格式化,格式化完再用其他读卡器通过PC读的时候,又要求重新初始化。

hpdell 发表于 2016-12-9 14:09:59

本帖最后由 hpdell 于 2016-12-9 14:26 编辑

adlu 发表于 2016-12-9 11:47
你也是用CubeMX配置生成的MDK工程吗?
上传工程我看看,或者发我邮箱。


是使用 CubeMX自动生成的, 在 usbd_storage_if.c 这个里面增加sd卡的底层驱动就可以了,



另外中断设置, sd卡使用dma,sd卡中断设置为6,sd卡的接收,发送dma都设置为6,usb中断设置为7, 也就是usb的中断比sd卡的要低,
其他的也没有什么了

我使用的是外接 USB3300 的高速模块的

adlu 发表于 2016-12-9 16:57:08

hpdell 发表于 2016-12-9 14:09
是使用 CubeMX自动生成的, 在 usbd_storage_if.c 这个里面增加sd卡的底层驱动就可以了,




好,谢谢!
有空我在试一下。

zbber 发表于 2016-12-9 18:17:00

我有USB读取SD卡

斜阳 发表于 2016-12-10 09:27:06

看看,mark

samhong 发表于 2016-12-10 10:20:28

周末愉快!签到签到。
页: [1] 2 3
查看完整版本: 请教下,最近在折腾sd卡模拟u盘读写 ???