完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请教下,最近在折腾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_t STORAGE_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 rn"); return USBD_FAIL; } printf("BSP SDIO Init HS OK %drn", 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; } |
|
相关推荐
27个回答
|
|
|
|
|
|
|
|
|
|
谢谢分享
|
|
|
|
|
|
|
|
我有USB读取SD卡(模拟U盘)例程,有需要留邮箱
|
|
|
|
|
|
|
|
本帖最后由 hpdell 于 2016-12-8 11:08 编辑 你好,我现在的情况是 貌似 吧sd卡模拟成u盘,操作时 函数没有关联一样 但是看程序貌似又是有关联的,所以现在就比较迷糊了 设备管理器里面能够识别到,说明u***通讯这块应该没有什么问题吧, |
|
|
|
你好,我的终于搞定了哟,是u***的速度配置高了,吧他配置为 12Mbps就可以了,我之前配置的是 480Mbps, |
|
|
|
你也是用CubeMX配置生成的MDK工程吗? 上传工程我看看,或者发我邮箱547068172@qq.com。 我的是STM32F407平台,正点原子的开发板,USB速度配置没有错,是FS的。 识别出U盘了,但是电脑要求格式化,格式化完再用其他读卡器通过PC读的时候,又要求重新初始化。 |
|
|
|
是使用 CubeMX自动生成的, 在 u***d_storage_if.c 这个里面增加sd卡的底层驱动就可以了, 另外中断设置, sd卡使用dma,sd卡中断设置为6,sd卡的接收,发送dma都设置为6,u***中断设置为7, 也就是u***的中断比sd卡的要低, 其他的也没有什么了 我使用的是外接 USB3300 的高速模块的 |
|
|
|
好,谢谢! 有空我在试一下。 |
|
|
|
我有USB读取SD卡
|
|
|
|
看看,mark
|
|
|
|
周末愉快!签到签到。
|
|
|
|
周末愉快!
|
|
|
|
sd卡模拟u盘读写这功能好实用的。
|
|
|
|
楼主,我也遇到和您一样的问题,请问您是怎么修改u***的速度的。
|
|
|
|
USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) { /* Init USB_IP */ if (pdev->id == DEVICE_HS) { /* Link The driver to the stack */ hpcd_USB_OTG_HS.pData = pdev; pdev->pData = &hpcd_USB_OTG_HS; hpcd_USB_OTG_HS.Instance = USB_OTG_HS; #if 0 hhcd_USB_OTG_HS.Init.dev_endpoints = 9; hhcd_USB_OTG_HS.Init.Host_channels = 12; #else hpcd_USB_OTG_HS.Init.Host_channels = 11; // 设置为9、11都可以 #endif hpcd_USB_OTG_HS.Init.speed = PCD_SPEED_FULL; // 模拟u盘,速度设置 PCD_SPEED_HIGH_IN_FULL 或者 PCD_SPEED_FULL ; // 切记不可以设置为 PCD_SPEED_HIGH hpcd_USB_OTG_HS.Init.dma_enable = DISABLE; hpcd_USB_OTG_HS.Init.ep0_mps = DEP0CTL_MPS_64; hpcd_USB_OTG_HS.Init.phy_itface = USB_OTG_ULPI_PHY; hpcd_USB_OTG_HS.Init.Sof_enable = DISABLE; hpcd_USB_OTG_HS.Init.low_power_enable = DISABLE; hpcd_USB_OTG_HS.Init.lpm_enable = DISABLE; hpcd_USB_OTG_HS.Init.vbus_sensing_enable = DISABLE; hpcd_USB_OTG_HS.Init.use_dedicated_ep1 = DISABLE; hpcd_USB_OTG_HS.Init.use_external_vbus = DISABLE; if (HAL_PCD_Init(&hpcd_USB_OTG_HS) != HAL_OK) { Error_Handler(); } HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_HS, 0x200); HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_HS, 0, 0x80); HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_HS, 1, 0x174); } return USBD_OK; } |
|
|
|
还是配置的问题!谢谢分享!
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2105 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1941 浏览 3 评论
4537 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2084 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2599 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 20:43 , Processed in 0.972395 second(s), Total 77, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号