375与单片机连接

我现在 发CMD_CHECK_EXIST 55 能够返回aa 但是发读版本 和其他的返回的 都是5f 这是什么原因呢 void WriteCmd(UINT8 mCmd)//外部定义的被CH375程序库调用的子程序,向CH375写命令 { mDelay1uS( ); mDelay1uS( ); /* 至少延时1uS */ /* *(volatile unsigned char *)CH375_CMD_PORT_ADDR = mCmd; 通过并口直接读写CH375而非普通I/O模拟 */ Set_Bit(PORTB,A);///* 输出A0=1 写入命令代码 PORTA = mCmd; /* 向CH375的并口输出数据 */ DDRA = 0xFF; /* 并口D0-D7输出 */ /* 输出有效写控制信号, 写CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */ Set_Bit(PORTB,A); Clr_Bit(PORTC,CS); Clr_Bit(PORTB,WR); Set_Bit(PORTB,RD); DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ /* 输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */ //Set_Bit(PORTB,A); Set_Bit(PORTC,CS); Set_Bit(PORTB,WR); Set_Bit(PORTB,RD); DDRA = 0x00; /* 禁止数据输出 */ Clr_Bit(PORTB,A); /* 输出A0=0; 可选操作 */ mDelay1uS( ); mDelay1uS( ); /* 至少延时2uS */ } void WriteData(UINT8 mData )// 外部定义的被CH375程序库调用的子程序,向CH375写数据 { /* *(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData; 通过并口直接读写CH375而非普通I/O模拟 */ PORTA = mData; /* 向CH375的并口输出数据 */ DDRA = 0xFF; /* 并口D0-D7输出 */ /* 输出有效写控制信号, 写CH375芯片的数据端口, A0=0; CS=0; WR=0; RD=1; */ Clr_Bit(PORTB,A); Clr_Bit(PORTC,CS); Clr_Bit(PORTB,WR); Set_Bit(PORTB,RD); DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ //Clr_Bit(PORTB,A); Set_Bit(PORTC,CS); Set_Bit(PORTB,WR); Set_Bit(PORTB,RD); DDRA = 0x00; /* 禁止数据输出 */ mDelay1uS( ); /* 至少延时1.2uS */ }unsigned char ReadData(void)/* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; /* mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; 通过并口直接读写CH375而非普通I/O模拟 */ mDelay1uS( ); /* 至少延时1.2uS */ DDRA = 0x00; /* 数据输入 */ /* 输出有效读控制信号, 读CH375芯片的数据端口, A0=0; CS=0; WR=1; RD=0; */ Clr_Bit(PORTB,A); Clr_Bit(PORTC,CS); Set_Bit(PORTB,WR); Clr_Bit(PORTB,RD); DDRA = 0x00; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mData = PINA; /* 从CH375的并口PA输入数据 */ /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ //Clr_Bit(PORTB,A); Set_Bit(PORTC,CS); Set_Bit(PORTB,WR); Set_Bit(PORTB,RD); return( mData ); }

UINT8 USBTestwrite( void ) { UINT8 ii; UINT8 uTemp, jj; UINT8 *pFileTemp; int dwTemp1, dwTemp2; char *pTemp = "/TestUSB.DAT";

printf(" Create USB File = \"%s\" \n", pTemp); strcpy( (char *)mCmdParam.Create.mPathName, pTemp ); /* 新文件名,在根目录下 */ ii = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ if ( ii != ERR_SUCCESS ) { printf(" Create File fail \n"); return 0x03; } printf(" Write File Now \n"); mCmdParam.ByteWrite.mByteCount = 64; for( ii = 0; ii < 64; ii++ ) mCmdParam.ByteWrite.mByteBuffer[ii] = ii; ii = CH375ByteWrite ( ); { if ( ii != ERR_SUCCESS ) { printf("CH375ByteWrite fail \n"); return 0x05; } } printf(" close File Now \n"); mCmdParam.Modify.mFileSize = 64; mCmdParam.Modify.mFileDate = 0xffff; mCmdParam.Modify.mFileTime = 0xffff; mCmdParam.Modify.mFileAttr = 0xff; CH375FileModify( );

#if 1 mCmdParam.Close.mUpdateLen = 1; /* 自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */ #endif ii = CH375FileClose( ); if ( ii != ERR_SUCCESS ) { printf(" Close File fail \n"); return 0x06; } strcpy( (char *)mCmdParam.Open.mPathName, "/TestUSB.DAT" ); /* Key文件名固定 */ uTemp = CH375FileOpen( ); /* 打开key文件 */ if ( uTemp != ERR_SUCCESS ) /* 打开key文件失败 */ { printf("/n Error: Open File Error,uTemp= %x\n ",uTemp); return 0x01; } printf("/n Open File OK\n ");

dwTemp1 = MAX_FILE_LENG;/*上传的最大文件长度为2M*/ dwTemp2 = 0;/*存放读取的文件长度*/ pFileTemp = &FILE_DATA_BUF[0];/*Key文件存放缓冲区*/

dwTemp1 = FILE_DATA_BUF_LEN; while ( dwTemp1 ) { if ( dwTemp1 > MAX_BYTE_IO ) uTemp = MAX_BYTE_IO; /* 剩余数据较多,限制单次读写的长度不能超过 sizeof( mCmdParam.ByteRead.mByteBuffer ) */ else uTemp = dwTemp1;/* 最后剩余的字节数 */ mCmdParam.ByteRead.mByteCount = uTemp; /* 请求读出几十字节数据 */ jj = CH375ByteRead( ); /* 以字节为单位读取数据块,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后读 */ if ( jj != ERR_SUCCESS ) { CH375FileClose( ); printf("CH375ByteRead return Error %d\n", jj); return 0x02; } dwTemp1 -= mCmdParam.ByteRead.mByteCount; /* 计数,减去当前实际已经读出的字符数 */ dwTemp2 += mCmdParam.ByteRead.mByteCount; for ( jj = 0; jj != mCmdParam.ByteRead.mByteCount; jj++ ) *pFileTemp++ = mCmdParam.ByteRead.mByteBuffer[jj]; /* 将文件转到缓冲区,请注意:此地方可以做进一步的优化 */

printf( "Reading File, len: 0x%x\n", mCmdParam.ByteRead.mByteCount ); for ( jj = 0; jj != mCmdParam.ByteRead.mByteCount; jj++ ) printf( "File: 0x%x\n", mCmdParam.ByteRead.mByteBuffer[jj] ); if ( mCmdParam.ByteRead.mByteCount < uTemp ) /* 实际读出的字符数少于要求读出的字符数,说明已经到文件的结尾 */ { printf( "Read File %s Over,the length is 0x%x\n", "/ZYDQ_KEY.DAT", dwTemp2 ); break; } } CH375FileClose( );/*关闭源文件*/ return 0; }


大哥你回答些什么啊


时序上面有点问题: void WriteCmd(UINT8 mCmd)//外部定义的被CH375程序库调用的子程序,向CH375写命令 { mDelay1uS( ); mDelay1uS( ); /* 至少延时1uS */ /* *(volatile unsigned char *)CH375_CMD_PORT_ADDR = mCmd; 通过并口直接读写CH375而非普通I/O模拟 */ Set_Bit(PORTB,A);///* 输出A0=1 写入命令代码 PORTA = mCmd; /* 向CH375的并口输出数据 */ DDRA = 0xFF; /* 并口D0-D7输出 */

/* 输出有效写控制信号, 写CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */ Set_Bit(PORTB,A); Set_Bit(PORTB,RD); Clr_Bit(PORTC,CS); Clr_Bit(PORTB,WR);

DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */

/* 输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */ //Set_Bit(PORTB,A); Set_Bit(PORTB,WR); Set_Bit(PORTC,CS); Set_Bit(PORTB,RD);

DDRA = 0x00; /* 禁止数据输出 */ Clr_Bit(PORTB,A); /* 输出A0=0; 可选操作 */ mDelay1uS( ); mDelay1uS( ); /* 至少延时2uS */ } void WriteData(UINT8 mData )// 外部定义的被CH375程序库调用的子程序,向CH375写数据 { /* *(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData; 通过并口直接读写CH375而非普通I/O模拟 */ PORTA = mData; /* 向CH375的并口输出数据 */ DDRA = 0xFF; /* 并口D0-D7输出 */

/* 输出有效写控制信号, 写CH375芯片的数据端口, A0=0; CS=0; WR=0; RD=1; */ Clr_Bit(PORTB,A); Set_Bit(PORTB,RD); Clr_Bit(PORTC,CS); Clr_Bit(PORTB,WR);

DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */

/* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ //Clr_Bit(PORTB,A); Set_Bit(PORTB,WR); Set_Bit(PORTC,CS); Set_Bit(PORTB,RD);

DDRA = 0x00; /* 禁止数据输出 */ mDelay1uS( ); /* 至少延时1.2uS */ }unsigned char ReadData(void)/* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; /* mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; 通过并口直接读写CH375而非普通I/O模拟 */ mDelay1uS( ); /* 至少延时1.2uS */

DDRA = 0x00; /* 数据输入 */

/* 输出有效读控制信号, 读CH375芯片的数据端口, A0=0; CS=0; WR=1; RD=0; */ Clr_Bit(PORTB,A); Set_Bit(PORTB,WR); Clr_Bit(PORTC,CS); Clr_Bit(PORTB,RD);

DDRA = 0x00; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */

mData = PINA; /* 从CH375的并口PA输入数据 */

/* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */

//Clr_Bit(PORTB,A); Set_Bit(PORTB,RD); Set_Bit(PORTC,CS); Set_Bit(PORTB,WR);

return( mData ); } 你按照上面的时序来操作下看可以不可以,还有就是做测试命令的时候,你不能只做一组数据,需要做2组数据才是最安全的,也就是你可以先做0X55数据,看返回什么样的数据,接着在做0XAA数据,看返回什么样的数据就可以了。


我试验 了一下 每次发送测试命令都可以返回正确的值 连续几次都可以 就是发别的 没反应 把优盘插进去 没反应 但是拔下来 能返回0x16! 真奇怪 我在看看我的硬件吧


有可能是插入U盘时,U盘耗电过大,造成电源不稳定。 给USB口电源加个100uF左右的电容试试。


当你设置好模式6之后,在插上U盘,看下375的中断引脚是高还是低??


真是奇怪啊奇怪 我加了100uf电容了! 我已经 连续的读 测试命令都对 但是读版本的时候就返回0x5f 如果我的时序 和连线不对 是不是 测试命令就返回不了正确的了呢?


那你看下设置模式之后返回的是什么呢???返回的还是0x5f?


不好用啊见鬼!了! 他要是测试命令 返回也错了也好 知道有错的啊!爱!!


设置模式之后 返回还是0x5f 怎么读模式呢?


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