请问,外围固件的例子是哪一个呢?我还没换CH372A来,但是我外接的单片机是能工作正常的,是不是直接把那固件例子直接烧进单片机然后PC就会发现新硬件的呢?
用CH372EVT。ZIP下面的XFIRM文件夹下面的例子,就是外置古件的例子,你可以参考
还是出现无法识别USB设备这情况,请问是不是CH372A坏掉呢
我的CH372与单片机连接是这样的,CS#--P2.7,A0--P2.0,WR#--WR,RD#--RD, 对于这两个地址也应该是对的吧 unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375数据端口的I/O地址 */? 但是,现在还是发现不了硬件,不明白是什么原因
是啊,还是老样子,PC那边显示显示"无法识别的USB设备"
好象你的地址有问题吧,你的CS#线接了P2.7,那么地址的最高位就应该是0才能选中375了,你改为: unsigned char volatile xdata CH375_CMD_PORT _at_ 0x7DF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0x7CF0; /* CH375数据端口的I/O地址 */ 试一下
谢谢楼上的,不过改为
刚才还没发完,改为 unsigned char volatile xdata CH375_CMD_PORT _at_ 0x7DF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0x7CF0; /* CH375数据端口的I/O地址 */ 这样还是不行,请各位帮一下!
太好啦,现在可以发现新硬件了,然后我接着安装了CH372A的驱动程序,我在电脑的硬件驱动那里可以看到CH372/CH375的驱动程序和显示硬件,请问是不是装了驱程就可以正常使用了,还有每次插拔USB线时不会像平常这些USB那样在电脑的右下方显示一个图标,不知这正不正常呢?现在做到这里了,下一步怎么通过上位机来调试下位机呢??请各位指点一下
能不能说一下,造成一直是“无法识别的设备”是什么原因啊? 在电脑右下脚,并不回象插上U盘那样有图标显示的,不过你可以在电脑的设备管理器里的外部接口出现USB CH372/CH375。 至于上位机调试下位的话,你可以下载CH375DBG.ZIP这个文件,里面提供上位机调试软件和下位机的程序。
谢谢luoye268268 ,其实是我的硬件连接与网上给出的程序接口不对,我用的是中断1,网上的是中断0,我把它改回来就行了,现在想试调下位机,不知上位机的那个调试工具怎么用呢?还有下位机要怎么调试就比较好呢??
哪位高人指点怎么调试下位机好不好,用哪一个上位机软件调的呢?谢谢!!
你可以下载CH375DBG.ZIP这个文件,将CH375DBG\DOWNFILE\MCU\DOWNLOAD.HEX文件烧到单片机中,上位机用CH375DBG\DOWNFILE\WINDOWS中的工具即可.这就相当于将一个文件通过工具从USB口下传到单片机中,能下传成功的话,简单的通信应该就没有问题了.如果你将单片机的串口接出来的话,还可以将接收到的数据从串口打印出来,以便查看.
下位机的硬件基本上没有什么问题了,至于上位机的程序可以参考哪里编写呢?哪位高手来指一下吧!
/* 计算机应用程序将某个文件的数据通过USB下传到单片机的RAM中,本程序中单片机再将数据从串口输出,相当于USB转串口,供参考 */ /* ; CH375/CH372 Bulk Data Download ; U2(AT89C51) Program ; 本程序测试收大数据块 ; 本程序适用于时钟频率不高于24MHz的标准MCS-51单片机 ; ; Website: http://winchiphead.com ; Email: 个人信息保护,已隐藏 ; Author: W.ch 2003.09 */
/* MCS-51单片机C语言的示例程序 */
#include #include "CH375INC.H"
unsigned char volatile xdata CH375_CMD_PORT _at_ 0x7DF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0x7CF0; /* CH375数据端口的I/O地址 */
unsigned char xdata data_buffer[0x8000] _at_ 0x0000; unsigned char xdata *p_xram; unsigned char xdata *p_ser; unsigned char len;
/* 延时2微秒,不精确 */ void Delay2us( ) { unsigned char i; #define DELAY_START_VALUE 1 /* 根据单片机的时钟选择初值,20MHz以下为0,30MHz以上为2 */ for ( i=DELAY_START_VALUE; i!=0; i-- ); }
/* 延时50毫秒,不精确 */ void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); }
/* CH375初始化子程序 */ void CH375_Init( ) { unsigned char i; /* 设置USB工作模式, 必要操作 */ CH375_CMD_PORT = CMD_SET_USB_MODE; Delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ CH375_DAT_PORT = 2; /* 设置为使用内置固件的USB设备方式 */ for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_DAT_PORT==CMD_RET_SUCCESS ) break; } /* if ( i==0 ) { CH372/CH375存在硬件错误 }; */ /* 下述启用中断,假定CH375连接在INT0 */ IT0 = 0; /* 置外部信号为低电平触发 */ IE0 = 0; /* 清中断标志 */ EX0 = 1; /* 允许CH375中断 */ }
/* CH375中断服务程序,使用寄存器组1 */ void mCh375Interrupt( ) interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char length; CH375_CMD_PORT = CMD_GET_STATUS; /* 获取中断状态并取消中断请求 */ Delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ InterruptStatus = CH375_DAT_PORT; /* 获取中断状态 */ if ( InterruptStatus == USB_INT_EP2_OUT ) { /* 批量端点下传成功 */ CH375_CMD_PORT = CMD_RD_USB_DATA; /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ Delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ length = CH375_DAT_PORT; /* 首先读取后续数据长度 */ len=length; if ( length == 0 ) /* 如果长度为0说明计算机将要开始下传一个新的文件 */ { p_xram=data_buffer; /* 将指针初始化以便接收 */ p_ser=data_buffer; } else /* 长度不为0则说明是下传文件数据,接收到缓冲区中,再由主程序处理串口发送 */ { do { *p_xram = CH375_DAT_PORT; p_xram++; } while ( --length); if ( p_xram >= 0x7f80 ) p_xram=data_buffer; /* 防止XRAM溢出,这是简单处理,实际产品应该处理严密些 */ }
} else CH375_CMD_PORT = CMD_UNLOCK_USB; /* 释放当前USB缓冲区 */ }
main( ) { unsigned char n; P1=0x00; Delay50ms( ); /* 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 */ CH375_Init( ); /* 初始化CH375 */ // Init serial baudrate // PCON = 0x80; // SCON = 0x50; /* 8位串行数据 */ // TL2 = RCAP2L = 0xf6;//0 - RetLen; /* 18.432MHz, 57600bps */ // TH2 = RCAP2H = 0xFF; // T2CON = 0x34; /* 定时器2用于串口的波特率发生器 */ // TI = 0; RI = 0; /* 清除中断标志 */ // ? EA = 1; /* 允许中断 */ p_xram=data_buffer; p_ser=data_buffer; while ( 1 ) { /* 以下指令开始工作循环,等待PC机命令进行操作 */ if(len>0) //if(p_ser { //P1=*p_ser; P1=*p_xram; for(n=0;n<10;n++) { Delay50ms(); } // SBUF=*p_ser; // while(!TI); // TI=0; p_xram--; len--; //p_ser++; } } } 单片机的程序是上面这个,为什么我用网上的那上位机程序向下发送几个字节数据时只能收到最后一个呢,(P1口只看到最后一个数据),请问是这程序哪里出问题了呢?