请帮忙测试[求助]

使用你们提供的AVR的库文件: /* 2004.06.05, 2004.09.20, 2004.10.22, 2004.11.20, 2004.12.12, 2004.12.28, 2005.01.04, 2005.01.12, 2005.01.26, 2005.03.01, 2005.07.29, 2005.12.28 **************************************** ** Copyright (C) W.ch 1999-2005 ** ** Web: http://www.winchiphead.com ** **************************************** ** USB Host File Interface for CH375 ** ** TC2.0@PC, ICCAVR_6.31@AVR ** **************************************** */ /* CH375 主机文件系统接口 V2.9 */ /* 支持: FAT12/FAT16/FAT32 */ /* AVR单片机, 查询方式或者中断方式 */

#ifndef CH375HF_H #define CH375HF_H

#define CH375_LIB_VER 0x29

/* 以下定义的详细说明请看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 FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */ /* 如果准备使用双缓冲区交替读写,那么不要定义FILE_DATA_BUF_LEN,而是在参数中指定缓冲区起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */

#ifdef __cplusplus extern "C" { #endif

/* FILE: CH375INC.H */

/* ********************************************************************************************************************* */ /* 硬件特性 */

#define CH375_MAX_DATA_LEN 0x40 /* 最大数据包的长度, 内部缓冲区的长度 */

/* ********************************************************************************************************************* */ /* 命令代码 */

#define CMD_RESET_ALL 0x05 /* 执行硬件复位 */

#define CMD_CHECK_EXIST 0x06 /* 测试工作状态 */ /* 输入: 任意数据 */ /* 输出: 输入数据的按位取反 */

#define CMD_SET_USB_ID 0x12 /* 设备方式: 设置USB厂商VID和产品PID */ /* 输入: 厂商ID低字节, 厂商ID高字节, 产品ID低字节, 产品ID高字节 */

#define CMD_SET_USB_ADDR 0x13 /* 设置USB地址 */ /* 输入: 地址值 */

#define CMD_SET_USB_MODE 0x15 /* 设置USB工作模式 */ /* 输入: 模式代码 */ /* 00H=未启用的设备方式, 01H=已启用的设备方式并且使用外部固件模式, 02H=已启用的设备方式并且使用内置固件模式, 03H=已启用的设备方式并且使用中断端点和内置固件模式 */ /* 04H=未启用的主机方式, 05H=已启用的主机方式, 06H=已启用的主机方式并且自动产生SOF包, 07H=已启用的主机方式并且复位USB总线 */ /* 输出: 操作状态( CMD_RET_SUCCESS或CMD_RET_ABORT, 其它值说明操作未完成 ) */

#define CMD_SET_ENDP2 0x18 /* 设备方式: 设置USB端点0的接收器 */ /* 输入: 工作方式 */ /* 位7为1则位6为同步触发位, 否则同步触发位不变 */ /* 位3~位0为事务响应方式: 0000-就绪ACK, 1110-正忙NAK, 1111-错误STALL */

#define CMD_SET_ENDP3 0x19 /* 设备方式: 设置USB端点0的发送器 */ /* 输入: 工作方式 */ /* 位7为1则位6为同步触发位, 否则同步触发位不变 */ /* 位3~位0为事务响应方式: 0000~1000-就绪ACK, 1110-正忙NAK, 1111-错误STALL */

#define CMD_SET_ENDP4 0x1A /* 设备方式: 设置USB端点1的接收器 */ /* 输入: 工作方式 */ /* 位7为1则位6为同步触发位, 否则同步触发位不变 */ /* 位3~位0为事务响应方式: 0000-就绪ACK, 1110-正忙NAK, 1111-错误STALL */

#define CMD_SET_ENDP5 0x1B /* 设备方式: 设置USB端点1的发送器 */ /* 输入: 工作方式 */ /* 位7为1则位6为同步触发位, 否则同步触发位不变 */ /* 位3~位0为事务响应方式: 0000~1000-就绪ACK, 1110-正忙NAK, 1111-错误STALL */

#define CMD_SET_ENDP6 0x1C /* 设置USB端点2/主机端点的接收器 */ /* 输入: 工作方式 */ /* 位7为1则位6为同步触发位, 否则同步触发位不变 */ /* 位3~位0为事务响应方式: 0000-就绪ACK, 1101-就绪但不返回ACK, 1110-正忙NAK, 1111-错误STALL */

#define CMD_SET_ENDP7 0x1D /* 设置USB端点2/主机端点的发送器 */ /* 输入: 工作方式 */ /* 位7为1则位6为同步触发位, 否则同步触发位不变 */ /* 位3~位0为事务响应方式: 0000-就绪ACK, 1101-就绪但无须应答, 1110-正忙NAK, 1111-错误STALL */

#define CMD_GET_TOGGLE 0x0A /* 获取OUT事务的同步状态 */ /* 输入: 数据1AH */ /* 输出: 同步状态 */ /* 位4为1则OUT事务同步, 否则OUT事务不同步 */

#define CMD_GET_STATUS 0x22 /* 获取中断状态并取消中断请求 */ /* 输出: 中断状态 */

#define CMD_UNLOCK_USB 0x23 /* 设备方式: 释放当前USB缓冲区 */

#define CMD_RD_USB_DATA 0x28 /* 从当前USB中断的端点缓冲区读取数据块, 并释放缓冲区 */ /* 输出: 长度, 数据流 */

#define CMD_WR_USB_DATA3 0x29 /* 设备方式: 向USB端点0的发送缓冲区写入数据块 */ /* 输入: 长度, 数据流 */

#define CMD_WR_USB_DATA5 0x2A /* 设备方式: 向USB端点1的发送缓冲区写入数据块 */ /* 输入: 长度, 数据流 */

#define CMD_WR_USB_DATA7 0x2B /* 向USB端点2的发送缓冲区写入数据块 */ /* 输入: 长度, 数据流 */

/* ************************************************************************** */ /* 以下命令用于USB主机方式, 只有CH375支持 */

#define CMD_SET_BAUDRATE 0x02 /* 串口方式: 设置串口通讯波特率 */ /* 输入: 波特率分频系数, 波特率分频常数 */ /* 输出: 操作状态( CMD_RET_SUCCESS或CMD_RET_ABORT, 其它值说明操作未完成 ) */

#define CMD_ABORT_NAK 0x17 /* 主机方式: 放弃当前NAK的重试 */

#define CMD_SET_RETRY 0x0B /* 主机方式: 设置USB事务操作的重试次数 */ /* 输入: 数据25H, 重试次数 */ /* 位7为1则收到NAK时无限重试, 位3~位0为超时后的重试次数 */

#define CMD_ISSUE_TOKEN 0x4F /* 主机方式: 发出令牌, 执行事务 */ /* 输入: 事务属性 */ /* 低4位是令牌, 高4位是端点号 */ /* 输出中断 */

#define CMD_CLR_STALL 0x41 /* 主机方式: 控制传输-清除端点错误 */ /* 输入: 端点号 */ /* 输出中断 */

#define CMD_SET_ADDRESS 0x45 /* 主机方式: 控制传输-设置USB地址 */ /* 输入: 地址值 */ /* 输出中断 */

#define CMD_GET_DESCR 0x46 /* 主机方式: 控制传输-获取描述符 */ /* 输入: 描述符类型 */ /* 输出中断 */

#define CMD_SET_CONFIG 0x49 /* 主机方式: 控制传输-设置USB配置 */ /* 输入: 配置值 */ /* 输出中断 */

#define CMD_DISK_INIT 0x51 /* 主机方式: 初始化USB存储器 */ /* 输出中断 */

#define CMD_DISK_RESET 0x52 /* 主机方式: 复位USB存储器 */ /* 输出中断 */

#define CMD_DISK_SIZE 0x53 /* 主机方式: 获取USB存储器的容量 */ /* 输出中断 */

#define CMD_DISK_READ 0x54 /* 主机方式: 从USB存储器读数据块(以扇区512字节为单位) */ /* 输入: LBA扇区地址(总长度32位, 低字节在前), 扇区数(01H~FFH) */ /* 输出中断 */

#define CMD_DISK_RD_GO 0x55 /* 主机方式: 继续执行USB存储器的读操作 */ /* 输出中断 */

#define CMD_DISK_WRITE 0x56 /* 主机方式: 向USB存储器写数据块(以扇区512字节为单位) */ /* 输入: LBA扇区地址(总长度32位, 低字节在前), 扇区数(01H~FFH) */ /* 输出中断 */

#define CMD_DISK_WR_GO 0x57 /* 主机方式: 继续执行USB存储器的写操作 */ /* 输出中断 */

/* ************************************************************************** */ /* 以下新增的V2.0命令码, 仅CH372A/CH375A支持 */

#define CMD_GET_IC_VER 0x01 /* 获取芯片及固件版本 */ /* 输出: 版本号( 位7为1, 位6为0, 位5~位0为版本号 ) */ /* CH375返回无效值为5FH, CH375A返回版本号的值为0A2H */

#define CMD_ENTER_SLEEP 0x03 /* 进入睡眠状态 */

#define CMD_RD_USB_DATA0 0x27 /* 从当前USB中断的端点缓冲区读取数据块 */ /* 输出: 长度, 数据流 */

#define CMD_DELAY_100US 0x0F /* 并口方式: 延时100uS */ /* 输出: 延时期间输出0, 延时结束输出非0 */

#define CMD_CHK_SUSPEND 0x0B /* 设备方式: 设置检查USB总线挂起状态的方式 */ /* 输入: 数据10H, 检查方式 */ /* 00H=不检查USB挂起, 04H=以50mS为间隔检查USB挂起, 05H=以10mS为间隔检查USB挂起 */

#define CMD_SET_SYS_FREQ 0x04 /* 设置系统工作频率 */ /* 输入: 频率 */ /* 00H=12MHz, 01H=1.5MHz */

/* ************************************************************************** */ /* 以下改进的V2.0命令码, 用于USB主机方式, 仅CH375A支持 */

/*#define CMD_SET_RETRY 0x0B*/ /* 主机方式: 设置USB事务操作的重试次数 */ /* 输入: 数据25H, 重试次数 */ /* 位7为0则收到NAK时不重试, 位7为1位6为0则收到NAK时无限重试, 位7为1位6为1则收到NAK时重试200mS, 位5~位0为超时后的重试次数 */

/* ******************************************

上面给你发了的程序是测试过了的,只需要将那部分程序放到你的主程序里面去就可以了


关闭文件的时候老出现0xB4的错误。

再说我这个程序改变片选去更新FlashData[]的值,然后再片选CH375送FlashData[]的值到mCmdParam.ByteWrite.mByteBuffer[]写进U盘。能不能行呢?

你们能不能测试每次这样改变一下片选,因为我的应用程序肯定得改变片选的。


如果是用总线的话,只要地址不冲突就没有什么关系,还有就是你是不是拿我们给你发的程序来测试啊?


我自己加的出错判断,我想判断出错的原因。

还有你们的程序测试过了吗?: strcpy( (char *)mCmdParam.Open.mPathName, "\\1.TXT); strcpy( (char *)( mCmdParam.Create.mPathName, "\\1.TXT" ); 编译不通过啊,所以我自己检查了一下: while(1) { // printf("wait disk in\n"); while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt(); // LED_OUT_ACT(); delay(200); for( i=0;i<5;i++ ) { delay(100); // printf(" Ready\n"); if ( CH375DiskReady() == ERR_SUCCESS ) break; } while (DesignFile.SectorProTime<128) { // printf("open\n"); strcpy((char *)mCmdParam.Open.mPathName, "\\1.TXT");

i = CH375FileOpen( ); if (i == ERR_MISS_DIR || i == ERR_MISS_FILE) { // printf("create\n"); strcpy( (char *)mCmdParam.Create.mPathName, "\\1.TXT" );

CH375FileCreate( ); }

else if (i==ERR_SUCCESS) { // printf("locate\n"); mCmdParam.ByteLocate.mByteOffset = 0xffffffff;

i = CH375ByteLocate( ); mStopIfError(i); }

// printf("write\n"); for (i=0;i<(MAX_BYTE_IO>>1);i++) { mCmdParam.ByteWrite.mByteBuffer[2*i+1]=0x55;//WORD_HI(FlashData[j+i]); mCmdParam.ByteWrite.mByteBuffer[2*i]=0x55;//WORD_HI(FlashData[j+i]); } mCmdParam.ByteWrite.mByteCount = MAX_BYTE_IO;//128 j = CH375ByteWrite( );

DesignFile.SectorProTime++;

mCmdParam.Close.mUpdateLen = 1; CH375FileClose( ); // printf("close\n"); } while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); //printf("take out\n"); }

我修改了几个编译错误,现在我完全按你们那个来,程序都运行到了while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); ,等待U盘拔出。此时拔下U盘,数据有时候没写完全,没有17K, 写完整的时候数据仍然有误码0x00。还有你们这个等待U盘拔出能不能不要呢?老在这等不好啊,我程序应该退出来做其他事情。


测试过了,没问题的.等待U盘拔出可以不用要得. 那你测试下你的RAM有没问题,将数据写进去,再输出来看下是不是写进去的数


不能完全写完的时候程序经常停在检测中断引脚的函数上,写的过程中也要判断中断引脚吗?


好,我试一下RAM


很奇怪,RAM测试没有问题,检测DesignFile.SectorProTime计数到了128。但是程序还是停在了 void xQueryInterrupt( void ) /* 查询CH375中断并更新中断状态 */ { while ( CH375_INT_WIR ); /* 如果CH375的中断引脚输出高电平则等待 */ // if (CH375_INT_WIR) return; xWriteCH375Cmd( CMD_GET_STATUS ); /* 获取当前中断状态,发出命令后至少延时2uS */ CH375IntStatus = xReadCH375Data( ); /* 获取中断状态 */ if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 检测到USB设备断开事件 */ else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 检测到USB设备连接事件 */ } 函数的while行。这是什么原因呢? 此时拔下U盘,在WINDOWS下打开。发觉文件已损坏,不能打开。


你可以这样看下,你用可以看U盘物理扇区的工具看下数据有没有写错,如果没有写错的话,那就说明没什么问题,最后打不开那只能是你最后的关闭文件的时候可能出了什么问题


什么工具,可以发我邮箱吗:个人信息保护,已隐藏

另外出了问题没,具体又是什么问题呢? 我想请问一下:数据误码的原因一般是什么?而且误码全部是0x00?

我刚检测了一下RAM,我在写之前这样检测的: for (i=0;i<(MAX_BYTE_IO>>1);i++) { mCmdParam.ByteWrite.mByteBuffer[2*i+1]=0x55;//WORD_HI(FlashData[j+i]); mCmdParam.ByteWrite.mByteBuffer[2*i]=0x55;//WORD_HI(FlashData[j+i]); } for (i=0;i if (mCmdParam.ByteWrite.mByteBuffer[i]!=0x55) { while(1); } } mCmdParam.ByteWrite.mByteCount = MAX_BYTE_IO;//128 j = CH375ByteWrite( );

仿真发觉程序并没有进去这个死循环。


给你返回的是0X00的话,就说明你的程序是操作成功的,库给你返回了0X00,如果返回的不是 0X00的话,那就说明你操作失败了,这段函数这样测试: for (i=0;i if (mCmdParam.ByteWrite.mByteBuffer[i]!=0x55) while(1); } 上面的主程序是做了测试的,往里面写是没有什么问题的,不过没在AVR单片机上面测试,是在51单片机上面测试的,但是对于库的操作流程实际上是一样的,如果还出现你说的那种情况的话,那我怀疑应该是你的硬件上面会不会出现问题


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