ch376的写u盘速度?

我用ch376进行实时录音,录音数据写入u盘,速度为128kbps(16k字节),购买芯片时咨询过技术人员,说ch376的写u盘速度可以达到200k字节,但是我怎么实验貌似也达不到200k字节啊? 我通过设置断点硬件仿真,写一个扇区的时间是0.6秒,我试图一次多写几个扇区,但是时间基本上是0.6n秒(n为扇区数)。我粗略的算了一下,只要能达到100k字节/秒即可足以满足我的要求,这样写一个扇区的时间应该在0.01毫秒,我的速度也太慢了吧?

是我程序的问题还是其他问题呢?

请问怎样才能提高速度满足我的项目需求啊?

请沁恒的技术老师们帮帮忙分析一下啊,谢谢了。

单片机和CH376之间的硬件接口是什么接口?还有需要看下你三个读写子函数是怎么写的,这个需要优化才能将速度往上提的。


接口是并口,采用查询方式实现,因为我的程序中已有一个中断(接收录音数据),所以就采用了查询方式实现。

扇区写函数就是用的例程中的函数:

UINT8 CH376SecWrite( PUINT8 buf, UINT8 ReqCount, PUINT8 RealCount ) /* 以扇区为单位在当前位置写入数据块,不支持SD卡 */ {……}


写命令函数也是例程中提供的:

void xWriteCH376Cmd( UINT8 mCmd ) /* 向CH376写命令 */ { UINT8 i; CH376_CMD_PORT = mCmd; /* mDelay0_5uS( ); mDelay0_5uS( ); mDelay0_5uS( );*/ /* 延时1.5uS确保读写周期大于1.5uS,或者用下面几行的状态查询代替 */ mDelaymS(10);//延时1us for ( i = 10; i != 0; -- i ) { /* 状态查询,等待CH376不忙,或者上面一行的延时1.5uS代替 */ if ( ( xReadCH376Status( ) & PARA_STATE_BUSY ) == 0 ) break; /* 检查状态端口的忙标志位 */ }

}


我的时钟跑到108M,所以mDelaymS(10)延时2us。

根据您的建议,我刚才优化了一下延时,一次写8个扇区大约需要200ms,也就是平均写一个扇区的时间是25毫秒,可是据我的最低目标(50us写一个扇区,速度达到20k字节)还差很远啊。

根据ch376的时序要求,确保读写周期大于1.5uS,上面的mDelaymS(10)延时2us也是必须的,所以这样算起来50us写一个扇区还挺难做到的。


您应该算一下50US写一个扇区,1S需要写多少扇区? 这个速度不仅要USB2.0,而其估计需要硬盘。USB2.0的U盘很多情况下无法做到这个速度。CH376写U盘速度u是可以做到200-300KB/S。和您的要求相差太远了。 1MS写20个扇区,也就是10K,每秒需要接近10MB的速度啊。


哦,对不起,我算错了,我需要的速度是16k字节/秒,为了能够保证正确性,最低也得大于20k字节/秒,为了能够保证可靠性,希望能够达到50k字节/秒。 昨天我优化了一下延时,速度不太恒定,快的时候能够达到20k字节/秒,慢的时候只有几k字节/秒,但平均速率最多也只有10k字节/秒。

请教一下沁恒技术老师,优化速率应该从哪些角度进行?


首先你的单片机的速度要快些,比如想STC的单时钟的单片机或者AVR单片机,当然你要求的50KB以上一般的51要跑24MHZ以上的时钟。而且还是并口方式。 另外一次写入的字节数尽可能的多,至少也要512字节写一次。在一定范围内单次写入的数据量越大,速度会越快,当然不会超过极限。 看看你的读写字节(xWriteCH376Data xWriteCH376Cmd。。。三个函数)函数延时是否过长了,这都是C语言优化,相信对你来说不是问题。


ooo


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