求助:如何能讓USB連續(xù)的發(fā)數(shù)據(jù)

以下是我寫的通過CH372向PC發(fā)送AD轉(zhuǎn)換數(shù)據(jù)的程序。波形可以顯示出來了,但不平滑,原因主要是:發(fā)送64B數(shù)據(jù)后得花時間再采集64B數(shù)據(jù),然后才能再發(fā)送64B。若改為一次讀取AD轉(zhuǎn)換后的1KB數(shù)據(jù)再發(fā)送,當(dāng)發(fā)完這1K后,也還得面臨采集的時間問題。 如果能讓AD不斷的采集,準(zhǔn)備好數(shù)據(jù),當(dāng)USB發(fā)送成功后立即又能發(fā)下一個64B,那么波形就會平滑了。 (1) 因?yàn)椴挥肍IFO,想利用單片機(jī)的內(nèi)部存儲器來暫存數(shù)據(jù)。程序應(yīng)該怎樣改才能實(shí)現(xiàn)呢? case 0x0A://USB_INT_EP2_IN,批量數(shù)據(jù)發(fā)送成功 SendCommand372(ULK_USB); // 釋放當(dāng)前USB緩沖區(qū) for(i=0;i<64;i++)//每次讀取AD轉(zhuǎn)換的64B數(shù)據(jù) { //啟動A/D12位轉(zhuǎn)換 PORTB&=~BIT(1); PORTB&=~BIT(2); //讀取A/D轉(zhuǎn)換數(shù)據(jù) while (PINB&(1< PORTB|=BIT(2); //進(jìn)行數(shù)據(jù)讀出 PORTB&=~BIT(1);//讀出高8位數(shù)據(jù) UsbSendBuf[i]=PINA;//存高8位數(shù)據(jù) PORTB|=BIT(1);//讀出低4位數(shù)據(jù) UsbSendBuf[++i]=PINA;//存低4位數(shù)據(jù) } WriteCH372Point2(UsbSendBuf, 64);//向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 break; (2)問一下以下程序的執(zhí)行順序: if(send==1) { 。。。。 WriteCH372Point2(UsbSendBuf_S,1);//向USB端點(diǎn)2發(fā)送緩沖區(qū)寫入數(shù)據(jù) for(i=0;i<64;i++) {。。。} } 當(dāng)程序執(zhí)行完“ WriteCH372Point2(UsbSendBuf_S,1);”就會跳到“case 0x0A://USB_INT_EP2_IN,批量數(shù)據(jù)發(fā)送成功 ”中,是不是要執(zhí)行到“case 0x0A:”結(jié)束后才會回來執(zhí)行:“for(i=0;i<64;i++){}”?還是執(zhí)行完:“ WriteCH372Point2(UsbSendBuf_S,1);”就接著往下執(zhí)行:“for(i=0;i<64;i++){}”?

謝謝各位的耐心閱讀,希望能給出一些建議。

(1)AD采集不可以放在批量數(shù)據(jù)發(fā)送成功中斷里去執(zhí)行,這樣會到只有批量數(shù)據(jù)發(fā)送成功后才會進(jìn)行AD采集,導(dǎo)致AD不能實(shí)時采集,數(shù)據(jù)不連續(xù),你可以在主程序中或用中斷實(shí)現(xiàn)AD采集,流程有些繁瑣,可以電話咨詢025-52638368 (2)WriteCH372Point2(UsbSendBuf_S,1)之后,必須等PC取走之后,才會產(chǎn)生USB_INT_EP2_IN中斷,接著執(zhí)行:“for(i=0;i<64;i++){}”


我昨天嘗試用中斷的方法,但那些中斷口已經(jīng)用作其他用途,要修改的東西比較多,還是沒能調(diào)成功。上面提到可以在主程序中實(shí)現(xiàn),想用這種方法,但思路還不清晰,希望能給些提示。 以下是我想法的流程圖和程序。不懂這種想法是否可行?初步調(diào)試還沒能成功??赡苁俏业牧鞒檀嬖趩栴},麻煩幫看一下。用的A/D是AD574轉(zhuǎn)換時間為25US,AVR單片機(jī)8M晶振,CH372。不知在等待PC取走數(shù)據(jù),發(fā)回上傳成功和釋放緩沖區(qū)期間AD是否已經(jīng)采夠64B。

20097510432834.jpg main.c如下: #include #include #include #include "CH372.c"

SIGNAL(SIG_INTERRUPT1)//使用外部中斷1 { DealInt372();//CH372中斷服務(wù)程序 }

int main() { AD574_init();//初始化AD InitCH372Sys();//初始化CH372 while(1) { SendCH372Data_ToPC_1();//等待PC發(fā)來開始采集命令,包含AD采集子程序 } }

CH372.c中與AD和PC相關(guān)的程序如下: uint SendCH372Data_ToPC_1() { uint i,adl; for(i=0;i<64;i++)//每次讀取AD轉(zhuǎn)換的64B存在UsbSendBuf[]中 { //啟動A/D12位轉(zhuǎn)換 PORTB&=~BIT(1);//啟動12位轉(zhuǎn)換 PORTB&=~BIT(2);//開始A/D轉(zhuǎn)換 //讀取A/D轉(zhuǎn)換數(shù)據(jù) while (PINB&(1< PORTB|=BIT(2); //進(jìn)行數(shù)據(jù)讀出 PORTB&=~BIT(1);//讀出高8位數(shù)據(jù) UsbSendBuf[i] = PINA; //存高8位數(shù)據(jù) PORTB|=BIT(1);//讀出低4位數(shù)據(jù) adl=PINA; UsbSendBuf[++i]=adl&0X0f; //存低4位數(shù)據(jù) } if(Send==1)//等待PC發(fā)來采集命令20 { cli();//清除全局中斷. EA = 0 UsbSendBuf_C[0]=8;//向PC發(fā)命令8表示準(zhǔn)備上傳AD數(shù)據(jù) sei(); //使能全局中斷;EA= 1 WriteCH372Point2(UsbSendBuf_C, 1);//發(fā)數(shù)據(jù)8,然后就進(jìn)入中斷服務(wù)程序的上傳成功,接著不斷的發(fā)AD數(shù)據(jù) Send=0;//只有剛開始進(jìn)入這個子程序,后面就不會進(jìn)入了 } } uchar DealInt372(void) { case 0x02: //USB_INT_EP2_OUT ,批量端點(diǎn)/端點(diǎn)2接收到數(shù)據(jù)成功 SendCommand372(R_USB_DATA);// 寫入讀端點(diǎn)2數(shù)據(jù)的命令,釋放緩沖區(qū) InitFlag1=Read_Data372(); //讀端點(diǎn)2收到數(shù)據(jù)的字節(jié)數(shù) if(InitFlag1 == 1) { THIS_CMD_CODE=Read_Data372(); if(THIS_CMD_CODE == 20) {//收到命令20,就轉(zhuǎn)到將數(shù)據(jù)上傳PC Send=1; } } break;

case 0x0A://USB_INT_EP2_IN,批量數(shù)據(jù)發(fā)送成功 SendCommand372(ULK_USB); // 釋放當(dāng)前USB緩沖區(qū) WriteCH372Point2(UsbSendBuf, 64);//每次上傳64B break;

麻煩幫忙看看,謝謝。


實(shí)測一下CH372與PC通信的速度,分析USB傳輸和AD采集哪個速度更快一些,其實(shí)只要在空閑的時候總是進(jìn)行AD采集,滿64B數(shù)據(jù)就進(jìn)行上傳,使用雙緩沖,一個用來保存AD數(shù)據(jù),滿的時候上傳,同時用另一個繼續(xù)保存AD數(shù)據(jù)


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频