1, 写入CMD_CHECK_EXIST命令, 2, 写入0x55数据, 3, 读数据为0x0,(为什么呢)
然后不停的发CMD_RESET_ALL,收到的数据为0xFF.
这是什么情况呢,为什么测试命令后的数据没有取反, 我担心是不是372坏了。
1, 写入CMD_CHECK_EXIST命令, 2, 写入0x55数据, 3, 读数据为0x0,(为什么呢)
然后不停的发CMD_RESET_ALL,收到的数据为0xFF.
这是什么情况呢,为什么测试命令后的数据没有取反, 我担心是不是372坏了。
不是的,有可能的话,你将你的数据口加上上拉试下看可以不可以,OXFF的话有可能是372的晶振没起振造成的
多谢指点。 今天早上换了个372片子,其它没动,现在情况是这样, 1, 写入CMD_CHECK_EXIST命令, 2, 写入0x55数据, 3, 读数据为0x1F(数据线没有问题) 然后不停的发CMD_RESET_ALL,收到的数据为0x1F.
这是什么问题,是晶振不准吗?(电路板上是12MHZ晶体+2个22PF的电容) 我用的5V电源,量得有2.2V的电压,用示波器测试是否起振时,会不会引起停振? 我用的是51仿真器,P0口与372数据线相连,是不是一定要接上拉呢?
p0口在复位之后是三态,所以在你程序一开始的时候你读下端口P0的数据,如果为0X00,则要加上拉,如果为0X方法,则不需要加上拉,如果晶振电压是2.2V的话,那说明你的晶振是起振了,你在不停的发数据,你看下你的时序上面有没有问题,或者说是不是哪个数据线或则别的线存在问题,你可以用示波器看下
还没搞定, 那个不论发什么都回0x1F的搞了几次之后,然后有几次变成了0x5F, 再几次,又变成换片子之前的状态了,就是, 写入CMD_CHECK_EXIST命令,写入0x55数据,读数据为0x0,发CMD_RESET_ALL,收到的数据为0xFF。 我现在加了上拉电阻,并且两个电容换成了12pf, 晶振有2.2V,应该是没问题的,程序用的是例子程序,时序也应该不会问题, 电路上就一个51仿真器和一个372, 为什么会这样呢,救救我吧。
那你用示波器看下你的数据有没有发出去,还有就是你在你的程序一开始的时候读取下P0口的数据是多少?或者你在循环的发数据,你看下你的数据端口有没有将数据发送出去?
P0口开始时数据为0xFF,没有问题。 数据肯定是发出去了的, 比如在发出命令或数据时,在WR信号变成0后,我用万用表一个个量了372引脚上的电压, 在读数据时,在RD信号变成0后,我也用万用表一个个量了372引脚上的电压,确是372输出有问题。 还有哪些可考虑的呢?
用万用表好象不行吧,应该用示波器看下你的时序上面有没有问题
我是用单步执行的,所以可以用万用表来测。 我现在发现规律如下: 1) 当起振正常时(我用示波器测了为12MHZ): 写入CMD_CHECK_EXIST命令,写入0x55数据,读数据为0x0; 发CMD_RESET_ALL,收到的数据为0xFF。 2) 在起振后又强制停振(如将振荡脚接地等),情况则是: 写入CMD_CHECK_EXIST命令,写入0x55数据,读数据为一个随机数,比如0x1F, 发CMD_RESET_ALL,收到的数据也为0x1F。 我想这个数是在372内部寄存器的,所以停振后读出来一直相同。 怎么办呢?
今天还是老样子,救救我呀。 刚才试了几个别的命令,情况如下: 1 发出ENTER_SLEEP命令,然后再发出GET_STATUS命令,返回的数据为0x06(从睡眠中被唤醒事件) 2 发出GET_IC_VER命令后,返回的数据为0xA3,(pdf文档上说对于CH372A芯片,返回值为0A2H), 我用的是CH372A,得到的却是0xA3,升级了吗,还是数据不对? 我觉得,这说明我现在用的CH372A芯片在工作,但有问题,是电路上的问题,还是程序上的, 我自己现在无法检查出来,请求支持!!!
你的ID获得是正确的,你用的是总线方式还是用模拟IO方式??
用模拟IO方式。 我觉得现在是写命令正确,读数据正确,就是数据没有写进去。 什么原因呢?
把你的 写命令 写数据 以及读数据 的函数贴出来看看..
/* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ void CH375_WR_CMD_PORT( unsigned char cmd ) { delay2us(); /// CH375_CMD_PORT=cmd; CH375_D0_D7 = cmd; CH375_A0 = 1; //选择CH375的命令口 CH375_RD = 1; //如果I/O默认电平是高电平,那么这是可选操作 CH375_CS = 0; CH375_WR = 0; _nop_(); _nop_(); CH375_WR = 1; CH375_CS = 1; CH375_A0 = 0; CH375_D0_D7 = 0xFF; //对于准双向I/O,请在此设置输出全高电平 }
/* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ void CH375_WR_DAT_PORT( unsigned char dat ) { delay2us(); ///CH375_DAT_PORT=dat; CH375_D0_D7 = dat; CH375_A0 = 0; CH375_RD = 1; CH375_CS = 0; CH375_WR = 0; _nop_(); _nop_(); CH375_WR = 1; CH375_CS = 1; CH375_D0_D7 = 0xFF; // 对于准双向I/O,请在此设置输出全高电平 }
/* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ unsigned char CH375_RD_DAT_PORT( void ) { unsigned char dat = 0;
CH375_D0_D7 = 0xFF; // 对于准双向I/O,请在此设置输出全高电平,便于输入 CH375_CS = 0; CH375_RD = 0; _nop_(); _nop_(); dat = CH375_D0_D7; CH375_RD = 1; CH375_CS = 1; CH375_D0_D7 = 0xFF; // 对于准双向I/O,请在此设置输出全高电平 return( dat ); ///return( CH375_DAT_PORT ); }
很感谢您的及时关注,以上程序基本上是例子程序,应该没有问题的。
恩,确实看不出问题.你的是普通51单片机吧
因为烧片子不方便,要去别的部门。 我现在用的是仿真器,仿真89C51,仿真器是"EasyPack/E 8052F". 是不是仿真器的影响呢? 郁闷中...