斑竹: 您好,前段時(shí)間問過CH341A的BUS方式問題,現(xiàn)在板子做出來了,上電后341A的配置都完成了,而且也能夠打開和關(guān)閉usb口,同時(shí)也能響應(yīng)中斷??墒蔷褪菬o法讀寫,因?yàn)锳LE端總是高電平,而且D0~D7也總是高電平,請(qǐng)問這是為什么呢?是不是我還沒進(jìn)入BUS方式?上次貴公司告訴我說在并口方式下直接發(fā)送命令就可以了,請(qǐng)問是這樣嗎?能幫我分析一下嗎?謝謝!
將上位機(jī)的程序貼出來看看
#include "stdio.h" #include "stdafx.h" #include "ch341dll.h" #define uchar unsigned char #define ulong unsigned long #define uint unsigned int
void CALLBACK myint(ulong status) //中斷服務(wù)子程序 {
FILE * testfile2; testfile2=fopen("test2.txt","w+t"); fprintf(testfile2,"***INTRRUPT***\n");//若發(fā)生中斷則輸出到文件test2.txt fclose(testfile2); }
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { uchar addr, data; FILE * testfile; testfile=fopen("test.txt","w+t");//建立一個(gè)文件,用來輸出程序進(jìn)展中的標(biāo)志字符 ulong out_len, in_len; uchar out_buf[32]; uchar in_buf[32];
fprintf(testfile,"Start***************\n");
if(CH341OpenDevice(0)==INVALID_HANDLE_VALUE) fprintf(testfile,"Failed!\n"); else fprintf(testfile,"Ok!\n");
CH341InitParallel(0,2); CH341SetIntRoutine(0,myint);
addr=0x00; data=0xf0; out_buf[0] = mCH341A_CMD_IO_ADDR; // BUS方式命令碼 out_buf[1] = addr | mCH341A_CMD_IO_ADDR_W; out_buf[2] = data; out_len = 3; // 準(zhǔn)備輸出3個(gè)字節(jié) CH341WriteData(0, out_buf, &out_len); // 向addr寫入data CH341GetStatus(0, &in_len); fprintf(testfile,"%x\n",in_len);
CH341CloseDevice(0); fprintf(testfile,"Over***************\n"); fclose(testfile); return 0; }
上面就是我的上位機(jī)程序,CH341A外接了74HC373鎖存器,和datasheet里的BUS方式連接電路一樣用來擴(kuò)展地址,74HC373的 /OE 端接地,LE 端接 341A的 ALE端,上位機(jī)程序中的 addr=0x00 這句我試了多種地址,可是74HC373的輸出端電平始終都和D7~D0一樣,都是高電平,等于說373根本沒起作用啊,原因應(yīng)該就是 LE端始終為高電平的原因了,我測(cè)了ALE的電平,始終都是高。這是怎么回事呢?
萬用表不能測(cè)到脈沖,必須用數(shù)字存儲(chǔ)示波器用單次觸發(fā)方式才能測(cè)出。 因?yàn)槭荁US總線方式,測(cè)量其靜態(tài)電壓沒有意義。注意:計(jì)算機(jī)、單片機(jī)的總線靜態(tài)一般默認(rèn)都是高電平。 因?yàn)锳LE默認(rèn)為高電平,所以你用萬用表測(cè)出的所有狀態(tài)都是正常的。 但是實(shí)際上,CH341收到數(shù)據(jù)包后: 1、將ALE先置低 2、從D0-D7輸出地址,ALE產(chǎn)生高電平通知HC373鎖存地址 3、從D0-D7輸出數(shù)據(jù),將WR#置低電平脈沖通知外部電路寫操作進(jìn)行中 4、將ALE恢復(fù)為默認(rèn)的高電平,D0-D7默認(rèn)為高電平 所以萬用表測(cè)不出,可以用下述方法驗(yàn)證: 將WR#接到HC374的CLK,看是否輸出數(shù)據(jù), 或者按ISA總線的接法、MCS51單片機(jī)的接法去驗(yàn)證
如果想你描述的那樣,在一次寫的操作中 ALE端 豈不是有兩個(gè)上升沿?鎖存器要鎖存兩次?
-----------_______________-----_________________------------ 默認(rèn)高 收到數(shù)據(jù)包 高電平 變低 恢復(fù)默認(rèn)高
那這樣最終374的輸出就和寫操作完畢后的D7~D0默認(rèn)狀態(tài)一樣,還是全是高,是嗎?
還有一個(gè)問題,341的datasheet中說只能產(chǎn)生A0~A6 7位地址,A7為0代表要寫操作,為1代表要讀操作,這里怎么理解呢?
關(guān)鍵是要理解什么是總線,ALE出現(xiàn)多少脈沖沒有什么關(guān)系,因?yàn)榭偩€中的數(shù)據(jù)是靠WR和RD的脈沖驅(qū)動(dòng)的,剛才請(qǐng)你看MCS51單片機(jī)的技術(shù)資料,就是便于比較,從而容易理解。HC374是用WR驅(qū)動(dòng)的,CH341保證在WR有效時(shí)的ADDR和數(shù)據(jù)是正確有效的(這是你應(yīng)該關(guān)心的),ALE對(duì)你沒有意義,它只是中間信號(hào)用于鎖存地址而已
至于A7你用不到,有人用來提前知道下一步是讀或者寫操作而已。HC373輸出的地址也屬于總線信號(hào)的一部分
tech,還在嗎?剛又有新發(fā)現(xiàn)。 我的上位機(jī)程序里有一句 是 CH341GetStatus(0, &in_len); fprintf(testfile,"%x\n",in_len); 非中斷時(shí)輸出的結(jié)果是efff(1110 1111 1111 1111),中斷時(shí)輸出ebff(1110 1011 1111 1111) datasheet上說 位7-位0 對(duì)應(yīng)CH341 的D7-D0 引腳,位8 對(duì)應(yīng)CH341 的ERR#引腳, 位9 對(duì)應(yīng)CH341 的PEMP 引腳, 位10 對(duì)應(yīng)CH341 的INT#引腳, 位11 對(duì)應(yīng)CH341 的SLCT 引腳,位23 對(duì)應(yīng)CH341 的SDA 引腳。 0到11位都能對(duì)上,可是23位為什么是“1”呢?我的電路連接上SDA已經(jīng)接地了,而且測(cè)的電壓也是0 啊。這是怎么回事? 還有 我得到的數(shù)據(jù)的 第12位 那個(gè)“0”代表什么?
你顯示的只有0到15位,哪有23位?12位的0有變化當(dāng)然就是INT#中斷腳了