硬汉嵌入式论坛

 找回密码
 立即注册
查看: 551|回复: 6
收起左侧

[STM32H7] STM32H7+MSC+CDC+FREERTOS+SDMMC读写SD

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2025-3-6 17:48:36 | 显示全部楼层 |阅读模式
最近在做STM32H7的MSC+CDC复合设备;

目前我如果在STORAGE_Write_FS、STORAGE_Read_FS使用DMA进行读写SD
则电脑就只有盘符,无法显示U盘

这是明显的数据不正常。。于是我不使用dma进行读写测试,发现能正常识别U盘,那就是DMA有问题,但是我FATFS的数据读写也用的是DMA啊,工作是正常的

于是我尝试在读后、写前清cache

读写函数我都这样清cache,结果还是不行,。,。。。实在想不到是什么原因导致的了
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2025-3-6 17:52:46 | 显示全部楼层
Snipaste_2025-03-06_17-51-42.png Snipaste_2025-03-06_17-52-00.png Snipaste_2025-03-06_17-52-09.png
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2025-3-6 17:59:54 | 显示全部楼层
[C] 纯文本查看 复制代码
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 = USBD_FAIL;
	uint32_t timer;

	
	if (HAL_SD_ReadBlocks(&hsd1, buf, blk_addr, blk_len ,200) == HAL_OK) {
		return USBD_OK;
	}
	
//	if (HAL_SD_ReadBlocks_DMA(&hsd1, buf, blk_addr, blk_len ) == HAL_OK) {
//		ret = USBD_OK;
//	}

//	if (USBD_OK == ret) {
//		timer = osKernelSysTick();
//		while (HAL_SD_GetState(&hsd1) == HAL_SD_STATE_BUSY) {
//			if (osKernelSysTick() - timer > 30 * 1000) {
//				return USBD_FAIL;
//			}
//		};
//		timer = osKernelSysTick();
//		while (HAL_SD_GetCardState(&hsd1) != HAL_SD_CARD_TRANSFER) {
//			if (osKernelSysTick() - timer > 30 * 1000) {
//				return USBD_FAIL;
//			}
//		};
//	}

	
	return USBD_OK;
  /* USER CODE END 6 */
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2025-3-7 06:37:34 | 显示全部楼层

改成使用函数SCB_CleanInvalidateDCache试试。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2025-3-7 08:47:54 | 显示全部楼层
eric2013 发表于 2025-3-7 06:37
改成使用函数SCB_CleanInvalidateDCache试试。

在读写位置加SCB_CleanInvalidateDCache也是如此,弹出U盘,提示要格式化。。
回复

使用道具 举报

10

主题

53

回帖

83

积分

初级会员

积分
83
发表于 2025-3-7 13:01:30 | 显示全部楼层
也许是 MSC 和 CDC的 端点有重复?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2025-3-8 08:59:59 | 显示全部楼层
liozhu 发表于 2025-3-7 08:47
在读写位置加SCB_CleanInvalidateDCache也是如此,弹出U盘,提示要格式化。。

这个排查了之后,然后排查SD DMA函数缓冲地址是不是有4字节不对齐的i情况,每次传输前做个判断。如果不满足是不可以的。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-13 02:21 , Processed in 0.058064 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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