谢谢,真是抱歉,我看到生成的文件名也有小数点,就没想ascII码错了,拿着本微机的书,ascII还出错,刚才百度了一下,真是感谢,继续调试。
我的FILE_DATA_BUF只有4K的空间,现在要写8K的数据,按我自己对例程的理解,写成如下的程序,可后4k的内容写不进去,麻烦各位指点一下,谢谢。 mCmdParam.Open.mPathName[0] = 0x5c; mCmdParam.Open.mPathName[1] = 0x32; mCmdParam.Open.mPathName[2] = 0x30; mCmdParam.Open.mPathName[3] = 0x30; mCmdParam.Open.mPathName[4] = 0x39; mCmdParam.Open.mPathName[5] = 0x30; mCmdParam.Open.mPathName[6] = 0x38; mCmdParam.Open.mPathName[7] = 0x30; mCmdParam.Open.mPathName[8] = 0x37; mCmdParam.Open.mPathName[9] = 0x2e; mCmdParam.Open.mPathName[10] = 0x54; mCmdParam.Open.mPathName[11] = 0x58; mCmdParam.Open.mPathName[12] = 0x54;
i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
for(j = 0; j < 16; j++) { FILE_DATA_BUF[WriteSizeCount] = (j&0x0f) + 0x41; WriteSizeCount++; FILE_DATA_BUF[WriteSizeCount] = 0x20; WriteSizeCount++; for(i = 2; i < 255; i++) { FILE_DATA_BUF[WriteSizeCount] = (i&0x0f) + 0x41; WriteSizeCount++; } FILE_DATA_BUF[WriteSizeCount] = 0x0d; WriteSizeCount++; }
NewSize = 0x2000; /* 新文件的长度 */ SecCount = (NewSize+CH375vSectorSize-1)/CH375vSectorSize; /* (NewSize+CH375vSectorSize-1)/CH375vSectorSize, 计算文件的扇区数,因为读写是以扇区为单位的 */
mCmdParam.Write.mSectorCount = SecCount; /* 写入所有扇区的数据 */ i = CH375FileWrite( ); /* 向文件写入数据 */
mCmdParam.Locate.mSectorOffset = 0xffffffff; //移到文件的尾部,以扇区为单位,如果原文件是3字节,则从CH375vSectorSize字节开始添加 i = CH375FileLocate( );
for(j = 0; j < 16; j++) { FILE_DATA_BUF[WriteSizeCount] = (j&0x0f) + 0x61; WriteSizeCount++; FILE_DATA_BUF[WriteSizeCount] = 0x20; WriteSizeCount++; for(i = 2; i < 255; i++) { FILE_DATA_BUF[WriteSizeCount] = (i&0x0f) + 0x61; WriteSizeCount++; } FILE_DATA_BUF[WriteSizeCount] = 0x0d; WriteSizeCount++; }
mCmdParam.Write.mSectorCount = 2; i = CH375FileWrite();
mCmdParam.Modify.mFileAttr = ATTR_ARCHIVE; /* 输入参数: 新的文件属性,为0FFH则不修改 */ mCmdParam.Modify.mFileTime = MAKE_FILE_TIME(11,0,0); /* 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2009,8,7 ); /* 输入参数: 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileSize = NewSize; /* 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 */ i = CH375FileModify( ); /* 修改当前文件的信息,修改日期和长度 */
mCmdParam.Close.mUpdateLen = 0; /* 不要自动计算文件长度,如果自动计算,那么该长度总是CH375vSectorSize的倍数 */ i = CH375FileClose( );
不需要跳转函数的,直接在后面在写数据就可以了。写完之后关闭文件。
可以了,谢谢。
请教一下,如果我只需要每次都创建新文件,不需要使用CH375FileLocate、CH375FileReadX这2个库函数,请问有方法让其不编译吗?
没有办法让其不编译,即使去掉这2个函数,代码空间也不会节省下来。
我写一个简单的U盘写文件程序没有异常,但我在另一个程序里嵌入库函数及头文件后所有库函数的变量都提示multiple public definitions,请问有人遇到类似情况吗?
多加了头文件,仔细检查工程.
库的头文件被多个C文件包含时,除一个C文件外,其他C文件包含头文件时需这样做: #define CH375HF_NO_CODE 1 /* 这个宏头文件中有解释 */ #include "CH375HF?.H
谢谢,很奇怪,我就只有在主文件之中include了CH375的头文件,其他C文件都没有include这个头文件,可是一样报错。
具体是哪些函数和变量出现错误 建议逐步修改,看看是在哪一步出错的
呵呵,比较多,我再试试。 另外,因为我用查询方式,中断口另有用途,所以将 #ifndef NO_DEFAULT_CH375_INT /* 在应用程序中定义NO_DEFAULT_CH375_INT可以禁止默认的中断处理程序,然后用自行编写的程序代替它 */ #if LIB_CFG_INT_EN == 0 /* CH375的INT#引脚连接方式为"查询方式" */ void xQueryInterrupt( void ) /* 查询CH375中断并更新中断状态 */ { #ifdef CH375_INT_WIRE /* 查询中断引脚 */ while ( CH375_INT_WIRE ); /* 如果CH375的中断引脚输出高电平则等待 */ #else /* 对于CH375B芯片还可以查询命令端口的位7 */ while ( CH375_CMD_PORT & 0x80 ); /* 查询CH375B的命令端口的位7为1说明中断引脚输出高电平则等待 */ #endif CH375_CMD_PORT = CMD_GET_STATUS; /* 获取当前中断状态 */ CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; /* 操作无意义,用于至少延时2uS */ CH375IntStatus = CH375_DAT_PORT; /* 获取中断状态 */ if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 检测到USB设备断开事件 */ else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 检测到USB设备连接事件 */ } #else /* LIB_CFG_INT_EN != 0, CH375的INT#引脚连接方式为"中断方式" */ void xQueryInterrupt( void ) /* 查询中断状态,等待硬件中断 */ { while ( CH375IntStatus == 0 ); /* 子程序库调用该子程序之前CH375IntStatus=0,硬件中断后,由中断服务程序置为非0的实际中断状态后返回 */ } void CH375Interrupt( void ) interrupt CH375_INT_NO using 1 /* CH375中断服务程序,使用寄存器组1,由CH375的INT#的低电平或者下降沿触发单片机中断 */ { CH375_CMD_PORT = CMD_GET_STATUS; /* 获取中断状态并取消中断请求 */ CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; /* 操作无意义,用于至少延时2uS */ CH375IntStatus = CH375_DAT_PORT; /* 获取中断状态 */ if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 检测到USB设备断开事件 */ else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 检测到USB设备连接事件 */ #ifdef CLEAR_INT_MARK CLEAR_INT_MARK( ); /* 某些单片机需要由软件清除中断标志 */ #endif } #endif #endif
修改为 #ifndef NO_DEFAULT_CH375_INT /* 在应用程序中定义NO_DEFAULT_CH375_INT可以禁止默认的中断处理程序,然后用自行编写的程序代替它 */ #if LIB_CFG_INT_EN == 0 /* CH375的INT#引脚连接方式为"查询方式" */ void xQueryInterrupt( void ) /* 查询CH375中断并更新中断状态 */ { #ifdef CH375_INT_WIRE /* 查询中断引脚 */ while ( CH375_INT_WIRE ); /* 如果CH375的中断引脚输出高电平则等待 */ #else /* 对于CH375B芯片还可以查询命令端口的位7 */ while ( CH375_CMD_PORT & 0x80 ); /* 查询CH375B的命令端口的位7为1说明中断引脚输出高电平则等待 */ #endif CH375_CMD_PORT = CMD_GET_STATUS; /* 获取当前中断状态 */ CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; /* 操作无意义,用于至少延时2uS */ CH375IntStatus = CH375_DAT_PORT; /* 获取中断状态 */ if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 检测到USB设备断开事件 */ else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 检测到USB设备连接事件 */ } #endif
#endif
头文件的开头已经#define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */
这样应该没问题吧?
请不要随意修改库的头文件,查询或中断方式仅修LIB_CFG_INT_EN即可
麻烦哪位帮忙看一下附件的Keil工程文件,编译会异常,提示multiple public definitions。
UploadImages/200981015344617.rar 忘点上传文件了,麻烦哪位帮忙分析下附件的Keil报错信息。