求教:为什么将CH375电路插入PC的USB口,未出现反应?

鄙人使用CH375A 作为USB设备接口.按CH375A应用手册上并口方式连接电路.插入PC USB口后 却未见反应.不知怎么回事.是否芯片已经烧坏?(之前C5因为未买到100U的贴片电容,使用10U替代;结果C5爆裂,提示 '无法识别USB设备') 望诸位大侠施以援手,小弟不胜感激.^v^[Emot]13[/Emot]

你先检查下你的硬件连接有没有问题,用CHECK—EXIST命令,看输出的数据是不是你输入数据的去反,还有就是你的晶振起振了没有?


谢谢回复!希望WCH或大虾能对CH375的计算机应用层编程有一个更详细的指导:

.问题已经解决. 现在已经开始与PC通讯调试。但在使用CH375DLL时,却发现函数说明不正确。采用单向数据传输方式,使用设置内部缓冲上传时却无法使用。 Function CH375SetBufUpload( iIndex:cardinal; // 指定CH375设备序号,0对应第一个设备 iEnableOrClear:cardinal):longbool;Stdcall;external 'CH375DLL.DLL';不知道该怎么使用。 能提供一个简单的例程吗?

还有demon中“采用伪中断上传”里面涉及的主要技术没搞懂 ,希望WCH或大虾能对CH375的计算机应用层编程有一个更详细的指导: 1 设备插拔监视与处理 设置设备插拔监视程序: CH375SetDeviceNotify(); 设备插拔事件通知程序NotifyRoutine(iEventStatus:cardinal ) 设备插拔事件处理pnpproceKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState)中根据插拔事件通知信息所提供的iEventStatues做相应处理; 2.伪中断上传 1)设定中断服务程序 Function CH375SetIntRoutine (iIndex:cardinal;iIntRoutine :TiIntRoutine) :boolean ;Stdcall; external 'CH375DLL.DLL'; //设定中断服务程序 //iIndex指定CH375设备序号 //iIntRoutine指定中断服务程序,为NULL则取消中断服务,否则在中断时调用该程序 //"TiIntRoutine"过程传递参数要用非默认的'Register'方式传递. 2)中断服务程序 procedure mInterruptEvent(mBuffer:pbytearray );stdcall;


hcn大哥:我PC端的测试源程序如下; 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); //写出数据块; 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设备'; CH375SetBufUpload(0,1); end else label1.Caption :='无法打开USB设备'; end;

end.


51测试程序如下:

#include #include #include #include

#define uchar unsigned char; uchar U2C_buffer[10];

/**************************************************************************** 5th * CH375中断服务程序,使用寄存器组1 * *****************************************************************************/

void Ch375Interrupt( ) interrupt 0 { unsigned char InterruptStatus; unsigned char i, length; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 获取中断状态 */ switch ( InterruptStatus ) { /* 分析中断状态处理 */ case USB_INT_EP2_OUT: { /* 批量端点下传成功 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ length = CH375_RD_DAT_PORT( ); /* 首先读取后续数据长度 */ for ( i = 0; i < length; i ++ ) U2C_buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收数据包 */ /* 测试数据正确性,将接收到的命令包数据取反后返回给PC机 */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ CH375_WR_DAT_PORT( length ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */ for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( U2C_buffer[ i ] ); /* 数据取反后返回,由计算机应用程序测试数据是否正确 */ //u2c=1; break; } case USB_INT_EP2_IN: { /* 批量数据发送成功 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } default: { /* 其它中断,未用到,解锁后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } }

}

void main() { CH375_Init( ); while(1); }


你测试的时候,你可以先用我们的CH372DEBUG测试你的下位机程序,如果成功的话,那在用你的下位机程序测试你的上位机程序,这样在调试的过程中你才可以知道是哪里出了问题


默认工作于直接上传模式, 需要应用程序调用CH375SetBufUpload启用缓冲上传模式,(关CH375DLL的函数说明以CH375DLL.c文件里为主.其它的声明文件都是由C语言翻译而来的.) BOOL WINAPI CH375SetBufUpload( // 设定内部缓冲上传模式 ULONG iIndex, // 指定CH375设备序号,0对应第一个设备 ULONG iEnableOrClear ); // 为0则禁止内部缓冲上传模式,使用直接上传,非0则启用内部缓冲上传模式并清除缓冲区中的已有数据 关于缓冲上下传例程,你可以看CH372evt.zip\pub\bulk\speed372.c,里面有测试缓冲上下传的速度. 关于响应插拔通知的操作过程在中断服务程序里通过postmessage()转移到别的过程里操作的.由于在中断优先级高不宜对内存一些公用资源操作.关于插拔通知使用的Delphi例子,你可以下载ch341evt.zip\delphi里的程序,CH372和CH341的插拔通知用法都是一样的,你可以参考. 还有你前面的程序,你可以在你程序里,下传数据的函数处设一个断点,看一下你下传的数据是什么,然后再在你读上传数据函数处设一个断点,看一下你读到的原始数据是什么?


多谢hcn,Ls! 不过好像在ch372evt.zip中并没有speed372.c。


乐天: 你好,请问CH375作设备,连接到USB端的排列顺序具体是+5,D-,D+,GND,对吗? 请问你的问题如何解决的?


只有登录才能回复,可以选择微信账号登录