为什么CH375B的25脚老是高,26老是低啊

蛋疼啊,换了个晶振还是一样,两个起振电容用的是20pf的。 至于有没有起振我不太确定了,晶振14脚是2v多点,13基本是0. 求助啊。。。。。。。。

检查硬件连接 CH375 第2脚对电源接一个104的电容, CH375如果是5V供电,那么V3引脚对地接103电容, 如果是3.3V供电,将V3引脚直接 接VCC(3.3V), 电源对地也接一个104电容,如果晶振起振 则两端电压均在电源电压的一半左右, 在晶振两端并一个1M欧姆的电阻试试。 请多注意身体。。。


还是不行啊,上面的方法我都试了,唯一有点进展的是25脚现在是低电平,26是高电平了 但13脚还是基本接近0,咋办啊,是不是芯片坏了啊


不是芯片坏了,而是你用万用表量晶振的时候,晶振停振了。只要25脚位低,26脚位高就说明芯片已经复位以及晶振是起振的。下面软件上面只需要测试命令通过就没什么问题了。


25脚现在是低电平,26是高电平 说明芯片正常工作了。


这样啊。。。谢谢谢谢谢谢,我是在电烙铁热起来之前看看这个贴。。。哈哈,不用换了


还是不对啊,麻烦看看我的程序,就只是个测试命令功能。主函数main之前的代码都是从贵公司示例拷来的,但是出来的数据老是oxff,下面是代码

#include #include #include #include #include "SERISE.h"

#define A0(n) {PORTE=(PORTE&0XBF)^(n<<6);} #define CS(n) {PORTE=(PORTE&0X7F)^(n<<7);} #define WR(n) {PORTE=(PORTE&0XEF)^(n<<4);} #define RD(n) {PORTE=(PORTE&0XDF)^(n<<5);} #define RST(n) {PORTE=(PORTE&0XF7)^(n<<3);} /* 以下定义的详细说明请看CH375HF9.H文件 */ #define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */

/* 单片机的RAM有限,其中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲 */ #define DISK_BASE_BUF_LEN 2048 /* 默认的磁盘数据缓冲区大小为512字节,建议选择为2048甚至4096以支持某些大扇区的U盘,为0则禁止在.H文件中定义缓冲区并由应用程序在pDISK_BASE_BUF中指定 */ #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */ /* 如果准备使用双缓冲区交替读写,那么不要定义FILE_DATA_BUF_LEN,而是在参数中指定缓冲区起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */

#define CH375_INT_WIRE ( PIND & 0x08 ) /* PIND.3, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */

#define NO_DEFAULT_CH375_F_ENUM 1 /* 未调用CH375FileEnumer程序故禁止以节约代码 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未调用CH375FileQuery程序故禁止以节约代码 */

#include "CH375HFB.H"

void mDelay1uS( ) /* 至少延时1uS,根据单片机主频调整 */ { UINT8 i; for ( i = 500; i != 0; i -- ); }

void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { DDRA = 0x00; /* 设置8位并口为输入 */ PORTE = 0xB0; /* 设置CS,WR,RD默认为高电平 */ DDRE = 0xF8; /* 设置CS,WR,RD,A0为输出 */ DDRD = 0xF7; /* 设置INT#为输入 */ RST(1); mDelay1uS();mDelay1uS();mDelay1uS();mDelay1uS();mDelay1uS();mDelay1uS();mDelay1uS();mDelay1uS(); RST(0); }

void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { mDelay1uS( ); mDelay1uS( ); /* 至少延时1uS */ A0(1); /* 输出A0=1 */ PORTA = mCmd; /* 向CH375的并口输出数据 */ DDRA = 0xFF; /* 并口D0-D7输出 */ CS(0);A0(1);WR(0);RD(1); /* 输出有效写控制信号, 写CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */ DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ A0(1);WR(1);RD(1);CS(1); /* 输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */ DDRA = 0x00; /* 禁止数据输出 */ A0(0); /* 输出A0=0; 可选操作 */ mDelay1uS( ); mDelay1uS( ); /* 至少延时2uS */ }

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

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

/* 延时指定毫秒时间,根据单片机主频调整,不精确 */ void mDelaymS( UINT8 ms ) { UINT16 i; while ( ms -- ) for ( i = 2600; i != 0; i -- ); }

/* 检查操作状态,如果错误则显示错误代码并停机 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 显示错误 */ while ( 1 ) { /*本来这里是个LED闪灯代码*/ } }

void main() { Init_ser(); CH375_PORT_INIT(); xWriteCH375Cmd(0x06); xWriteCH375Data(0x55); send(xReadCH375Data()); }


最后这句send(xReadCH375Data());是将返回的数据送到串口。结构都是0xff,我想问问这个测试命令这样用应该没错吧?


上电之后需要延时50MS以上的延时之后在进行数据处理。


不好意思,还是得再问一下 我延时了, mDelaymS(1);我模拟了下,时间是2ms,所以150个延时肯定够了,但是出来的数据还是0xff,我的硬件引脚也一个个测试了,都是对的,连接没问题,给点意见,谢谢了!!! void main() { Init_ser(); mDelaymS(150); CH375_PORT_INIT(); mDelaymS(150); xWriteCH375Cmd(0x06); xWriteCH375Data(0x55); send(xReadCH375Data()); }


有木有人啊?拜托


void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { mDelay1uS( ); mDelay1uS( ); /* 至少延时1uS */ A0(1); PORTA = mCmd; DDRA = 0xFF; CS(0);A0(1);

WR(0); 这里WR脉冲加长些。 CS(0); CS(0); RD(1); DDRA = 0xFF; A0(1); WR(1); RD(1);CS(1); DDRA = 0x00; A0(0); mDelay1uS( ); mDelay1uS( ); /* 至少延时2uS */ }

另外写命令,读数据,也类似,读写脉冲加长


感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢感谢!!!!!!!! 问题解决了,就是延时不够,搞了这么久终于成功了,非常感谢!


请问nicker,你说就是延时不够,该怎么加延时?在哪里加?加多少?


一个是上电复位延时50ms,确保复位正常,我们芯片正常工作。

二是如果你单片机主频比较快,调整字节读写之间的延时,2us以上,确保测试命令通过通讯正常。


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