V307 MSC_U-disk SD卡媒介

CH32V307VCT6-EVT-R2开发板

以USBHS DEVICE MSC_U-Disk例程为基础,简单融入SDIO例程,将SD卡作为媒介,修改SW_UDISK.c和.h文件

#define STORAGE_MEDIUM             MEDIUM_SD_FLASH


#elif (STORAGE_MEDIUM == MEDIUM_SD_FLASH)

    #define DEF_CFG_DISK_SEC_SIZE      512                                                 /* 磁盘扇区大小 */

    #define DEF_FLASH_SECTOR_SIZE      512                                                 /* 定义FLASH扇区大小 */

    #define DEF_UDISK_SECTOR_SIZE      DEF_CFG_DISK_SEC_SIZE                               /* 定义U盘扇区大小 */

#elif(STORAGE_MEDIUM == MEDIUM_SD_FLASH)

    SD_ReadBlock();

#elif(STORAGE_MEDIUM == MEDIUM_SD_FLASH)

    SD_WriteBlock();

可以实现基础SD卡模拟U盘功能。

遇到问题:

1 SD卡默认配置,开机识别U盘速度,格式化速度,读写速度非常慢,单个10MB文件写入350KB/s,读取1.4MB/s

2 将SD卡配置成DMA SD_SetDeviceMode( SD_DMA_MODE);不可运行

2.1 单独配置读取启动DMA,运行正常,但是速度没有变化

2.2 单独配置写入启动DMA,不可运行。

2.3 SD启动DMA,初始化后的测试例程正常,只有在作为U盘媒介时,写入启动DMA异常

        for(i=0; i

            if(SD_WriteDisk(buf,i,1)) printf("Wr %d sector fail\n", i);

            if(SD_ReadDisk(Readbuf,i,1)) printf("Rd %d sector fail\n", i);

            if(memcmp(buf, Readbuf, 512)){

                printf(" %d sector Verify fail\n", i);

                break;

            }

        }

3 在SW_UDISK.c中屏蔽写入代码,测试写入速度15MB/s。

请问如何提高模拟U盘的读写速度,包括格式化和USB识别速度?

CH565W开发板,EMMC媒介模拟U盘,USB2.0接口,读写速度35MB/s,USB3.0接口,读写44MB/s。307与565差距太大了。

您好,


        问题1:我们EVT中的例程,只是展示了V307能够作为U盘进行使用,没有对速度进行优化,您测试得到的速度还是比较快的。如果您需要CH32V307VCT6芯片,使用高速USB实现SD卡读卡器功能的参考工程,麻烦发送邮件至lbw@wch.cn获取。请简要说明产品功能并附上您的联系方式及公司名称(或学校信息),谢谢。


        问题2:

        ①请检查sdio.c文件下的SD_ReadBlock、SD_ReadMultiBlocks、SD_WriteBlock与SD_WriteMultiBlocks函数中,有没有使能对应的DMA通道。建议您到官网下载最新版本EVT例程(https://www.wch.cn/products/CH32V307.html?)。

        ②你提到的只启用DMA对读写速度没有影响,这一点我也有所发现。我认为可能是因为在Windows系统下USB的BOT协议单包最大512字节,使用DMA只是实现了USB数据由内存到SDIO接口这一过程的加速,并没有减少SDIO接口发送的额外的数据量,即SDIO依然使用单块进行SD卡的读写操作。可以通过将USB的数据进行缓存,累积一定数量的数据后,通过多块读写的方式一次性进行传输。实际测试发现,随着累积的数据量的增多,USB的速度趋于稳定。在此方法上进行改进,使用循环缓冲区实现USB数据的接收与SDIO的写卡同步操作,应该可以进一步提升读写性能。


        问题3:

        ①屏蔽SD_WriteBlock或SD_WriteMultiBlocks函数测试得到的速度,可以粗略的认为是USB在这一工程下的传输速度,实际工作过程为USB接收后不进行写卡操作,内存中的数据反复被新数据覆盖。提高模拟U盘的读写速度可以参考问题2中的②的回答,可以提供的参考工程是使用缓存一段时间的数据再写入的方式,循环缓冲区暂无参考工程,需自行开发。

        ②USB的格式化可以分为全部格式化和快速格式化,如果希望快速完成卡的格式化操作,直接使用快速格式化删除卡中记录的文件分配表即可。但要注意的是部分小容量的卡,可能存在不支持BOT协议中的擦除指令,计算机通常反复使用写指令(CMD25)来完成这一过程。

        ③USB的识别速度是指什么,从USB本身来讲,主机完成枚举后,U盘的识别过程就已经完成了。可以尝试关闭你的杀毒软件,避免杀毒软件对U盘的扫描,长时间的占用你的U盘。如果您手中有USB分析仪,也可以观察下U盘的枚举是否存在异常。

        ④eMMC相较于SD卡而言,能够支持8线模式,相同的时钟频率下,传输速度在理论上是SD卡2倍,这个是物理属性所决定的,软件上没有办法进行突破。V307的SDIO接口也提供了8线模式,同样也能够实现eMMC的操作,最新的例程还在整理,完成后会第一时间在官网的EVT中进行发布。





非常感谢您的解答,已发送申请,邮箱个人信息保护,已隐藏


速度非常NICE,读取15MB/s,写入12MB/s!感谢!BANQ V30 64GB卡。Netac U3 64GB卡若一些,读取13MB/s。


只有登录才能回复,可以选择微信账号登录