用ch372發(fā)送數(shù)據(jù)時(shí)總接收異常

我用ch372發(fā)送ad轉(zhuǎn)換的數(shù)據(jù),可是接收到的數(shù)據(jù)總是不對。用的是端點(diǎn)2批量發(fā)送的,數(shù)據(jù)包的大小為64,接收時(shí),一個(gè)包內(nèi)的數(shù)據(jù)基本正常,可是包與包之間就不對了,比如前一個(gè)包結(jié)束時(shí)是5,下一個(gè)包開始時(shí)就是-1,只應(yīng)該是6的才對。下面是發(fā)送的程序 void ad_int() interrupt 2 //ad中斷函數(shù),完成接收數(shù)據(jù)和發(fā)送 { uchar dat1=0,dat2=0,dat3=0,temp=0; RD=0; dat3=bz; dat1=P0; temp=P1; RD=1;

dat2=(temp&0xe0)>>5; dat3=dat3<<7; dat2=dat2|dat3; f1=dat1; f2=dat2;

if(flag==1) { CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 delay2us(); CH375_WR_DAT_PORT( 64 ); //首先寫入后續(xù)數(shù)據(jù)長度 flag=0; } CH375_WR_DAT_PORT( f1 ); // 向ch372寫入數(shù)據(jù) delay2us(); CH375_WR_DAT_PORT( f2 ); // 向ch372寫入數(shù)據(jù) i+=2; if(i==64) flag=1; }

如果你寫的數(shù)據(jù)長度是64的話那么你后續(xù)需要些64個(gè)字節(jié)到CH372芯片里面去,看你的程序只寫了2個(gè)字節(jié)肯定是不行的。


數(shù)據(jù)發(fā)送是在中斷里進(jìn)行,20u一次中斷,每次發(fā)送兩個(gè)字節(jié),我想這樣應(yīng)該是可以的吧?


這個(gè)是沒什么問題,但是每次發(fā)送數(shù)據(jù)必須等到上一次中斷完成之后才能進(jìn)行下一次中斷。否則會丟中斷的。


CH375_WR_DAT_PORT( 64 ); 一次發(fā)送的數(shù)據(jù)為64字節(jié)。 你每20US寫的兩個(gè)字節(jié),其實(shí)是寫道CH375的緩沖區(qū)里面去的,并沒有被發(fā)送,當(dāng)寫的字節(jié)個(gè)數(shù)為64的時(shí)候,CH375才會等下次PC來讀數(shù)據(jù)的時(shí)候?qū)?shù)據(jù)送出。 這個(gè)時(shí)候要等待中斷,不能再寫數(shù)據(jù)了。 等中斷來了,檢查中斷狀態(tài),如果為上傳成功,則可以繼續(xù)下一次傳輸了。


在等待中斷的時(shí)候,ad仍然在轉(zhuǎn)換呀,還會有數(shù)據(jù)丟失,這該怎么辦呢?51單片機(jī)連續(xù)向372緩沖區(qū)寫入64個(gè)字節(jié)的數(shù)據(jù)需要多長時(shí)間呀?


需要多長時(shí)間只有你才知道啊,你看看你的程序是不是寫的很慢啊。


那么是不是等待中斷的時(shí)間有點(diǎn)長呢?我發(fā)現(xiàn)丟了不少數(shù)據(jù)。372產(chǎn)生的中斷狀態(tài)只可能是計(jì)算機(jī)成功接收的狀態(tài),中斷里只執(zhí)行了解除鎖存的動作。


這種問題都需要實(shí)際測試才能確定問題在哪里,否則很難給確定的答案。你計(jì)算一下AD速度,再計(jì)算你寫入CH372的速度,另外在等中斷的適合數(shù)據(jù)你要先緩存下來。


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

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