基于AT89C52+CH732,自检不能通过,请帮忙看看,谢谢!

公司要求做个高速信号采集设备,打算用CH732进行USB数据传输。预实验用AT89C52和CH732做个最简单的电路,见附件。

电路搭建好后,在Keil中编写程序如下:

#include #include

//CH37X的命令 #define GET_IC_VER 0x01 //获取芯片及固件版本

//命令使能地址 1 命令 0 数据 #define A0_CMD 0x01 #define A0_DATA 0x00

//数据地址 #define DATA_ADD P1

//命令端口 sbit A0 = P3^3;

void main (void){ unsigned char val;

//发送检查版本号命令 DATA_ADD = GET_IC_VER; A0 = A0_CMD; RD = 0x01; WR = 0x00;

//读取数据 A0 = A0_DATA; WR = 0x01; RD = 0x00; val = DATA_ADD & 0x3F;

while(1){ } }

用仿真器跟踪,发现每次读取P1都是0x00,不知道原因,换了其他命令(如CHECK_EXIST)也是如此。

请大侠们帮我看看,十分感谢!2010871825288.bmp

C6电容应该为103,C7电容为104,同时USB口的接线方式为:VCC,D-,D+,GND。同时你的读写函数也有问题: //发送检查版本号命令 DATA_ADD = GET_IC_VER; A0 = A0_CMD; RD = 0x01; WR = 0x00; WR = 0x01;

//读取数据 A0 = A0_DATA; WR = 0x01; RD = 0x00; RD = 0x00; val = DATA_ADD & 0x3F; RD = 0x01;


main( ) 函数开始应该延时50毫秒


请问hcn,我看了CH732的datasheet,说WR和RD是低电位有效,为什么要RD = 0x01? USB的D+/D-在原理图上确实写反,谢谢!


这些你可以去看下我们的芯片说明书的时序图,拉高是标准的INTEL的并口时序要求的。还有你的写信号在写完之后也需要拉高。


非常感谢hcn,我再仔细检查一下。

另外也谢谢<红桃六>


hcn你好! 按照你说的,我重新调整了电路中C6/C7,检查了D+/D-,修改了程序如下: void main (void){ unsigned char val; //延时50ms delayus(50000); RD = 0x01; WR = 0x01; //发送命令 DATA_ADD = GET_IC_VER; A0 = A0_CMD; WR = 0x00; WR = 0x01; //延时10us delayus(10); //读取结果 A0 = A0_DATA; RD = 0x00; RD = 0x00; val = DATA_ADD; RD = 0x01; }

但是读出来的结果是0x17,感觉高位丢失了

于是再用CHECK_EXIST命令测试了一下, 输入0x0F,返回0x10, 输入0xF0,返回0x8F, 输入0xAA,返回0x95

高4位始终有点问题,以为线路接错了,反复检查后还是如此,只有再次请教了,谢谢!


不是虚焊?呵呵。


刚才我换算了一下,应该是高三位,其中 第7位 = 输入的数字的高位 第6-5位 = 始终为0

用万用表检查,电路没有接错,重新焊接了,应该没有虚焊,确实比较奇怪了


看看A0是不是一直为1,高位一直为1,可能虚焊,短路,或者在读取数据的时候A0始终为1,都可能出现这种情况。


我估计也是虚焊或短路,集成块很小,手工焊接比较困难,我再仔细弄弄,非常感谢!


重新焊了一块芯片,问题照旧,仔细查阅了论坛中的《CH375和CH372常见问题的解决[讨论]》一文,看到第12问中:

P0 = 0xff // 放在RD=0之前更安全,否则如果之前P0输出0,CH375输出1会短路

会不会是这个原因呢?

于是在我的代码中也加入了一句:

//如果之前DATA_ADD输出0,CH372输出1时会出现短路,导致结果始终为0 DATA_ADD = 0xFF; A0 = A0_DATA; RD = 0x00; RD = 0x00; //相当于延时 res = DATA_ADD; RD = 0x01;

结果一切正常了。看来不是焊接的问题,终于找到原因了。


P1口锁存了你之前发关送的数据,模拟时序方式时,发送完数据要把总线置为1的。 完全就是这个原因


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