CH375复位问题解决了,但是又碰到一个问题

我的CH375B系统用的是3.3V的系统,CH375的第二脚通过1uF的电容连接到3.3V电源上(这个电容还换过0.1uF),电路都是按照资料中的连接(仔细对照过,没有问题,并且这个电路曾经还能用)。现在出现一个很奇怪的问题:就是复位电路,复位期间第25脚是3V,第26脚是0V,复位完成后电压还是那样(第25脚是3V,第26脚是0V)。这个实验我在第2脚连接电容的时候测过,出现这个问题后,我把第二脚通过单片机的一个I/O口置高和置低,在置高的时候第25脚是3V,第26脚是0V,然后再置低,电压还是那样。

请问大家,这是什么问题呢?是芯片坏了吗?

0.1UF的电容有点小了.1UF到可以的.确保复位完成并且2脚为低电平,然后看看晶振是否起振了.如果晶振没有震荡的话肯定无法工作.


现在复位没有问题了。复位后第25脚和26脚的电平都正常。晶振也没问题了。但是在初始化过程中出现问题。程序如下: uchar UsbCH375_init() { UINT8 i,mon; //UINT16 len; CH375_PORT_INIT( ); /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ LED_OUT_INIT( ); LED_OUT_ACT( ); /* 开机后LED亮一下以示工作 */ mDelaymS( 100 ); /* 延时100毫秒 */ LED_OUT_INACT( ); //mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */ //printf( "Start\n" );

i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ xWriteCH375Cmd(0x06); xWriteCH375Data(0x55); mon=xReadCH375Data(); //mStopIfError( i ); if(i!=ERR_SUCCESS) return 0xdd; }

运行到最后一句,这时 i=0x81; 并且mon读出的值是0x55;

请问,大家帮着分析一下,是什么地方的问题呢


0x81是硬件错误,用的是并口连接还是串口连接 ,时序是否正常?


用的是串口连接 接线图 用的是C8051F020,晶振是3.6864MHz 1脚————P0.6 2脚————经过1uF电容接在3.3V 3脚————P3.1 4脚————P3.0 5脚————GND 8脚————P0.7 9脚————3.3V 12脚、23脚————GND 13脚————3.3V有源晶振12M的输出 15脚至22脚————P7口 27脚————P3.2

各I/O口的单独测试过高低电平,没有问题。并且这段程序和电路以前用过,也是这款CPU,不过晶振是11.0592MHz 您是说延时不够,或者延时太长了吗?


你说的是用串口连接,怎么看像是并口连接的啊?使用串口操作CH375的时候,单片机和CH375只需要三根线,txd,rxd,int,参考我们说明书上面的原理图连接. 先做一下测试命令,看看硬件连接是否正常?


那你现在换成11.0592MHz的晶振能正常通讯起来吗?如果可以的话基本上能确定你的硬件连接没有什么问题. 那么你现在检查你的串口波特率,误差多大.


哦,不是串口连接,是模拟的并口连接 连接图就是按照“USB芯片的电路及PCB设计的重要注意事项 版本:2C”中3、设计3.3V的USB产品中连接的。

这个电路以前用过,是能通的,两种PCB的布局不一样,通的那块PCB的第28脚的两个滤波电容比较靠近管脚,而不通的这块PCB的滤波电容离第28脚比较远。

难道是这个问题吗?


检查时序吧.读写函数不对.参考: void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ P0 = mCmd; /* 向CH375的并口输出数据 */ CH375_A0 = 1; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的命令端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; CH375_A0 = 0; P0 = 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时2uS */ }

void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { P0 = mData; /* 向CH375的并口输出数据 */ CH375_A0 = 0; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的数据端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; P0 = 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); /* 至少延时1.2uS */ }

UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; mDelay1_2uS( ); /* 至少延时1.2uS */ P0 = 0xFF; /* 输入 */ CH375_A0 = 0; CH375_CS = 0; CH375_RD = 0; /* 输出有效写控制信号, 读CH375芯片的数据端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mData = P0; /* 从CH375的并口输入数据 */ CH375_RD = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; return( mData ); }


下面是我的读写时序程序,和您的一样呀。 void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { CH375_CS = 1; CH375_WR = 1; CH375_RD = 1; CH375_A0 = 0; P7 = 0xFF; /* 并口输入 */ }

void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { //*(UINT8XV *)0XBDF1 = mCmd; //return; mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ P7 = mCmd; /* 向CH375的并口输出数据 */ CH375_A0 = 1; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的命令端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; CH375_A0 = 0; P7= 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时2uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ }

void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { //*(UINT8XV *)0XBCF0 = mData; //return; P7 = mData; /* 向CH375的并口输出数据 */ CH375_A0 = 0; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的数据端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; P7 = 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); /* 至少延时1.2uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ //mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ }

UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; //return( *(UINT8XV *)0XBCF0 ); //mDelay1_2uS( ); /* 至少延时1.2uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ P7 = 0xFF; /* 输入 */ CH375_A0 = 0; CH375_CS = 0; CH375_RD = 0; /* 输出有效写控制信号, 读CH375芯片的数据端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mData = P7; /* 从CH375的并口输入数据 */ CH375_RD = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ return( mData ); }


 不需要加那么多的延时,做测试命令,看看是否正确?


uchar UsbCH375_init() { UINT8 i,mon; //UINT16 len; CH375_PORT_INIT( ); /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ LED_OUT_INIT( ); LED_OUT_ACT( ); /* 开机后LED亮一下以示工作 */ mDelaymS( 100 ); /* 延时100毫秒 */ LED_OUT_INACT( ); //mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */ //printf( "Start\n" );

i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ xWriteCH375Cmd(0x06); xWriteCH375Data(0x55); mon=xReadCH375Data(); //mStopIfError( i ); if(i!=ERR_SUCCESS) return 0xdd; }

运行到最后一句,这时 i=0x81; 并且mon读出的值是0x55

上面是读出来的数,正确的应该是0xAA的


会不会是因为PCB元件布局和布线的原因呢?


xWriteCH375Cmd(0x06); xWriteCH375Data(0xff); mon=xReadCH375Data(); 利用上面函数测试,读出来的数据根本不是写入的按位取反,而是不确定的数据,是不是CH375根本没工作呢?


你看一下25是不是低电平26脚是不是高电平.测量晶振有没有震荡起来.


写任何命令都不工作,比如:写命令01H,读出的数据还是和刚才的一样是50H,我怀疑芯片根本就没工作


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