我用CH372和STC125A602S连接出现的问题。

为什么我插入USB之后没有反应?硬件查过是没有问题的,下面是按CH372的PDF的要求和我写的代码,附件里有STC12C5AS2的PDF,究竟是错在哪里了?不是在初始化时写入命令模式2就行了吗? 本地端的单片机软件 CH372芯片占用两个地址位,当A0 引脚为高电平时选择命令端口,可以写入命令;当A0引脚为 低电平时选择数据端口,可以读写数据。 单片机通过8 位并口对CH372 芯片进行读写,所有操作都是由一个命令码、若干个输入数据和若 干个输出数据组成,部分命令不需要输入数据,部分命令没有输出数据。命令操作步骤如下: ①、 在A0=1 时向命令端口写入命令代码; ②、 如果该命令具有输入数据,则在A0=0 时依次写入输入数据,每次一个字节; ③、 如果该命令具有输出数据,则在A0=0 时依次读取输出数据,每次一个字节; ④、 命令完成,可以暂停或者转到①继续执行下一个命令。 #include "STC_NEW_805.H" #include "CH375INC.H" #define uchar unsigned char #define uint unsigned int #define ulong unsigned long

sbit Ch372_Read=P3^7; sbit Ch372_Write=P3^6; sbit Ch372_CS=P4^4; sbit Ch372_A0=P4^0; sbit Ch372_En=P3^3; sbit Led=P4^1; sfr Ch372_Port=0x80; void sdelay(uchar DelayNum) { while(DelayNum--); } void ch372_writecmd(uchar Ch372Command) { uchar Command_Temp; Command_Temp=Ch372Command; Ch372_CS=0; Ch372_A0=1; Ch372_Port=Command_Temp; Ch372_Write=0; sdelay(5); Ch372_Write=1; } void ch372_writedata(uchar Ch372Data) { uchar Data_Temp; Data_Temp=Ch372Data; Ch372_CS=0; Ch372_A0=0; Ch372_Port=Data_Temp; Ch372_Write=0; sdelay(5); Ch372_Write=1; } /*void ch372_readdata() { uchar UsbData; Ch372_Port=0xff; Ch372_Read=0; sdelay(2); UsbData=Ch372_Port; sdelay(2); Ch372_Read=1; return (UsbData); } */ void ch372int() { EX0=1; ch372_writecmd(CMD_RESET_ALL) ; sdelay(1000); ch372_writecmd(CMD_SET_USB_MODE) ; sdelay(10); ch372_writedata(2); EX0=1; EA=1; } main() {

P4SW=0x70; Ch372_En=0; while(1) { ch372int(); Led=0; } }[Emot]1[/Emot]

1、接口程序有点问题:

void ch372_writecmd(uchar Ch372Command) { Ch372_Port=Ch372Command; Ch372_A0=1; Ch372_CS=0; Ch372_Write=0; _nop( )_; /* 保证60nS的写脉宽 */ Ch372_Write=1; Ch372_CS=1; Ch372_A0=1; sdelay(2); /* 保证延时1.5uS*/ }

void ch372_writedata(uchar Ch372Data) { Ch372_Port=Ch372Data; Ch372_A0=0; Ch372_CS=0; Ch372_Write=0; _nop( )_; /* 保证60nS的写脉宽 */ Ch372_Write=1; Ch372_CS=1;

sdelay(1); /* 保证延时0.6uS*/ }

uchar ch372_readdata( void ) { uchar dat; Ch372_Port=0xFF; /* 设为输入 */ Ch372_A0=0; Ch372_CS=0; Ch372_Read=0; _nop( )_; /* 保证60nS的写脉宽 */ dat = Ch372_Port; Ch372_Write=1; Ch372_CS=1; sdelay(1); /* 保证延时0.6uS*/ return ( dat ); } 2、操作CH372前需要延时100mS,等待其复位完成,然后参考手册做2次测试命令,测试数据分别为0x55,0xaa,验证接口程序和硬件连接是否正确。


谢谢啊,我试一下


#include "STC_NEW_805.H" #include "CH375INC.H" #include #define uchar unsigned char #define uint unsigned int #define ulong unsigned long

sbit Ch372_Read=P3^7; sbit Ch372_Write=P3^6; sbit Ch372_CS=P4^4; sbit Ch372_A0=P4^0; sbit Ch372_En=P3^3; sbit Led=P4^1; sfr Ch372_Port=0x80; void sdelay(uint DelayNum) { while(DelayNum--); } void ch372_writecmd(uchar Ch372Command) { Ch372_Port=Ch372Command; Ch372_A0=1; Ch372_CS=0; Ch372_Write=0; _nop_( ); /* 保证60nS的写脉宽 */ Ch372_Write=1; Ch372_CS=1; Ch372_A0=1; sdelay(2); /* 保证延时1.5uS*/ }

void ch372_writedata(uchar Ch372Data) { Ch372_Port=Ch372Data; Ch372_A0=0; Ch372_CS=0; Ch372_Write=0; _nop_( ); /* 保证60nS的写脉宽 */ Ch372_Write=1; Ch372_CS=1;

sdelay(1); /* 保证延时0.6uS*/ }

uchar ch372_readdata( void ) { uchar dat;

Ch372_Port=0xFF; /* 设为输入 */ Ch372_A0=0; Ch372_CS=0; Ch372_Read=0; _nop_( ); /* 保证60nS的写脉宽 */ dat = Ch372_Port; Ch372_Write=1; Ch372_CS=1; sdelay(1); /* 保证延时0.6uS*/ return ( dat ); }

void ch372int() { EX0=1; ch372_writecmd(CMD_RESET_ALL) ; sdelay(1000); ch372_writecmd(CMD_SET_USB_MODE) ; sdelay(10); ch372_writedata(2); EX0=1; EA=1; } bit ch372selftest() { uchar DataTest; ch372_writecmd(CMD_CHECK_EXIST); sdelay(2); ch372_writedata(0XAA); DataTest=ch372_readdata(); if(DataTest == 0X55) { return 1; } else { return 0; } }

main() {

P4SW=0x70; Ch372_En=0; EX0=1; ch372_writecmd(CMD_RESET_ALL) ; sdelay(1000); while(!ch372selftest()) ch372_writecmd(CMD_SET_USB_MODE) ; sdelay(10); ch372_writedata(2); EX0=1; EA=1;

} 改了一下还是一点反应都没有,插入USB后还是没有找到新硬件的提示。


1、接口程序中的2处延时,是否符合要求?有没有根据单片机的主频调整阿 2、sdelay(1000);究竟有多长? 3、ch372_writecmd(CMD_SET_USB_MODE) sdelay(10);这里不需要延时,接口程序不是已经加了么!!还有其他地方,自行去掉 ch372_writedata(2); 4、测试命令返回的数据数据是多少阿? 5、循环测试,写入无效的命令,用示波器查看CS,A0,WR,D7 -D0的信号是否正确 while( 1 ) { ch372_writecmd(0X55); ch372_writecmd(0Xaa); }


真的非常感谢楼上高手的指点。对我来说真的是雪中送碳,本人是对单片机接触不久,有很多东西都不太清楚,还请高手您多加帮忙指点。 1、接口程序中的2处延时,是否符合要求?有没有根据单片机的主频调整阿 单片机的晶振是12M的, void sdelay(uchar DelayNum) { while(DelayNum--); } 根据DelayNum取得的参数延时分别如下: DelayNum=1 ===> 3uS DelayNum=2 ===> 4.5uS DelayNum=5 ===> 7us DelayNum=10 ===> 11.5uS sdelay(2)为4.5us,足以保证延时1.5uS 2、sdelay(1000);究竟有多长?如果DelayNum=10*100=1150us=0.115ms需要再870的循环才到100ms. 3、ch372_writecmd(CMD_SET_USB_MODE) sdelay(10);这里不需要延时,接口程序不是已经加了么!!还有其他地方,自行去掉 ch372_writedata(2); 4、测试命令返回的数据数据是多少阿? 测试命令数据的返回,我不知道怎么,我是用led的亮灭来判断的,如果要看返回数据该怎么改动程序。 5、循环测试,写入无效的命令,用示波器查看CS,A0,WR,D7 -D0的信号是否正确 while( 1 ) { ch372_writecmd(0X55); ch372_writecmd(0Xaa); } CS,A0,WR,D7 -D0该有些怎样的变化呢?


延时函数肯定要根据单片机的主频自行调整 sdelay(1000);函数你可以反汇编算一下延时多上时间 返回的数据时送入数据的按位取反。如送入数据为0XAA,则返回的数据为0X55 正确的测试命令为: ch372_writecmd(0X06);//测试命令为0X06 ch372_writedata(0X55); ch372_readdata( );//读出的数据应该为0XAA 关于变化。CS,WR,RD是标准INTEL总线方式。 关于A0的变化可以参考CH375DS1的时序图。


/*----------------------------------------------- 程序名:CH 372与STC125A602S 调试程序 编写人:stanley 初写时间:2009年12月16日 单片机 CPU说明:MCS-51 单片机所用晶振:12M -----------------------------------------*/ #include "STC_NEW_805.H" // STC125A602S 的头文件 #include "CH375INC.H" #include #define uchar unsigned char #define uint unsigned int #define ulong unsigned long

sbit Ch372_Read=P3^7; sbit Ch372_Write=P3^6; sbit Ch372_CS=P4^4; sbit Ch372_A0=P4^0; sbit Ch372_En=P3^3; sbit Led=P4^1; sfr Ch372_Port=0x80; ///////////////////////////////////// /*函数描述:STC12系列单片机短延迟 /*写入参数:Delaynum,延迟时间:不详 /*返回参数:无 /*作者:Stanley /*日期:2009.11.13 /*描述: /* DelayNum=1 ===> 3uS DelayNum=2 ===> 4.5uS DelayNum=5 ===> 7us DelayNum=10 ===> 11.5uS *//////////////////////////////////// void sdelay(unsigned char DelayNum) { while(DelayNum--); } void ch372_writecmd(uchar Ch372Command) { Ch372_Port=Ch372Command; Ch372_A0=1; Ch372_CS=0; Ch372_Write=0; _nop_( ); /* 保证60nS的写脉宽 */ Ch372_Write=1; Ch372_CS=1; Ch372_A0=1; sdelay(2); /* 保证延时1.5uS*/ }

void ch372_writedata(uchar Ch372Data) { Ch372_Port=Ch372Data; Ch372_A0=0; Ch372_CS=0; Ch372_Write=0; _nop_( ); /* 保证60nS的写脉宽 */ Ch372_Write=1; Ch372_CS=1;

sdelay(1); /* 保证延时0.6uS*/ }

uchar ch372_readdata( void ) { uchar dat;

Ch372_Port=0xFF; /* 设为输入 */ Ch372_A0=0; Ch372_CS=0; Ch372_Read=0; _nop_( ); /* 保证60nS的写脉宽 */ dat = Ch372_Port; Ch372_Write=1; Ch372_CS=1; sdelay(1); /* 保证延时0.6uS*/ return ( dat ); }

/*void ch372int() { uint TEMP1; EX0=1; ch372_writecmd(CMD_RESET_ALL) ; for(TEMP1=0;TEMP1<870;TEMP1++) { sdelay(1000); } ch372_writecmd(CMD_SET_USB_MODE) ; ch372_writedata(2); EX0=1; EA=1; } */ bit ch372selftest() { uchar DataTest; ch372_writecmd(CMD_CHECK_EXIST); sdelay(2); ch372_writedata(0XAA); DataTest=ch372_readdata(); if(DataTest == 0X55) { return 1; } else { return 0; } }

main() { uint TEMP2; P4SW=0x70; Ch372_En=0; ch372_writecmd(CMD_RESET_ALL); for( TEMP2=0;TEMP2<880; TEMP2++) { sdelay(1000); } ch372_writecmd(0x06); ch372_writedata(0x55); ch372_readdata(); while(1) ; } 我用示波器测了一下P0口全为高电平


呵呵,可以找到新硬件了,谢谢啊


我上面的那个程序,测到的P0口为什么全为高电平


我上面的那个程序,测到的P0口为什么全为高电平


不要用万用表测试,可以用示波器测试看一下。


我是用示波器看的,都是高电平的平行波


1、你只做了1次测试命令,然后就停下来,全为高电平也是有可能的 2、能够发现新硬件,表示设置模式成功了,硬件连接和接口时序基本也正确了,可以进行后续数据传输实验了


没看到附件呢


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