上位機通過CH375WriteData發(fā)送數(shù)據(jù),DSP通過Ch372接收到數(shù)據(jù)、分析之后通過CMD_WR_USB_DATA7發(fā)送數(shù)據(jù)至計算機。計算機通過CH375ReadData讀取數(shù)據(jù)。
假如發(fā)送和接收的數(shù)據(jù)都是1個字節(jié)。則這樣的方法傳輸速度能打到每秒多少次傳輸?
知道的人告訴我吧~ 謝謝大家的幫忙~~~
上位機通過CH375WriteData發(fā)送數(shù)據(jù),DSP通過Ch372接收到數(shù)據(jù)、分析之后通過CMD_WR_USB_DATA7發(fā)送數(shù)據(jù)至計算機。計算機通過CH375ReadData讀取數(shù)據(jù)。
假如發(fā)送和接收的數(shù)據(jù)都是1個字節(jié)。則這樣的方法傳輸速度能打到每秒多少次傳輸?
知道的人告訴我吧~ 謝謝大家的幫忙~~~
唉,實在不行我就換其他芯片吧
不論你用什么樣的芯片,如果你每次只傳一個字節(jié)的話,那么傳輸速度是提高不上去的,你可以把每次上傳的數(shù)據(jù)每次提高到64字節(jié),這樣的話,傳輸速度是可以做到400K-500K字節(jié)/S的速度的.
多謝回答! 我明白您的意思。 可是我做數(shù)據(jù)采集,每次的數(shù)據(jù)量很小,就27個字節(jié)左右。我就想知道到底每秒能傳多少組數(shù)據(jù)。
關(guān)鍵取決于你自己采集的數(shù)據(jù)量是多少?如果數(shù)據(jù)量大的話按照我上面的方式來進行數(shù)據(jù)傳輸,如果數(shù)據(jù)量小的話你一次采集27字節(jié)那么你就上傳27字節(jié)就可以. 注:這里所說的數(shù)據(jù)量的大小指的是你一秒內(nèi)采集的數(shù)據(jù)量,也就是所謂的采集速度是多快
我做的這個系統(tǒng)采集速度是10K,這個數(shù)據(jù)主要是用于PID運算。只有在上位機需要讀取數(shù)據(jù)時,才進行數(shù)據(jù)傳輸。每一組數(shù)據(jù)量就是27個字節(jié)左右。
hcn,謝謝~ 能否msn里指點我一下, msn:個人信息保護,已隱藏
你可以把你的詳細設(shè)計說明發(fā)過來看下,這樣才能確定你采用什么樣的方式來操作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的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 */ CH375_DAT_PORT=dat; Delay1us(); /* 如果是MCS51單片機,因其較慢,所以實際上無需延時 */ }
unsigned int CH375_RD_DAT_PORT( void ) { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 */ Delay1us(); /* 如果是MCS51單片機,因其較慢,所以實際上無需延時 */ return( CH375_DAT_PORT&0x00ff ); }
/*#define MY_USB_VENDOR_ID 0x4348*/ /* 定義自己的USB設(shè)備的廠商ID */ /*#define MY_USB_PRODUCT_ID 0x5537*/ /* 定義自己的USB設(shè)備的產(chǎn)品ID */ /*#define ENABLE_USB_SUSPEND 1*/ /* 檢查USB總線的掛起狀態(tài),便于進入低功耗模式 */ /*#define ENABLE_USB_SUSPEND */
/* CH375初始化子程序 */ void CH375_Init( void ) { unsigned int i;
#ifdef MY_USB_VENDOR_ID #ifdef MY_USB_PRODUCT_ID /* 設(shè)置外部自定義的USB設(shè)備VID和PID,可選操作,不執(zhí)行該命令則使用默認的VID和PID, 如果設(shè)置使用自定義的ID,那么計算機端驅(qū)動程序INF安裝文件中的"USB\VID_4348&PID_5537"需要進行類似修改 */ CH375_WR_CMD_PORT( CMD_SET_USB_ID ); /* 設(shè)置外部自定義的USB設(shè)備VID和PID,可選操作 */ CH375_WR_DAT_PORT( MY_USB_VENDOR_ID&0x00ff ); /* 寫入廠商ID的低字節(jié) */ CH375_WR_DAT_PORT((MY_USB_VENDOR_ID>>8)&0x00ff ); /* 寫入廠商ID的高字節(jié) */ CH375_WR_DAT_PORT( MY_USB_PRODUCT_ID&0x00ff ); /* 寫入產(chǎn)品ID的低字節(jié) */ CH375_WR_DAT_PORT((MY_USB_PRODUCT_ID>>8)&0x00ff ); /* 寫入產(chǎn)品ID的高字節(jié) */ #endif #endif
/* 設(shè)置USB工作模式, 必要操作 */ CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 2 ); /* 設(shè)置為使用內(nèi)置固件的USB設(shè)備方式 */ for ( i=10000; i!=0; i-- ) if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; /* 等待操作成功,通常需要等待10uS-20uS */ /* if ( i == 0 ) { CH372/CH375芯片內(nèi)部或者物理連接存在硬件錯誤 }; */
#ifdef ENABLE_USB_SUSPEND /* 設(shè)置檢查USB總線掛起狀態(tài),便于在USB總線掛起時使CH375也進入低功耗狀態(tài) */ CH375_WR_CMD_PORT( CMD_CHK_SUSPEND ); /* 設(shè)置檢查USB總線掛起狀態(tài)的方式 */ CH375_WR_DAT_PORT( 0x10 ); CH375_WR_DAT_PORT( 0x04 ); /* 以50mS為間隔檢查USB掛起 */ #endif }
unsigned int UsbLength; /* USB數(shù)據(jù)緩沖區(qū)中數(shù)據(jù)的長度 */ //unsigned int UsbBuffer[ CH375_MAX_DATA_LEN ]; /* USB數(shù)據(jù)緩沖區(qū) */ char UsbBuffer[ 100 ]; /* USB數(shù)據(jù)緩沖區(qū) */
void Ch375_Send() { unsigned int cnt; char *buf;
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 cnt = strlen(UsbBuffer); CH375_WR_DAT_PORT( cnt ); // 首先寫入后續(xù)數(shù)據(jù)長度 if ( cnt ) { // 將緩沖區(qū)中的數(shù)據(jù)發(fā)出 buf = UsbBuffer; // 指向緩沖區(qū) do { CH375_WR_DAT_PORT( *buf ); //寫入數(shù)據(jù)到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 ); /* 獲取中斷狀態(tài)并取消中斷請求 */ IntStatus = CH375_RD_DAT_PORT( ); /* 獲取中斷狀態(tài) */
switch( IntStatus ) { /* 分析中斷狀態(tài) */ case USB_INT_EP2_OUT: /* 批量端點下傳成功,接收到數(shù)據(jù) */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ /* 如果使用CMD_RD_USB_DATA0命盥,那么讀取數(shù)據(jù)塊后不會自動釋放緩沖區(qū),需要CMD_UNLOCK_USB命令后才釋放 */ UsbLength = cnt = CH375_RD_DAT_PORT( ); /* 首先讀取后續(xù)數(shù)據(jù)長度 */ if ( cnt ) { /* 接收到數(shù)據(jù)放到緩沖區(qū)中 */ buf = UsbBuffer; /* 指向緩沖區(qū) */ do { *buf = CH375_RD_DAT_PORT( ); /* 接收命令包的數(shù)據(jù) */ buf ++; } while ( -- cnt ); } else break; /* 長度為0,沒有數(shù)據(jù),在某些應(yīng)用中也可以將長度0定義為一種特殊命令 */ /* 分析接收到的數(shù)據(jù)并處理,此處略去,下面演示回傳數(shù)據(jù) */
SYS_sprintf(UsbBuffer,"$:Dat;Q=%ld;A=%ld;\r\n",MyQEP_PU.OutputCnt ,ADC_Res.val); Ch375_Send();//無論接收到什么數(shù)據(jù),直接發(fā)送數(shù)據(jù);
break;
case USB_INT_EP2_IN: /* 批量端點上傳成功,數(shù)據(jù)發(fā)送成功 */ /* 如果還有數(shù)據(jù)需要接著發(fā)送,可在此通過CMD_WR_USB_DATA7命令寫入,參考前面的回傳 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū),收到上傳成功中斷后,必須解鎖USB緩沖區(qū),以便繼續(xù)收發(fā) */ break; case USB_INT_EP1_IN: /* 中斷端點上傳成功,中斷數(shù)據(jù)發(fā)送成功 */ /* 中斷端點可以用于單片機及時通知計算機端,本程序未用到 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; /* 以下狀態(tài)只有CH372A/CH375A支持 */ case USB_INT_EP1_OUT: /* 輔助端點下傳成功,接收到輔助數(shù)據(jù) */ /* 輔助端點可以用于計算機端向單片機端發(fā)送包,本程序未用到,輔助數(shù)據(jù)的接收可以參考批量端點 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; #ifdef ENABLE_USB_SUSPEND /* 以下狀態(tài)只有CH372A/CH375A支持,默認情況下不會出現(xiàn)這些中斷狀態(tài),只有當(dāng)執(zhí)行相應(yīng)的命令后才會出現(xiàn)這些狀態(tài),根據(jù)需要處理 */ case USB_INT_USB_SUSPEND: /* USB總線掛起事件,只有當(dāng)執(zhí)行過CMD_CHK_SUSPEND命令后才可能出現(xiàn)該中斷狀態(tài) */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ CH375_WR_CMD_PORT( CMD_ENTER_SLEEP ); /* 這是可選操作,進入低功耗睡眠掛起狀態(tài) */ break; case USB_INT_WAKE_UP: /* 從睡眠中被喚醒事件,只有當(dāng)執(zhí)行過CMD_ENTER_SLEEP命令后才可能出現(xiàn)該中斷狀態(tài) */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; #endif default: /* 內(nèi)置固件的USB方式下不應(yīng)該出現(xiàn)其它中斷狀態(tài),如果啟用USB總線掛起檢查,那么還要處理USB總線掛起和睡眠喚醒事件 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; }
這個程序本身沒有任何問題,你直接往端點2寫數(shù)據(jù)就可以實現(xiàn)數(shù)據(jù)的傳輸
我把程序發(fā)出來,大家?guī)臀铱纯春脝幔?黏貼后格式有變化,所以我把程序作為.txt文件上傳到帖子里,見樓上!請直接打開“UploadImages/20093311485941.txt”
程序沒有任何問題.速度慢的原因是一個字節(jié)一個字節(jié)上傳,你把數(shù)據(jù)緩沖起來,然后進行批量傳輸就可以了.
恩,謝謝各位了~~~ 上位機接收到數(shù)據(jù)后,處理數(shù)據(jù)需要花費比較長時間,可能問題在這里吧。另外每次傳輸數(shù)據(jù)很少,不太合理。我現(xiàn)在試了試每秒100組數(shù)據(jù)已經(jīng)夠用了。 謝謝大家~
如果速度采集僅僅為10K,或者使用CH340是更好的選擇……