我 用的是STC89C58RD+ CH375 ,我在主函数里边调用CH375LibInit() 和xQueryInterrupt( ) 的时候,我用单步运行,怎么总也 调用不了这两个函数 ,这两个函数都是在 CH375HF6.H 这个文件中的 ?请问如何解决 ?谢谢
这两个函数在头文件中都可以看到,你所说的“总也调用不了这两个函数”是直接不用运行还是运行返回出错(比如CH375LibInit() 返回0X81)?如果前者,你检查一下有没有将我们的库CH375HF6.LIB以添加.C的形式添加到工程中去;如果后者,先仔细检查硬件连接,再查我们的375是否正常工作了,如晶振有没起振,复位是否完全。
我的晶体 没波形输出啊,晕 ,可我是照着 你们给的CH375DS1.pdf 中 的图做的啊 ,晶体 怎么不振呢? 我 的CH375 的25,26角正常 ,可 晶体就是不振,这是什么问题啊? 谁帮帮我,谢谢
(1) 电容是否匹配 (2)晶振是否漏电,若用了助焊剂,先清洗烘干 (3)表笔有没有选择*10档
1.电容 绝对匹配,是 15P的 2.晶振不漏电 ,没有使用助焊剂 3.表笔使用的是*10档 晶体就是不起振? 弄了一上午了,也没起振,CH375 的25角低,26角高,这正常,我一共 焊了2个板子 ,结果都不行 ,晕死了, 麻烦各位 再帮我 看看 ,谢谢
如果CH375 的25脚为低,26脚为高,说明375已经正常工作了!!!
可 375的晶振为什么没有波形输出呢 ? 而且给375 发测试命令CMD_CHECK_EXIST,比如说发0x55, 返回的还是 0x55 ,这不就说明 375 没正常工作吗?
可 375的晶振为什么没有波形输出呢 ? 而且给375 发测试命令CMD_CHECK_EXIST,比如说发0x55, 返回的还是 0x55 ,这不就说明 375 没正常工作吗?
根据你说的情况来看,给以下几点参考意见: (1)375的25脚为低,26脚为高,说明375已经正常复位了.这时候可以肯定的说晶振已经起振了.至于你说测不到波形,有可能是显波器没有调好,你可以再确认一下!! (2)至于你发测试命令CMD_CHECK_EXIST没有通过,有可能是时续的问题,数据没有发下去,你把测试的程序发一下看看!!
使用总线方式还是模拟I/O口方式?三个读写子函数的时序要正确,还有你可以循环的写数据,写命令,读数据,用示波器测下数据线,RD,WR,CS信号可是正常的,看数据和命令可送到CH375的引脚上了.
使用总线方式,三个读写函数如下: /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ void CH375_WR_CMD_PORT( unsigned char cmd ) { CH375_CMD_DAT = 1; /* 命令 */ CH375_DATA_PORT = cmd; for ( cmd = 2; cmd != 0; cmd -- ); /* 发出命令码前后应该各延时2uS,对于MCS51可以不需要延时 */ }
/* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ void CH375_WR_DAT_PORT( unsigned char dat ) { CH375_CMD_DAT = 0; /* 数据 */ CH375_DATA_PORT = dat; }
/* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ unsigned char CH375_RD_DAT_PORT(void) { unsigned char rev_data ; CH375_CMD_DAT = 0; /* 数据 */ rev_data = CH375_DATA_PORT; return( rev_data ); }
/* CH375初始化子程序 */ unsigned char CH375_Init( ) { unsigned char i,sta1,test=0; CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 测试工作状态 */ CH375_WR_DAT_PORT( 0x55 ); /* 测试数据 */ test = CH375_RD_DAT_PORT( ); /* 返回数据应该是测试数据取反 */ if ( test != 0xaa ) { /* CH375出错 */ for ( i = 100; i != 0; i -- ) { /* 强制数据同步 */ CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* CH375执行硬件复位 */ test = CH375_RD_DAT_PORT( ); /* 延时 */ if(test == 0xaa) break; } } if(i==0) /* if ( i==0 ) { CH372/CH375存在硬件错误 }; */ { printf("test fail !"); return 0; } else { /* 设置USB工作模式, 必要操作 */ CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 6 ); /* 设置为使用内置固件的USB设备方式 */ //mDelaymS(100); for ( i=5; i!=0; i-- ) { CH375_WR_CMD_PORT(CMD_TEST_CONNECT); sta1=CH375_RD_DAT_PORT(); mDelaymS(20); return sta1; } } }
我的主函数如下: main( ) { unsigned char i,c ; P0 = 0x00; CH375_Init( ); /* 初始化CH375 */ i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ ....... } 目前状态:375 的 25角 低,26角高
目前存在的问题: 1. 在函数运行到CH375_Init( )的 时候,单片机给375发的测试数据 (0x55),375 返回不正确?如何解决? 2. 如果把CH375_Init( )屏掉 ,单片机运行到CH375LibInit( ) 函数时无法调用 ? 我用的是CH375HF6.H 这 个头文件 谢谢 各位工程师的帮助 ,我的QQ:176891496 ,如果需要 ,我可以把原理图和 程序发给你们,谢谢
你单片机与我们芯片是怎么连接的,采用的是总线方式(按我们芯片手册上给出的连接),还是模拟并口方式。如果采用总线方式的话,得按你的接线改写命令口地址和数据口地址。按你上面所说的,调用不起来的话,应该没有将我们的库添加进去,你可以参考CH375LIB.ZIP里面的程序。
如果采用模拟并口的话,你得采用CH375LIB.ZIP下的FILELIBC库,这个库的三个读写子程序提供出来,可以按客户接线进行修改的。
如果采用总线方式的话,我们采用了数据端口(CH375_DAT_PORT)、命令端口(CH375_CMD_PORT)两个IO地址。 仔细看一下我们的例子程序,发命令时是将命令码发到命令端口。你那么改肯定不行。
以下程序你参考一下:
unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375数据端口的I/O地址 */
/* 延时2微秒,不精确 */ void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); }
/* 延时1微秒,不精确 */ void delay1us( ) { unsigned char i; for ( i = 1; i != 0; i -- ); } /* 与CH372/CH375有关的基本I/O操作 */
void CH375_WR_CMD_PORT( UINT8 cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ Delay2us(); CH375_CMD_PORT=cmd; Delay2us(); }
void CH375_WR_DAT_PORT( UINT8 dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ CH375_DAT_PORT=dat; Delay1us(); /* 如果是MCS51单片机,因其较慢,所以实际上无需延时 */ }
UINT8 CH375_RD_DAT_PORT( void ) { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ Delay1us(); /* 如果是MCS51单片机,因其较慢,所以实际上无需延时 */ return( CH375_DAT_PORT ); }
问题解决,原因是 PCB上少画了根线,再次感谢南京沁恒的工程师门的热心帮助