[求助]用372实现PC与单片机通信为何一直发现不了USB设备??

请问做过PC机和单片机之间用372实现USB通信的兄弟,我的程序是按照别人写的例程来写的,基本没改过,芯片引脚是P2.0接A0,P2.6接CS#,int0接INT#,P3.6接WR#,P3.7接RD#,D0-D7直接接的P0.1—P0.7,但是却总发现不了USB设备,郁闷的很,是不是硬件电路有问题?我以前没怎么做过电路,基础不是很好,这到底是怎么回事啊,保托各位知道的帮个忙,尽量说的详细点。以下是程序:

#include #include #include #include "CH375INC.H" #define uchar unsigned char

uchar volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 CS接P2.1,A0接P2.0,D0-D7连P0-P7*/ uchar volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375数据端口的I/O地址 */

/* 延时根据具体情况调节 */ void delay3us( ) { unsigned char i; for ( i = 3; i != 0; i -- ); /* 根据单片机的时钟选择初值 */ }

/* 与CH375有关的基本I/O操作 */

void CH375_WR_CMD_PORT(uchar cmd) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ delay3us( ); CH375_CMD_PORT=cmd; delay3us( ); }

void CH375_WR_DAT_PORT(uchar dat) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ CH375_DAT_PORT=dat; //Delay(1); /* 如果是MCS51单片机,因其较慢,所以实际上无需延时 */ }

uchar CH375_RD_DAT_PORT( void ) { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ //Delay(1); /* 如果是MCS51单片机,因其较慢,所以实际上无需延时 */ return(CH375_DAT_PORT); }

/* 延时50毫秒,不精确 */ void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); }

/* CH375初始化子程序 */ void CH375_Init( ) { uchar i; /* 测试CH375是否正常工作,可选操作,通常不需要 */ CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 测试CH375是否正常工作 */ CH375_WR_DAT_PORT( 0x55 ); /* 写入测试数据 */ i = ~ 0x55; /* 返回数据应该是测试数据取反 */ if ( CH375_RD_DAT_PORT( ) != i ) { /* CH375不正常 */ for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重复发命令,执行硬件复位 */ CH375_RD_DAT_PORT( ); } CH375_WR_CMD_PORT(0);

Delay50ms( ); /* 延时50ms */ }

/* 设置USB工作模式, 必要操作 */ CH375_WR_CMD_PORT(CMD_SET_USB_MODE); CH375_WR_DAT_PORT(2); /* 设置为使用内置固件的USB设备方式 */ for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; } /* if ( i==0 ) { CH375存在硬件错误 }; */ /* 下述启用中断,假定CH375连接在INT0 */ IT0 = 0; /* 置外部信号为低电平触发 */ IE0 = 0; /* 清中断标志 */ EX0 = 1; /* 允许CH375中断 */ }

/* CH375中断服务程序,使用寄存器组1 */ void mCh375Interrupt( ) interrupt 0 using 1 { uchar InterruptStatus; uchar i, length; uchar data buffer[ 64 ];

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 ++ ) 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( ~ buffer[ i ] ); /* 数据取反后返回,由计算机应用程序测试数据是否正确 */ 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; } } }

/*主程序*/ main( ) { Delay50ms( ); /* 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 */ CH375_Init( ); /* 初始化CH375 */ EA = 1; /* 允许中断 */ while ( 1 ); /* 以下指令开始工作循环,等待PC机命令进行操作 */ }

首先,你得看看你的375是不是复位完全正常工作了;其次,你在初始化CH375的时候,发了测试命令也就是CMD_CHECK_EXIST返回的数据是0X55的取反0XAA吗?如果不是的话,说明你的硬件连线上还有问题.设置模式2成功了吗? 还有就是你用来和PC机先连的线应该是带屏蔽的USB线.


谢谢,但是我不知道怎么确认375是否复位完全正常工作了;其次,我根本连usb设备都找不到啊,怎么测试呢?按照说明说,硬件连线应该没问题的。怎样确认设置的模式是否成功? 另外,用来和PC机相连的线是带屏蔽的USB线.电脑城买的新线,插上去以后连点反应都没有,绝望了。。。


你用示波器打到乘10档看晶振的波形,也就是看晶振有没有起振正常工作.测试命令的话是用来测试你的单片机和372的硬件连线是不是正常,和你的PC机无关,也就是CMD_CHECK_EXIST 这个命令,看返回的数据是0X55的取反0XAA吗?模式是否设置成功的话,看发了命令: CH375_WR_CMD_PORT(CMD_SET_USB_MODE); CH375_WR_DAT_PORT(2); 看读回来的状态是不是CMD_RET_SUCCESS.如果你前面的 测试命令过了的话,也可以不用读取\查看这个状态.


确认复位好不好以及晶振有没有起振,只需要看下375的35脚和26脚的电压就可以了,要是复位好以及晶振起振的话,那么25脚为低电平,26脚为高电平.


谢谢各位了,现在能找到设备了,但是却出现提示“未识别的USB设备”,总是无法识别,装了驱动也没有用啊 请各位知道的再给点建议,谢谢了!!!


未识别的设备实际上还是你的模式没有设置成功,你先按照上面说的如果复位和晶振起振的话,那就做检测命令,如果过了的话,那么设置好模式之后就应该可以找到新的硬件并且会提示你装驱动,如果这个时候不成功的话,仔细检查你的USB连接线是否为屏蔽线,还有就是375的晶振是否为12M以及UD+和UD-有没有接反?


我用的是372,这个好像是内部有上电复位的吧,晶振和连线都没有问题,请问是不是我的程序有问题啊?现在仍然是无法识别设备


那你的测试程序可以通过吗?不通过的话就没办法识别到新硬件,即使识别到的话也是无法识别的新硬件


啊,还要测试啊,--我没测试哦,不好意思啊,我不知道怎么测试-。能不能在程序里面把测试省略掉?请问程序的其他部分有没有问题?


hehe不要着急,慢慢来啊,我一开始也遇到很多问题,最后也慢慢解决了 现在,我这边使用的是mega128单片机+ch375,已经搞定了master和slave 今天刚刚写完slave的上位机软件,呵呵,我现在在家也没有程序,明天再看看啦, 如果你还是没搞定,就联系我吧,


谢谢啦,还没搞定啊,不过我会坚持下去的。我用的s52单片机+372,现在只是在做借口部分的实验,其他数据采集部分早已经做好了,因导师要我扩展接口,并且要用USb,等接口实验做好了,在考虑怎么加上去。如果你方便的话,请你帮我看看程序,硬件电路的连接,我都在上面给出了,另外我的邮箱是个人信息保护,已隐藏,有什么好的程序能共享的就给我发一点吧,不胜感激!!


测试程序你可以下载CH372EVT。ZIP,里面有例子程序提供的


可是我按照例子程序来的却怎么也没有反应,结果还是一样无法识别,谢谢各位的帮助,我再重新做一遍试试吧,坚持就是胜利!


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