我使用:MCS51\FILELIBC\EXAM7中的例子,模拟并口调程序,使用查询方式。前边的CH375LibInit( )和CH375DiskReady()都正常通过,但是到这一步: mCopyCodeStringToXRAM( mCmdParam.Open.mPathName, "/MY_ADC.TXT" ); /* 文件名,该文件在根目录下 */ i = CH375FileOpen( ); /* 打开文件 */ 进入CH375FileOpen( )后就再也出不来了,请问这是怎么回事? 我用的是C8051F340,库函数用的就是FILELIBC中带的库
有可能是模拟时序不好,把CH375的接口子程序贴出来
void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { CH375_CS = 1; CH375_WR = 1; CH375_RD = 1; CH375_A0 = 0; P3 = 0xFF; /* 并口输入 */ }
void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { //*(UINT8XV *)0XBDF1 = mCmd; //return; mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ P3MDOUT=0XFF; P3 = mCmd; /* 向CH375的并口输出数据 */ CH375_A0 = 1; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的命令端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mDelaymS(2); CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; CH375_A0 = 0; P3MDOUT=0; P3 = 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时2uS */ }
void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { //*(UINT8XV *)0XBCF0 = mData; //return; P3MDOUT=0XFF; P3 = mData; /* 向CH375的并口输出数据 */ CH375_A0 = 0; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的数据端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mDelaymS(2); CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; P3MDOUT=0; P3 = 0xFF; /* 禁止数据输出 */ mDelay1_2uS( ); /* 至少延时1.2uS */ }
UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; //return( *(UINT8XV *)0XBCF0 ); mDelay1_2uS( ); /* 至少延时1.2uS */ P3 = 0xFF; /* 输入 */ CH375_A0 = 0; CH375_CS = 0; CH375_RD = 0; /* 输出有效写控制信号, 读CH375芯片的数据端口 */ CH375_CS = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mDelaymS(2); mData = P3; /* 从CH375的并口输入数据 */ CH375_RD = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; return( mData ); }
/* 如果单片机与CH375是串口连接,那么参考下面的子程序 void CH375_PORT_INIT( ) { SCON = 0xD0; 设置串口为9位数据 设置波特率和其它串口参数 }
void xWriteCH375Cmd( UINT8 mCmd ) { TI = 0; TB8 = 1; SBUF = mCmd; while ( TI == 0 ); }
void xWriteCH375Data( UINT8 mData ) { TI = 0; TB8 = 0; SBUF = mData; while ( TI == 0 ); }
UINT8 xReadCH375Data( void ) { while ( RI == 0 ); RI = 0; return( SBUF ); } */
/* 将程序空间的字符串复制到外部RAM中,返回字符串长度 */ UINT8 mCopyCodeStringToXRAM( UINT8 xdata *iDestination, UINT8 code *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); }
/* 检查操作状态,如果错误则显示错误代码并停机 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ // printf( "Error: %02X\n", (UINT16)iError ); /* 显示错误 */ while ( 1 ) { LED_OUT_ACT( ); /* LED闪烁 */ mDelaymS( 200 ); LED_OUT_INACT( ); mDelaymS( 200 ); } }
用下面的读写时序试试: void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { //*(UINT8XV *)0XBDF1 = mCmd; //return; mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ P3 = mCmd; /* 向CH375的并口输出数据 */ P3MDOUT=0XFF; CH375_A0 = 1; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的命令端口 */ CH375_WR = 0;CH375_WR = 0;CH375_WR = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; CH375_A0 = 0; P3MDOUT=0X00;/* 禁止数据输出 */ mDelay1_2uS( ); /* 调整延时,CH375B延时1.5uS */ }
void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { //*(UINT8XV *)0XBCF0 = mData; //return; P3 = mData; /* 向CH375的并口输出数据 */ P3MDOUT=0XFF; CH375_A0 = 0; CH375_CS = 0; CH375_WR = 0; /* 输出有效写控制信号, 写CH375芯片的命令端口 */ CH375_WR = 0;CH375_WR = 0;CH375_WR = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ CH375_WR = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; P3MDOUT=0X00;/* 禁止数据输出 */ mDelay1_2uS( ); /*调整延时,CH375B延时0.6uS */ }
UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { UINT8 mData; //return( *(UINT8XV *)0XBCF0 ); P3MDOUT=0X00; /*置方向输入*/ CH375_A0 = 0; CH375_CS = 0; CH375_RD = 0; /* 输出有效读控制信号, 写CH375芯片的命令端口 */ CH375_RD = 0;CH375_RD = 0;CH375_RD = 0; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mData = P3; /* 从CH375的并口输入数据 */ CH375_RD = 1; /* 输出无效的控制信号, 完成操作CH375芯片 */ CH375_CS = 1; mDelay1_2uS( ); /*调整延时,CH375B延时0.6uS */ return( mData ); }
我想问一下你为什么这么改呢? 按你给的改完,连初始化都不行了
这个是按照手册中375并口时序要求修改的 (1)库初始化返回值是多少 (2)参考手册,做一下测试命令 (3)不知道硬件上CH375_CS、CH375_WR、CH375_RD、CH375_A0是怎么定义的,在CH375_PORT_INIT中需要把这几个引脚定义为输出。 (4)读写脉宽以及写命令、写数据、读数据后的延时是否满足375的要求 (5)配置好I/O口以后,对各个控制线,数据口做个高低电平测试,实际能否输出高低电平
CH375DiskReady是循环5次通过的还是正常通过?一般来说CH375DiskReady能够正常通过的话下面的操作基本没什么问题,如果CH375DiskReady没有正常通过请看看返回的错误代码是多少.
使用CMD_CHECK_EXIST命令测试成功 执行i = CH375LibInit( );后 i=0x00; 执行 for ( i = 0; i < 5; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelaymS( 100 ); if ( CH375DiskReady( ) == ERR_SUCCESS ) { x=CH375DiskReady(); break; /* 查询磁盘是否准备好 */ } } for循环只一次,然后 x=CH375DiskReady(); x值为0x00;然后就break了 我的硬件定义如下: sbit CH375_A0 = P1^1; sbit CH375_CS = P1^3; sbit CH375_WR = P1^7; sbit CH375_RD = P1^5; sbit CH375_INT_WIRE = P2^0; P3为数据口
端口的定义: void C8051F340_INIT(void) { PCA0MD &= ~0x40; //关闭看门狗 OSCICN |= 0x03; //使用内部12M晶振 mDelay1_2uS( ); //延时6us mDelay1_2uS( ); mDelay1_2uS( ); mDelay1_2uS( ); mDelay1_2uS( ); //初始化端口:P3.0至P3.7为D0至D7; P1.1为WR; P1.3为RD; P1.5为CS; P1.7为A0; P2.0为中断 P1MDOUT=0xFF; //P1设置为推挽 P2MDOUT&=0XFE; //P2.0中断引脚设置为开漏 P2|=0X01; //将P2.0写1,禁止P2.0输出 CH375_CS = 1; CH375_WR = 1; CH375_RD = 1; CH375_A0 = 0; P3 = 0xFF; /* 并口输入 */ XBR1 = 0xC0; // 允许交叉开关 }
请问这个问题没人能解答一下么? 我把整个程序发到你们技术的邮箱里了,能否帮忙解决一下呢,急!!!
你把你的原理图和程序发给我,我能帮你解决。这个芯片我用过很多了,还是很好用的。我大多数问题都碰到过帮你解决应该没有问题。
个人信息保护,已隐藏
邮件已发送,谢谢
如果说发送DISK-READY这个函数可以操作过了的话,那么,你可以去看下你编译之后RAM的资源是怎么分配的,是否超过了你的RAM空间,如果用FILELIBC的话,那么,全部使用的是外部RAM,是否在RAM上面存在问题,你也可以做下DISK-BASE-BUF的RAM测试,看下这个RAM测试是否正常。或者你话成FILELIB5库去测试下看效果是否一样
谢谢,请问我使用KEIL,如何看RAM的资源分配以及如何做DISK-BASE-BUF的RAM测试呢? 还有FILELIB5和FILELIBC有什么区别呢? 谢谢楼上,本人刚开始接触所以不是太明白
FILEB5和FILEC的区别在于FILBC的RAM主要分配到了外部的RAM,而FILE5则是一部分RAM在外部,一部分在内部,你用KEIL编译的时候,你看下XDATA和DATA是多少?和你自己本身的资源分配的话会不会多了
FILELIBC:Program Size: data=20.4 xdata=663 code=10336 FILELIB5:Program Size: data=128.5 xdata=528 code=8117 我使用的单片机64Kflash,data=256,xdata=4K
那使用LIB5的时候出现了你说的上面的现象了吗?