关于CH375设备传输数度

需要CH375做数据采集的传输通道,数据量是300K,希望在1S传完 官方提供的DLL的API函数采用同步I/O方式,两次传输间隔不超过1MS 也就是说用批量传输的话,最大也不过是64KB/S 我实测是30KB/S,用的是25M的C8051F020(采用中断查询方式,影响到一点速度,以及内部模式) 但是看到大家一直讲可以做到400KB~600KB/S 如果用外部模式,自己写DLL,真的能到这个速度吗?不知道哪位大侠实现过? 如果可以达到这个速度,官方怎么不放个DLL出来,难道属于高端应用,需要技术保护? 但是这样不是相当于限制了应用场合?WCH是卖芯片的,又不是卖技术的,所以很纳闷。

PS:本人菜鸟,刚刚接触,如果说的不对的地方,还望大侠指教!

PC端的程序都是通用的,PC端的主要优化:1,使用缓冲上传模式;2, CH375ReadData一次尽量多读数据,最大支持4096. 单片机不要用模拟IO,用总线。还有优化读写函数!


谢谢楼上,现在主要是找不到优化方向。 您的意思是DLL不用自己写,主要是优化读取缓冲,以及单片机的控制?


主要还是优化单片机这边,PC这边对速度影响不大!


C8051F020晶体是25M,这个片子大部分指令都是单周期。只是没有使用总线方式 程序呢只是开了一个定时器,用来做记时的 然后就是让375将固定64个字节的数据上次,一共上传300K 然后串口打印输出时间(大概在9S--14S不等) 375上传是,首先64个字节端点2批量上传,然后一直等待查询中断,中断完成后,再发下一组 难道模拟IO方式比总线方式要慢这么多?

PS:上位机是在网上找的一个调试工具,可以连续接收。现在我拿不总是不是上位机的问题,比如它没有采用批量传输模式,而是采用中断传输模式,而自己又没有写上位机的能力,郁闷。

异常希望官方出一个顺手的调试工具,想想一个串口助手方便了多少人啊。


模拟IO的方式会比总线方式慢很多,你可以把你的代码贴出来看看。我们提供了调试工具。CH372DUG,可以到在线下载里下载。 不考虑MCU的影响,CH375传输速速大概在500-600KB/S


首先非常感谢版主,但是那个CH372DUG真没找到。 我的程序是这样的,由于板子的原因,没法使用总线方式,而且现在只是用单片机验证下速度 产品是用FPGA控制的,所以程序比较随意哈 我发现如果我只发送64个字节,用时340us 如果连续发送2次64个字节,居然需要3-6ms不等

/*省略了命令字定义,都是使用的手册上的名称,以及C8051F初始化程序、串口程序*/ #include "h\c8051f020.h" #include #include "h\UART0.h" #include "h\config.h" #include "h\F020init.h" #include "h\CH375.h"

volatile uint8 in_buff[64] = { 0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xa0, 0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xb0, 0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xc0, 0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xd0, 0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xe0, 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xf0, 0x00,0x00,0x00,0x00 };

void DelayXms(uint16 x) { uint16 i; uint16 j; for(i=0;i for(j=0;j<1450;j++) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } } void Timer4_Init(void)//20uS定时 { CKCON |= 0x40; EIE2|=0X04; RCAP4L = 0x0B; RCAP4H = 0xFE; TL4 = RCAP4L; TH4=RCAP4H ; } uint32 TRDA_count; void Timer4_Interrupt (void) interrupt 16 { T4CON&=~0X80; TRDA_count++; } void main (void) { uint32 i,n1; uint8 n; uint8 temp=0;

Init_Device(); //F020设备初始化 CH375_ini(); Timer4_Init(); DelayXms(100);

//读取版本号 i=CH375_IcVer(); Prints("icVer is "); PrintHex(i); Prints("\r\n");

//连接USB i=CH375_Connect(); Prints("Connect is "); PrintHex(i); Prints("\r\n");

while(1) //主循环 { if(temp==0x61) { Prints("300K数据开始发送\r\n"); i=300000;//发送字节总数 n1=0;//发送字节数清零 CH375_inter_num=0;//中断次数清零 TRDA_count=0x00; //计数器清零 TR1 = 0; //关闭定时器1 IE &= ~0x10; // 取消串口中断 T4CON|=0X04;//允许定时器4工作 while(i>0) { if(CH375_WR_INDEX==0) { n=CH375_WR_USB_EP(2 ,i,in_buff); i=i-n; n1=n1+n; } while(CH375_WR_INDEX==1) { if(CH375_GetIntPin()==0) CH375_GetStatus(); } } T4CON&=~0X04;//停止计数器工作 TR1 = 1; //定时器1启动 IE |= 0x10;//打开串口中断 Prints("300K数据开始完毕\r\n"); Prints("共发送"); PrintLongInt(n1); Prints("字节\r\n"); Prints("共用时"); PrintLongInt(TRDA_count*20); Prints("uS\r\n"); Prints("共中断"); PrintLongInt(CH375_inter_num); Prints("次\r\n"); temp=0; }

if(RS232_Resver==1) { temp=Resver_data; Resver_data=0; RS232_Resver=0; } } }

#define CH375_cs() CH375_CS=0;

#define CH375_SetCommandAddr() CH375_A0=1; #define CH375_SetDataAddr() CH375_A0=0

#define CH375_SetWr() CH375_WR=1 #define CH375_ClrWr() CH375_WR=0

#define CH375_SetRd() CH375_RD=1 #define CH375_ClrRd() CH375_RD=0

#define CH375_GetIntPin() CH375_INT

#define CH375_GetData() CH375_DATA #define CH375_SetData(Value) CH375_DATA=(Value)

#define CH375_SetPortIn() CH375_DATA=0xFF

void Delay_Time(void) { uint16 j; for(j=0;j<1;j++) { _nop_(); } } /*读数据*/ uint8 CH375_ReadData(void) { uint8 temp=0; Delay_Time(); CH375_SetRd(); //RD置高 CH375_SetDataAddr(); //设置为数据地址 CH375_ClrRd(); //RD置低 temp=CH375_GetData(); //读回数据 CH375_SetRd(); //RD置高 Delay_Time(); return temp; //返回读到数据 } /*写命令*/ void CH375_WriteCommand(uint8 Command) { Delay_Time();

CH375_SetWr(); CH375_SetCommandAddr(); CH375_SetData(Command); CH375_ClrWr(); CH375_SetWr(); CH375_SetPortIn(); //将数据口设置为输入状态,以备后面输入使用 Delay_Time(); } /*初始化*/ void CH375_ini(void) { CH375_cs(); CH375_INT=1; CH375_WriteCommand(RESET_ALL); } /*写数据*/ void CH375_WriteByte(uint8 Value) { Delay_Time();

CH375_SetWr(); CH375_SetDataAddr(); //设置为数据地址 CH375_SetData(Value); //写出数据 CH375_ClrWr(); //WR置低 CH375_SetWr(); //WR置高 CH375_SetPortIn(); //将数据口设置为输入状态,以备后面输入使用 Delay_Time(); } /*读版本号*/ uint8 CH375_IcVer(void) { uint8 id=0; CH375_WriteCommand(GET_IC_VER); id=CH375_ReadData(); //读取版本号 id&=~0x80; return id; } /*USB连接*/ uint8 CH375_Connect(void) { uint8 status=0; uint8 i=0; #ifdef DEBUG1 Prints("连接USB.\r\n"); #endif status=0x5f; //初始化使进入循环 while(status==0x5f) //如发生错误,尝试3次 { CH375_WriteCommand(SET_USB_MODE); CH375_WriteByte(0x02); Delay_Time(); Delay_Time(); status=CH375_ReadData(); if(i>3) break; } return status; } /*读取中断状态代码*/ uint8 CH375_GetStatus(void) { uint8 status=0; CH375_WriteCommand(GET_STATUS); status=CH375_ReadData();//读取命令状态 status=CH375_ReadData(); switch(status) { case USB_INT_EP0_SETUP: CH375_EP0_SETUP(); break; case USB_INT_EP0_OUT: CH375_EP0_OUT(); break; case USB_INT_EP0_IN: CH375_EP0_IN(); break;

case USB_INT_EP1_OUT: /*CH375_EP1_OUT();*/ break; case USB_INT_EP1_IN: /*CH375_EP1_IN();*/ break;

case USB_INT_EP2_OUT: CH375_EP2_OUT(); break; case USB_INT_EP2_IN: CH375_EP2_IN(); break;

case USB_INT_USB_SUSPEND: CH375_USB_SUSPEND(); break; case USB_INT_WAKE_UP: CH375_WAKE_UP(); break; default:status=0x5f; } return status;//返回0x5f,表示操作失败 } //接收主机发送到端点2的数据 void CH375_EP2_OUT(void) { uint8 i=0,j=0,x=0; CH375_WriteCommand(RD_USB_DATA0); i=CH375_ReadData(); for(j=0;j { x=CH375_ReadData();//读取命令状态 } CH375_WriteCommand(UNLOCK_USB); } //发送数据 uint8 CH375_WR_USB_EP(uint8 ep,uint32 len,uint8 *buf) { uint8 i,j; if(ep==1) { CH375_WriteCommand(WR_USB_DATA5); if(len<=8) j=(uint8)len; else j=8; } else if(ep==2) { CH375_WriteCommand(WR_USB_DATA7); if(len<=64) j=(uint8)len; else j=64; } else return j=0x5f; CH375_WriteByte(j); for(i=0;i { CH375_SetData(*(buf+i)); //写出数据 CH375_ClrWr(); //WR置低 CH375_SetWr(); //WR置高 _nop_(); _nop_(); _nop_(); } CH375_WR_INDEX=1;//置位标志,用来等待中断 return j; } void CH375_EP2_IN(void) { CH375_WriteCommand(UNLOCK_USB); CH375_inter_num++; CH375_WR_INDEX=0; }


谢谢版主了,应该是上位机的问题 我用SPEED372测试,上传可以达到200KB/S


void CH375_WriteCommand(uint8 Command) CH375_WriteByte(j); 在写完后延时即可,写前不需要延时


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