鄙人使用CH375A 作為USB設(shè)備接口.按CH375A應(yīng)用手冊(cè)上并口方式連接電路.插入PC USB口后 卻未見反應(yīng).不知怎么回事.是否芯片已經(jīng)燒壞?(之前C5因?yàn)槲促I到100U的貼片電容,使用10U替代;結(jié)果C5爆裂,提示 '無法識(shí)別USB設(shè)備') 望諸位大俠施以援手,小弟不勝感激.^v^[Emot]13[/Emot]
你先檢查下你的硬件連接有沒有問題,用CHECK—EXIST命令,看輸出的數(shù)據(jù)是不是你輸入數(shù)據(jù)的去反,還有就是你的晶振起振了沒有?
謝謝回復(fù)!希望WCH或大蝦能對(duì)CH375的計(jì)算機(jī)應(yīng)用層編程有一個(gè)更詳細(xì)的指導(dǎo):
.問題已經(jīng)解決. 現(xiàn)在已經(jīng)開始與PC通訊調(diào)試。但在使用CH375DLL時(shí),卻發(fā)現(xiàn)函數(shù)說明不正確。采用單向數(shù)據(jù)傳輸方式,使用設(shè)置內(nèi)部緩沖上傳時(shí)卻無法使用。 Function CH375SetBufUpload( iIndex:cardinal; // 指定CH375設(shè)備序號(hào),0對(duì)應(yīng)第一個(gè)設(shè)備 iEnableOrClear:cardinal):longbool;Stdcall;external 'CH375DLL.DLL';不知道該怎么使用。 能提供一個(gè)簡(jiǎn)單的例程嗎?
還有demon中“采用偽中斷上傳”里面涉及的主要技術(shù)沒搞懂 ,希望WCH或大蝦能對(duì)CH375的計(jì)算機(jī)應(yīng)用層編程有一個(gè)更詳細(xì)的指導(dǎo): 1 設(shè)備插拔監(jiān)視與處理 設(shè)置設(shè)備插拔監(jiān)視程序: CH375SetDeviceNotify(); 設(shè)備插拔事件通知程序NotifyRoutine(iEventStatus:cardinal ) 設(shè)備插拔事件處理pnpproceKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState)中根據(jù)插拔事件通知信息所提供的iEventStatues做相應(yīng)處理; 2.偽中斷上傳 1)設(shè)定中斷服務(wù)程序 Function CH375SetIntRoutine (iIndex:cardinal;iIntRoutine :TiIntRoutine) :boolean ;Stdcall; external 'CH375DLL.DLL'; //設(shè)定中斷服務(wù)程序 //iIndex指定CH375設(shè)備序號(hào) //iIntRoutine指定中斷服務(wù)程序,為NULL則取消中斷服務(wù),否則在中斷時(shí)調(diào)用該程序 //"TiIntRoutine"過程傳遞參數(shù)要用非默認(rèn)的'Register'方式傳遞. 2)中斷服務(wù)程序 procedure mInterruptEvent(mBuffer:pbytearray );stdcall;
hcn大哥:我PC端的測(cè)試源程序如下; unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,CH375DLL;
type TForm2 = class(TForm) Button1: TButton; Label1: TLabel; Memo1: TMemo; Button2: TButton; Label2: TLabel; Label3: TLabel; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;
const USB_BUF_LENGTH:cardinal=10; var Form2: TForm2; mopen:cardinal=0; usbdown: array[0..9]of byte; usbup: array[0..9] of byte; wbufferlenth:cardinal; rdbufferlenth:cardinal; //pusbup,pusbdwn:pcardinal;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject); begin wbufferlenth:=10; if mopen<>0 then CH375WriteData(0,@usbdown,@wbufferlenth); //寫出數(shù)據(jù)塊; label2.Caption :=inttostr(wbufferlenth); end;
procedure TForm2.Button2Click(Sender: TObject); begin rdbufferlenth:=10; if mopen<>0 then CH375ReadData(0,@usbup,@rdbufferlenth); label3.Caption :=inttostr(rdbufferlenth); end;
procedure TForm2.FormCreate(Sender: TObject); var i:byte; begin for I := 0 to USB_BUF_LENGTH - 1 do usbdown[i]:=65+i;
mopen:=ch375opendevice(0); if mopen<>0 then begin label1.Caption:='成功打開USB設(shè)備'; CH375SetBufUpload(0,1); end else label1.Caption :='無法打開USB設(shè)備'; end;
end.
51測(cè)試程序如下:
#include #include #include #include
#define uchar unsigned char; uchar U2C_buffer[10];
/**************************************************************************** 5th * CH375中斷服務(wù)程序,使用寄存器組1 * *****************************************************************************/
void Ch375Interrupt( ) interrupt 0 { unsigned char InterruptStatus; unsigned char i, length; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請(qǐng)求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 獲取中斷狀態(tài) */ switch ( InterruptStatus ) { /* 分析中斷狀態(tài)處理 */ case USB_INT_EP2_OUT: { /* 批量端點(diǎn)下傳成功 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ length = CH375_RD_DAT_PORT( ); /* 首先讀取后續(xù)數(shù)據(jù)長(zhǎng)度 */ for ( i = 0; i < length; i ++ ) U2C_buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收數(shù)據(jù)包 */ /* 測(cè)試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機(jī) */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端點(diǎn)2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ CH375_WR_DAT_PORT( length ); /* 首先寫入后續(xù)數(shù)據(jù)長(zhǎng)度,回傳剛接收到的數(shù)據(jù)長(zhǎng)度 */ for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( U2C_buffer[ i ] ); /* 數(shù)據(jù)取反后返回,由計(jì)算機(jī)應(yīng)用程序測(cè)試數(shù)據(jù)是否正確 */ //u2c=1; break; } case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */ break; } }
}
void main() { CH375_Init( ); while(1); }
你測(cè)試的時(shí)候,你可以先用我們的CH372DEBUG測(cè)試你的下位機(jī)程序,如果成功的話,那在用你的下位機(jī)程序測(cè)試你的上位機(jī)程序,這樣在調(diào)試的過程中你才可以知道是哪里出了問題
默認(rèn)工作于直接上傳模式, 需要應(yīng)用程序調(diào)用CH375SetBufUpload啟用緩沖上傳模式,(關(guān)CH375DLL的函數(shù)說明以CH375DLL.c文件里為主.其它的聲明文件都是由C語言翻譯而來的.) BOOL WINAPI CH375SetBufUpload( // 設(shè)定內(nèi)部緩沖上傳模式 ULONG iIndex, // 指定CH375設(shè)備序號(hào),0對(duì)應(yīng)第一個(gè)設(shè)備 ULONG iEnableOrClear ); // 為0則禁止內(nèi)部緩沖上傳模式,使用直接上傳,非0則啟用內(nèi)部緩沖上傳模式并清除緩沖區(qū)中的已有數(shù)據(jù) 關(guān)于緩沖上下傳例程,你可以看CH372evt.zip\pub\bulk\speed372.c,里面有測(cè)試緩沖上下傳的速度. 關(guān)于響應(yīng)插拔通知的操作過程在中斷服務(wù)程序里通過postmessage()轉(zhuǎn)移到別的過程里操作的.由于在中斷優(yōu)先級(jí)高不宜對(duì)內(nèi)存一些公用資源操作.關(guān)于插拔通知使用的Delphi例子,你可以下載ch341evt.zip\delphi里的程序,CH372和CH341的插拔通知用法都是一樣的,你可以參考. 還有你前面的程序,你可以在你程序里,下傳數(shù)據(jù)的函數(shù)處設(shè)一個(gè)斷點(diǎn),看一下你下傳的數(shù)據(jù)是什么,然后再在你讀上傳數(shù)據(jù)函數(shù)處設(shè)一個(gè)斷點(diǎn),看一下你讀到的原始數(shù)據(jù)是什么?
多謝hcn,Ls! 不過好像在ch372evt.zip中并沒有speed372.c。
樂天: 你好,請(qǐng)問CH375作設(shè)備,連接到USB端的排列順序具體是+5,D-,D+,GND,對(duì)嗎? 請(qǐng)問你的問題如何解決的?