求助:单片机通过CH375B与PC机通信的问题

20105321272164.jpg

20105321281265.jpg

如上图是我自己做的一个CH375B电路,但是在做好板子之后,375的晶振可以起振,测量XI、XO两管脚电压在2.5V左右。灯D11不亮。CH375二管脚也就是复位管脚电压为0。设置模式2后,PC机识别不了375,PC机上装有驱动,但没有任何显示。且UD+、UD-电压为负0.0几伏。当进行取反测试时,单片机通过串口读回的数据为0x0FFH。 程序如下:

#include #include #define CH375_D0_D7 P0 sbit CH375_CS=P2^2; sbit CH375_WR = P3^6; sbit CH375_RD = P3^7; sbit CH375_A0 = P2^0; #define CMD_CHECK_EXIST 0x06 #define CMD_RESET_ALL 0x05 #define CMD_SET_USB_MODE 0x15 #define CMD_RET_SUCCESS 0x51 unsigned char a,b,i,dat; /***********************************************************************************************/ /* 延时50毫秒,不精确 */ void Delay50ms( ) { unsigned char k, j; for ( k=200; k!=0; k-- ) for ( j=250; j!=0; j-- ); }

/* 延时2微秒,不精确 */ void delay2us( ) { unsigned char j; for ( j = 2; j != 0; j -- ); /* 根据单片机的时钟选择初值 */ } /******************************************************************************************/

void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ delay2us(); /* 用普通I/O引脚模拟8位并口的时序,CH375_CS引脚是可选的,可以一直接GND强制片选 */ CH375_D0_D7 = cmd; CH375_A0 = 1; //选择CH375的命令口 CH375_RD = 1; //如果I/O默认电平是高电平,那么这是可选操作 CH375_CS = 0; CH375_WR = 0; CH375_WR = 1; CH375_CS = 1; CH375_A0 = 0; CH375_D0_D7 = 0xFF; //对于准双向I/O,请在此设置输出全高电平 delay2us(); }

void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ /* 用普通I/O引脚模拟8位并口的时序 */ CH375_D0_D7 = dat; CH375_CS = 0; CH375_WR = 0; CH375_WR = 1; CH375_CS = 1; CH375_D0_D7 = 0xFF; // 对于准双向I/O,请在此设置输出全高电平 }

unsigned char CH375_RD_DAT_PORT( void ) { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ /* 用普通I/O引脚模拟8位并口的时序 */ CH375_D0_D7 = 0xFF; //对于准双向I/O,请在此设置输出全高电平,便于输入 delay2us(); CH375_CS = 0; CH375_RD = 0; delay2us(); dat = CH375_D0_D7; CH375_RD=1; CH375_CS=1; CH375_D0_D7 = 0xFF; //对于准双向I/O,请在此设置输出全高电平 return( dat ); } void CH375_Init( ) { /* 设置USB工作模式, 必要操作 */ CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); delay2us(); CH375_WR_DAT_PORT( 2 ); /* 设置为使用内置固件的USB设备方式 */ for ( a=100; a!=0; a-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; } if ( a==0 ) //{ CH372/CH375存在硬件错误 }; */ SBUF=0X00; else SBUF=0X01; /* 下述启用中断,假定CH375连接在INT0 */ IT0 = 0; /* 置外部信号为低电平触发 */ IE0 = 0; /* 清中断标志 */ EX0 = 1; /* 允许CH375中断 */ Delay50ms( ); /* 延时50ms */ }

/***********************************************************************************************/ void main (void) { TMOD = 0x20; //在11.0592M下,设置波特率9600,方式1 TL1 = 0xfd; TH1 = 0xfd; SCON = 0Xd8; PCON = 0X00; TR1 = 1; while(1) { CH375_Init( ); while(TI == 0); TI = 0; } }

希望各位指正一下错误。谢谢大家。

不会贴图啊,不好意思。


程序上面加个上电延时,CH375上电复位时间需要50ms左右,D+,D-接反了


非常感谢你的帮助。那个UD+、UD-在实际中的PCB板中没接反,只是在原理图中的错误。我在main主程序中CH375_Init( )前加了Delay50ms();但还是不行,设置模式2识别不了,且UD+UD-电压还是负的。希望大侠您再次指导。


那可以确定你的并口硬件连线有点问题,你可以拿示波器去看下你发送出来的数据是否正常,还有你需要看下芯片的25脚和26脚的电压是多少?正常的话芯片25脚电压为低,26脚电压为高。


25、26脚电压正常。25为低,26为高。示波器如何看并口数据?hcn指导下。谢谢。我并口就是按照电路图上接的,D0-D7接P0.0-P0.7口。


void main (void) { TMOD = 0x20; //在11.0592M下,设置波特率9600,方式1 TL1 = 0xfd; TH1 = 0xfd; SCON = 0Xd8; PCON = 0X00; TR1 = 1; while(1) {

CH375_Init( ); while(TI == 0); TI = 0; } }

为什么这样? 实验以下: void main (void) { Delay50MS( );//延时50毫秒,必要延时 CH375_Init( ); while(1); }


试过了 不行 还是老样子 返回数据也不对 另外我想问问大家 CH375的24脚接的小灯D11一直是灭的 大家做的板是这样的吗???另外接这个小灯是起什么作用的??


谢谢大家的帮忙。持续关注中。


CH375B操作USB键盘问题

前段时间向贵公司申请了两片CH375B,想用它做主机来和USB键盘通信,单片机用的是MSP430,程序是参考的论坛里提供的CH375B操作HID设备的例程,开始程序在执行设置CH375工作模式时中断返回正常,但在等待设备连接时中断返回的却是错误的,本来按照贵公司提供的头文件CH375INC.H如果连接正常,则应返回0x15,但我的返回时0x95,硬件应该没问题,因为我仔细检查过了,并且前面的模式设置时中断返回正常,请问这会是什么原因呢? 附上相关代码: #define CH375_INT_WIRE P1IN&0x80 //P1.7 连接CH375的INT#引脚,用于查询中断状态 /************************************* //函数名称:Wait_Interrupt //函数功能:主机端等待操作完成, 返回操作状态 //入口:无 //出口:Intout--状态返回 //备注: ***************************************/ INT8U Wait_Interrupt(void) { while( CH375_INT_WIRE ); //查询等待CH375操作完成中断(INT#低电平) Ch375_Wr_Cmd_Port( CMD_GET_STATUS ); // 产生操作完成中断, 获取中断状态 //return( Ch375_Rd_Dat_Port() ); Intout = Ch375_Rd_Dat_Port(); //此处仅仅为了测试,否者应打开被屏蔽的语句 return (Intout); }

/************************************* //函数名称:Ch375_Rd_Dat_Port //函数功能:从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 //入口:无 //出口:dout--读得的数据,一个字节 //备注: ***************************************/ INT8U Ch375_Rd_Dat_Port(void) { INT8U dout; CH375_A0_CLR; //A0=1时为写入命令 =0为写入数据 CH375_WR_SET; CH375_RD_CLR; //RD=0时表示读入操作 Delay_X_Us(2);// 因为MSP430单片机较快所以需延时 CH375_DATA_IN; dout= P2IN; Delay_X_Us(1); CH375_RD_SET;//RD=0时表示读入操作 Delay_X_Us(1); return(dout); }

/************************************* //函数名称:Ch375_Wr_Cmd_Port //函数功能:向CH375写命令,周期不小于4uS,如果单片机较快则延时 //入口:cmd--待写命令 //出口:无 //备注: ***************************************/ void Ch375_Wr_Cmd_Port( INT8U cmd ) { CH375_A0_SET;//A0=1时为写入命令 CH375_RD_SET;//RD=0时表示读入操作 CH375_DATA_OUT; P2OUT=cmd; CH375_WR_CLR; Delay_X_Us(2); CH375_WR_SET; Delay_X_Us(2); }

贵公司提供的头文件部分内容如下: /* 以下状态代码1XH用于USB主机方式的操作状态代码, 仅CH375支持 */ #ifndef USB_INT_SUCCESS #define USB_INT_SUCCESS 0x14 /* USB事务或者传输操作成功 */ #define USB_INT_CONNECT 0x15 /* 检测到USB设备连接事件 */ #define USB_INT_DISCONNECT 0x16 /* 检测到USB设备断开事件 */ #define USB_INT_BUF_OVER 0x17 /* USB控制传输的数据太多, 缓冲区

溢出 */ #define USB_INT_USB_READY 0x18 /* USB设备已经被初始化(已分配

USB地址) */ #define USB_INT_DISK_READ 0x1D /* USB存储器读数据块, 请求数据读

出 */ #define USB_INT_DISK_WRITE 0x1E /* USB存储器写数据块, 请求数据写

入 */ #define USB_INT_DISK_ERR 0x1F /* USB存储器操作失败 */ #endif

这个头文件应该没问题吧,它对于键盘设备应该是一样的吧? 谁对这方面比较熟悉请帮我分析一下吧,先谢谢了!


对不起,上面的东西发错了,如果谁会也可以帮我分析分析,谢谢了!


51 单片机的P0口在做普通的IO口时需要外接上拉电阻


版主能不能解释下24脚接D11小灯的作用。


设备连接指示灯,我们的手册有说明的,请详细阅读


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