将文件通过CH376保存到U盘,总耗时30.75秒。是否有办法快一些?

我使用 FPGA 通过 CH376 将 文件 保存到 U 盘(使用 CMD_BYTE_WRITE 模式)。

文件大小是 720*720 = 518,400 byte。

完成操作的 总的 时间是 30.75秒, 其中 29.75秒 处于 WAIT_INTn_VALID 的状态。


重复试验多次,都能顺利保存文件。每一次花费的时间也都是 30.75秒 附近。

代码中, 对于 WAIT_INTn_VALID 状态, 都是 等待 INT 管脚 从 低电平 切换到 高电平, 就退出此状态。

另外, 向 CH376 下发命令, 命令之间的间隔, 都是 1.5us (规格书中的 推荐值)


请问, 对于 CMD_BYTE_WRITE 模式, 确实需要 漫长的 等待的 时间吗?

如果 它 确实需要时间, 是否有其它好的办法, 使得 CH376 能够比较快地将 文件保存到 U 盘?

请有经验的好同志, 相应指点一下! 


呵呵, 如果涉及到其它参考文档, 也可发送到我的邮箱 个人信息保护,已隐藏 

先谢谢啦!

当前你的速度也就不到20KB/S,还可以很大程度上提速。

你描述的“等待 INT 管脚 从 低电平 切换到 高电平, 就退出此状态”,应该是从高变低说明中断到。

看一下不同接口、不同模式下的速度差异:(参考值)

图片.png


非常感谢 ! !

你说的正确, 应该是 INT 管脚 从 到 H 到 L 说明 中断 到了。


对于 你给出的 表格中, "字节写每次512"  是否 表示 每次可以 直接向 CH376 写入 512 个字节?


目前我的 代码中, 每次都是先 读取 允许写的 字节数目(ch375_reqWrPat),然后再 向 CH375 写入相应的字节数,然后再读取得到 ch375_reqWrPat, 再相应写。这样循环。

实际调测发现, ch375_reqWrPat 远远小于 512 个字节。即,每次写的数量挺少,但每次的命令,都需要等待 N*1.5us。可能是因为这个原因,写操作 时间 太久。


备注:上面提到的 读取 ch375_reqWrPat,就是 向 CH375 写入 WR_REQ_DATA 以后, 再接着执行 读 操作, 将获得的 数据赋值给 ch375_reqWrPat。


请问,是否 向 CH375 写入 WR_REQ_DATA 以后, 可以不必 先读取ch375_reqWrPat 然后写相应的字节数, 而是可以 直接向 CH375 写入 512 个字节?



不可以的。提速可以通过换接口,提高接口通讯速度,扇区操作,缩短底层读写函数延时(太短可能对稳定性有影响,保证最低时序要求)来实现。


CH376   PIC 单片机 80M, SPI(10M),全汇编程序,扇区写,实现速度214K(BYTE PER SECOND)


BYTE_WRITE,CH376字节写入,只能每次256Byte。


不一定,只能说缓冲区有这么大,单次传输未必是255。


BYTE_WRITE:case(reg_i)

8'h00:reg_tx<=8'h3c;//CMD_BYTE_WRITE 0x3C/*主机文件模式: 以字节为单位向当前位置写入数据块*/

8'h01:reg_tx<=8'hff;//发送字节数,低8位

8'h02:reg_tx<=8'hff;//发送字节数,高8位

8'h04:reg_tx<=8'h22;//CMD01_GET_STATUS 0x22/* 获取中断状态并取消中断请求 */

endcase

*************************************************

从这里看,一次发64KByte,0xffff。

*************************************************

WR_REQ_DATA:case({reg_i_8,reg_i})//2~256为数据,255个数据?数据块长度不是256个字节吗?

9'h000:reg_i<=reg_i+8'h01;

9'h001:begin 

    if(reg_go) begin

        reg_i<=8'h00; 

reg_i_8<=1'b0;

    end

    else 

reg_i<=reg_i+8'h01;

    end

9'h0ff:begin //0x0ff255//solfey

    reg_i<=8'h00;

    reg_i_8<=1'b1;//0x100256//solfey

end

default:begin

    if(!reg_err) begin 

reg_i<=8'h00;

reg_i_8<=1'b0;

    end

    else 

reg_i<=reg_i+8'h01;

end

endcase

*****************************************************************************************

从这里看,要发64KByte数据,需要循环WR_REQ_DATA共65536/256=256次。

*****************************************************************************************


问题来了,如果保存10MByte的文件呢?10*1024KByte/64KByte=160,那就是循环BYTE_WRITE共160次,循环WR_REQ_DATA共160*256=40960次。



手册上可没有提到单次写256字节,这里的单次256你是如何得到的?只是说缓冲区256,单次传输的长度是376报给你的一个数值,报多少传多少。调一次BYTE_WRITE最多写0xFFFF字节,如果写10M,那你就多调用几次BYTE_WRITE不就行了。至于BYTE_WRITE函数中,单次写多少,写多少次是无从得知的。


手册5.13章节WR_REQ_DATA说明,数据块长度的有效值对于文件读写是0至255。应该理解成每次启动WR_REQ_DATA最多能传输256Byte数据。


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