上位机通过CH375WriteData发送数据,DSP通过Ch372接收到数据、分析之后通过CMD_WR_USB_DATA7发送数据至计算机。计算机通过CH375ReadData读取数据。
假如发送和接收的数据都是1个字节。则这样的方法传输速度能打到每秒多少次传输?
知道的人告诉我吧~ 谢谢大家的帮忙~~~
上位机通过CH375WriteData发送数据,DSP通过Ch372接收到数据、分析之后通过CMD_WR_USB_DATA7发送数据至计算机。计算机通过CH375ReadData读取数据。
假如发送和接收的数据都是1个字节。则这样的方法传输速度能打到每秒多少次传输?
知道的人告诉我吧~ 谢谢大家的帮忙~~~
唉,实在不行我就换其他芯片吧
不论你用什么样的芯片,如果你每次只传一个字节的话,那么传输速度是提高不上去的,你可以把每次上传的数据每次提高到64字节,这样的话,传输速度是可以做到400K-500K字节/S的速度的.
多谢回答! 我明白您的意思。 可是我做数据采集,每次的数据量很小,就27个字节左右。我就想知道到底每秒能传多少组数据。
关键取决于你自己采集的数据量是多少?如果数据量大的话按照我上面的方式来进行数据传输,如果数据量小的话你一次采集27字节那么你就上传27字节就可以. 注:这里所说的数据量的大小指的是你一秒内采集的数据量,也就是所谓的采集速度是多快
我做的这个系统采集速度是10K,这个数据主要是用于PID运算。只有在上位机需要读取数据时,才进行数据传输。每一组数据量就是27个字节左右。
hcn,谢谢~ 能否msn里指点我一下, msn:个人信息保护,已隐藏
你可以把你的详细设计说明发过来看下,这样才能确定你采用什么样的方式来操作CH372,如果仅仅按照你上面所说,我们的CH372是完全符合你的要求的.
void CH375_WR_CMD_PORT( unsigned int cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ Delay2us(); CH375_CMD_PORT=cmd; Delay2us(); }
void CH375_WR_DAT_PORT( unsigned int dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ CH375_DAT_PORT=dat; Delay1us(); /* 如果是MCS51单片机,因其较慢,所以实际上无需延时 */ }
unsigned int CH375_RD_DAT_PORT( void ) { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ Delay1us(); /* 如果是MCS51单片机,因其较慢,所以实际上无需延时 */ return( CH375_DAT_PORT&0x00ff ); }
/*#define MY_USB_VENDOR_ID 0x4348*/ /* 定义自己的USB设备的厂商ID */ /*#define MY_USB_PRODUCT_ID 0x5537*/ /* 定义自己的USB设备的产品ID */ /*#define ENABLE_USB_SUSPEND 1*/ /* 检查USB总线的挂起状态,便于进入低功耗模式 */ /*#define ENABLE_USB_SUSPEND */
/* CH375初始化子程序 */ void CH375_Init( void ) { unsigned int i;
#ifdef MY_USB_VENDOR_ID #ifdef MY_USB_PRODUCT_ID /* 设置外部自定义的USB设备VID和PID,可选操作,不执行该命令则使用默认的VID和PID, 如果设置使用自定义的ID,那么计算机端驱动程序INF安装文件中的"USB\VID_4348&PID_5537"需要进行类似修改 */ CH375_WR_CMD_PORT( CMD_SET_USB_ID ); /* 设置外部自定义的USB设备VID和PID,可选操作 */ CH375_WR_DAT_PORT( MY_USB_VENDOR_ID&0x00ff ); /* 写入厂商ID的低字节 */ CH375_WR_DAT_PORT((MY_USB_VENDOR_ID>>8)&0x00ff ); /* 写入厂商ID的高字节 */ CH375_WR_DAT_PORT( MY_USB_PRODUCT_ID&0x00ff ); /* 写入产品ID的低字节 */ CH375_WR_DAT_PORT((MY_USB_PRODUCT_ID>>8)&0x00ff ); /* 写入产品ID的高字节 */ #endif #endif
/* 设置USB工作模式, 必要操作 */ CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 2 ); /* 设置为使用内置固件的USB设备方式 */ for ( i=10000; i!=0; i-- ) if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; /* 等待操作成功,通常需要等待10uS-20uS */ /* if ( i == 0 ) { CH372/CH375芯片内部或者物理连接存在硬件错误 }; */
#ifdef ENABLE_USB_SUSPEND /* 设置检查USB总线挂起状态,便于在USB总线挂起时使CH375也进入低功耗状态 */ CH375_WR_CMD_PORT( CMD_CHK_SUSPEND ); /* 设置检查USB总线挂起状态的方式 */ CH375_WR_DAT_PORT( 0x10 ); CH375_WR_DAT_PORT( 0x04 ); /* 以50mS为间隔检查USB挂起 */ #endif }
unsigned int UsbLength; /* USB数据缓冲区中数据的长度 */ //unsigned int UsbBuffer[ CH375_MAX_DATA_LEN ]; /* USB数据缓冲区 */ char UsbBuffer[ 100 ]; /* USB数据缓冲区 */
void Ch375_Send() { unsigned int cnt; char *buf;
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端点2的发送缓冲区写入数据块 cnt = strlen(UsbBuffer); CH375_WR_DAT_PORT( cnt ); // 首先写入后续数据长度 if ( cnt ) { // 将缓冲区中的数据发出 buf = UsbBuffer; // 指向缓冲区 do { CH375_WR_DAT_PORT( *buf ); //写入数据到CH375 buf ++; } while ( -- cnt ); } }
/*ch372 interupt routine*/ void HWI_XINT1_Fxn() { unsigned int IntStatus; unsigned int cnt; char *buf;
//about hardware interrupt PieCtrlRegs.PIEACK.bit.ACK1=1;//clear ACK flag.
CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ IntStatus = CH375_RD_DAT_PORT( ); /* 获取中断状态 */
switch( IntStatus ) { /* 分析中断状态 */ case USB_INT_EP2_OUT: /* 批量端点下传成功,接收到数据 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ /* 如果使用CMD_RD_USB_DATA0命盥,那么读取数据块后不会自动释放缓冲区,需要CMD_UNLOCK_USB命令后才释放 */ UsbLength = cnt = CH375_RD_DAT_PORT( ); /* 首先读取后续数据长度 */ if ( cnt ) { /* 接收到数据放到缓冲区中 */ buf = UsbBuffer; /* 指向缓冲区 */ do { *buf = CH375_RD_DAT_PORT( ); /* 接收命令包的数据 */ buf ++; } while ( -- cnt ); } else break; /* 长度为0,没有数据,在某些应用中也可以将长度0定义为一种特殊命令 */ /* 分析接收到的数据并处理,此处略去,下面演示回传数据 */
SYS_sprintf(UsbBuffer,"$:Dat;Q=%ld;A=%ld;\r\n",MyQEP_PU.OutputCnt ,ADC_Res.val); Ch375_Send();//无论接收到什么数据,直接发送数据;
break;
case USB_INT_EP2_IN: /* 批量端点上传成功,数据发送成功 */ /* 如果还有数据需要接着发送,可在此通过CMD_WR_USB_DATA7命令写入,参考前面的回传 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区,收到上传成功中断后,必须解锁USB缓冲区,以便继续收发 */ break; case USB_INT_EP1_IN: /* 中断端点上传成功,中断数据发送成功 */ /* 中断端点可以用于单片机及时通知计算机端,本程序未用到 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; /* 以下状态只有CH372A/CH375A支持 */ case USB_INT_EP1_OUT: /* 辅助端点下传成功,接收到辅助数据 */ /* 辅助端点可以用于计算机端向单片机端发送包,本程序未用到,辅助数据的接收可以参考批量端点 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; #ifdef ENABLE_USB_SUSPEND /* 以下状态只有CH372A/CH375A支持,默认情况下不会出现这些中断状态,只有当执行相应的命令后才会出现这些状态,根据需要处理 */ case USB_INT_USB_SUSPEND: /* USB总线挂起事件,只有当执行过CMD_CHK_SUSPEND命令后才可能出现该中断状态 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ CH375_WR_CMD_PORT( CMD_ENTER_SLEEP ); /* 这是可选操作,进入低功耗睡眠挂起状态 */ break; case USB_INT_WAKE_UP: /* 从睡眠中被唤醒事件,只有当执行过CMD_ENTER_SLEEP命令后才可能出现该中断状态 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; #endif default: /* 内置固件的USB方式下不应该出现其它中断状态,如果启用USB总线挂起检查,那么还要处理USB总线挂起和睡眠唤醒事件 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; }
这个程序本身没有任何问题,你直接往端点2写数据就可以实现数据的传输
我把程序发出来,大家帮我看看好吗? 黏贴后格式有变化,所以我把程序作为.txt文件上传到帖子里,见楼上!请直接打开“UploadImages/20093311485941.txt”
程序没有任何问题.速度慢的原因是一个字节一个字节上传,你把数据缓冲起来,然后进行批量传输就可以了.
恩,谢谢各位了~~~ 上位机接收到数据后,处理数据需要花费比较长时间,可能问题在这里吧。另外每次传输数据很少,不太合理。我现在试了试每秒100组数据已经够用了。 谢谢大家~
如果速度采集仅仅为10K,或者使用CH340是更好的选择……