我用单片机+375读U盘,375初始化以及u盘准备就绪后,在查询磁盘信息是返回数据不对会是什么原因?如,FAN32格式的返回值是FAT16,以及返回值磁盘总扇区数1094713344,而剩余扇区数是1259339776.也就是说剩余的比总的扇区还大。文件也打不开。拜托,谢谢了[Emot]1[/Emot]
你用的是我们提供的库还在自己写的U盘初始化部分?
我是严格按照你公司的库函数编写的程序:会不会是配置有问题,帮我看看了。不胜感激 还有文件创建的返回值成功,在PC机上打开U盘跟本就搜不到文件 #include #include #include "uart.h"
#define CH375_CMD_PORT_ADDR 0XBDF1 #define CH375_DAT_PORT_ADDR 0XBCF0
#include "ch375hf6.h"
unsigned int i,j,SecCount; unsigned char xdata buf[512];
void Delayms(unsigned int mDelay) { int i; for(;mDelay>0;mDelay--) for(i=2762;i>0;i--); } void main() { Rs232_Init(); Timer1_Init(); Rs232_SendStr("串口初始化成功!") ; Rs232_SendDat(1234); // Rs232_SendInformation("串口",1234); 不能使用!! Rs232_SendNewLine(); i = CH375LibInit( ); if(i == ERR_SUCCESS) { Rs232_SendStr("375初始化成功!"); Rs232_SendStr("请插入U盘..."); Rs232_SendNewLine();
while( CH375DiskStatus < DISK_CONNECT ) { if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; Delayms( 1 ); } Rs232_SendStr("CH375已经插入!"); Rs232_SendNewLine();
//LED_OUT_ACT( ); //Delayms( 200 ); Rs232_SendStr("检查U盘是否就绪....."); Rs232_SendNewLine(); for( i = 0; i < 5; i ++ ) { Delayms( 100 ); Rs232_SendStr( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; } Rs232_SendStr("获取U盘容量....."); Rs232_SendNewLine();
i=CH375DiskSize( ); Rs232_SendDat(mCmdParam.DiskSize.mDiskSizeSec); Rs232_SendNewLine(); i=CH375DiskQuery(); if(i==0) { j=mCmdParam.Query.mTotalSector/2048; Rs232_SendStr("总扇区数是:"); Rs232_SendDat(mCmdParam.Query.mTotalSector); Rs232_SendNewLine(); Rs232_SendDat(j); Rs232_SendNewLine();
Rs232_SendStr("剩余扇区数为"); j=0; j=mCmdParam.Query.mFreeSector/2048; Rs232_SendDat(mCmdParam.Query.mFreeSector); Rs232_SendNewLine(); Rs232_SendDat(j); Rs232_SendNewLine();
switch(mCmdParam.Query.mDiskFat) { case 0: Rs232_SendStr("未知文件系统!"); break; case 1: Rs232_SendStr("FAT 12 "); break; case 2: Rs232_SendStr("FAT 16 "); break; case 3: Rs232_SendStr("FAT 32 "); break; } Rs232_SendNewLine();
Rs232_SendStr("创建文件"); Rs232_SendNewLine();
strcpy(mCmdParam.Create.mPathName,"\\EEEE.TXT"); i=CH375FileCreate(); if(i == ERR_SUCCESS) { Rs232_SendStr("创建文件成功!"); Rs232_SendNewLine(); } else Rs232_SendStr("创建失败."); } else {Rs232_SendStr("磁盘信息获取失败.");} } else {Rs232_SendStr("初始化失败!");} while(1); }
j=mCmdParam.Query.mTotalSector/2048 两个问题,j为int变量,最还为long 这个整除2048是什么意思? 你的移植很不严格。请按照我们的参考程序来移植。比如我们的参考程序中开始部分都会定义一些宏,这些宏务必在#include "ch375hf6.h"之前。这是必须的。
另外检测到U盘连接和DiskReady之间的一些延时,请不要随意去修改,程序中都已经注释了,这些延时是必要延时,另外 CH375DiskReady( )是否返回了ERR_SUCCESS?一定要确保返回 ERR_SUCCESS,而不是循环5次跳出
你好,我用贵公司的示例程序扇区模式读写EXAM3,你的说明文档里说只需要1K的外部RAM,可是编译后XDATA=1053,出现了溢出。是怎么回事?谢谢了...
说明文档中所说的是指最少只需要,不表示我们的参考程序就用这么多。 EXAM3为扇区读写函数。占用RAM大些。
再次请教一下,我移植你公司的EXAM3示例程序如下: #include #include #include
#define LIB_CFG_DISK_IO 2 #define LIB_CFG_FILE_IO 2 #define LIB_CFG_INT_EN 0 //#define LIB_CFG_FILE_IO_DEFAULT 1
#define CH375_CMD_PORT_ADDR 0xBDF1 #define CH375_DAT_PORT_ADDR 0xBCF0
#define DISK_BASE_BUF_ADDR 0x0100 //#define FILE_DATA_BUF_ADDR 0x0200
#define FILE_DATA_BUF_LEN 0x0200
#define CH375_INT_WIRE P3^2 //#define DISK_BASE_BUF_LEN 0 #include "CH375HF6.H"
//unsigned char xdata buf[512];
sbit P1_4 = P1^4; #define LED_OUT_INIT( ) { P1_4 = 1; } /* P1.4 高电平 */ #define LED_OUT_ACT( ) { P1_4 = 0; } /* P1.4 低电平驱动LED显示 */ #define LED_OUT_INACT( ) { P1_4 = 1; } /* P1.4 低电平驱动LED显示 */ sbit P1_5 = P1^5;
#define LED_RUN_ACT( ) { P1_5 = 0; } /* P1.5 低电平驱动LED显示 */ #define LED_RUN_INACT( ) { P1_5 = 1; } /* P1.5 低电平驱动LED显示 */ sbit P1_6 = P1^6;
#define LED_WR_ACT( ) { P1_6 = 0; } /* P1.6 低电平驱动LED显示 */ #define LED_WR_INACT( ) { P1_6 = 1; } /* P1.6 低电平驱动LED显示 */
/* 延时100毫秒,不精确 */ void mDelay100mS( ) { UINT8 i, j, c; for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3; }
/* 检查操作状态,如果错误则显示错误代码并停机 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 显示错误 */ while ( 1 ) { LED_OUT_ACT( ); /* LED闪烁 */ mDelay100mS( ); LED_OUT_INACT( ); mDelay100mS( ); } }
/* 为printf和getkey输入输出初始化串口 */ void mInitSTDIO( ) { SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xf3; /* 24MHz晶振, 9600bps */ TR1 = 1; TI = 1; }
void main( ) { UINT8 i, c, SecCount; UINT32 NewSize, count; UINT8 code *pCodeStr; LED_OUT_INIT( ); LED_OUT_ACT( ); mDelay100mS( ); LED_OUT_INACT( ); mInitSTDIO( ); printf( "Start\n" );
//#if DISK_BASE_BUF_LEN == 0 // pDISK_BASE_BUF = &buf[0]; /* 不在.H文件中定义CH375的专用缓冲区,而是用缓冲区指针指向其它应用程序的缓冲区便于合用以节约RAM */ //#endif
i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ mStopIfError( i );
while ( 1 ) { printf( "Wait Udisk\n" ); while ( CH375DiskStatus != DISK_CONNECT ) { xQueryInterrupt( ); } printf( "查询到中断状态\n" );
while(1); } } 程序运行结果是,375程序库和芯片初始化成功。RST与RST#分别为低、高电平。在等待U盘插入时,U盘插入后没有反应,也就是说倒数第二个while()循环无法跳出,但是P3.2引脚在插入U盘前后确实电平由高变低了。帮忙检查一下,不胜感激。。。。
以及程序在执行 /* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelay100mS( ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ } 在执行CH375DiskReady( )时程序跑飞了。
#define FILE_DATA_BUF_LEN 0x0200 这个先这样定义: #define FILE_DATA_BUF_LEN 0x000