我用CH375的芯片+LPC2131,初始化已经没问题了,返回值为0,而且我用CHECK_EXIST测试过也没有问题,但是在我想进行删除一个文件的操作,或创建一个文件时,却总是不成功,请问问题处在哪里呢??
(1)不成功,那么CH375FileErase(),CH375FileCreate()的返回值是多少? (2)CH375DiskConnect(),CH375DiskReady()都过没?
如果测试命令没问题的话,那么库的初始化也应该没有问题,那么你就需要看下DISK-READY()这个函数返回的数据是多少?一定要在这个函数通过之后才能进行打开文件和删除文件,否则的话一定会不成功,在DISK-DEADY()这个函数操作成功的话,而打开文件不成功的话,那么你需要去测试下你的DISK-BASE-BUF这个缓冲区是否正常。
谢谢楼上两位的答复,我刚刚测了一下CH375DiskConnect()的返回值是0X00,CH375DiskReady()的返回值,是0X2C,包括CH375FileErase(),CH375FileCreate()的返回值都是0X2C。 请问我的问题应该是在哪里呢???
关注以下几点: 1,看下USB的4根线有没有接反,正确的接法为VCC,D-,D+,GND 2,USB口的供电是否充足,有些U盘的电压低于4。8V就开始不正常工作了,在3。3V的供电系统中,需要对U盘单独供电才可以。 3,USB口的UD+和UD-是否串接了电阻,如果串接了电阻,电阻一定要控制在5欧姆以内 4,注意USB口的UD+,UD-和芯片的UD+,UD-是否连接正常,在检测到设备之后,直接用示波器去探USB口的两根信号线(探头要打到*10的档),正常情况下,应该会出现周期为100NS做的方波。 5,命令与命令之间,命令与数据之间需要延时在1.5US,数据与数据之间需要0.6US,这个延时的时间太长的话,DISK-READY函数以及后面的函数都会出现问题,延时时间范围在10US以内
哦,谢谢楼上,VD+和VD-上要串接电阻么?我的USB的VD+和VD-上没有串接电阻,是因为我看到典型电路中没有电阻啊 还有我用示波器看了以下信号线,出现不规则的方波,周期都在180NS以上,是因为我没接电阻??? 还有如果我用函数来实现的话,命令与命令之间,命令与数据之间的延时应该都是在库函数里面做的吧,我能修改么? 请指点一下
(1)一般不用串,芯片内部自带 (2)上面的延时不在库中,在用户提供的三个读写子程序中,需要根据单片机的主频进行修改
修改了一下 错误码变成0x28了 崩溃了 我看。H里面的错误码0X2..都给省略了 ,请问我在哪里能看到啊??
首先你需要确定的几个问题,一个就是USB的4根信号线一定要确定完全正确,其次,在出现波形的时候,D-,D+上面都应该有才对,要是还不行的话,你可以拿下面的一断程序去测试下看可以不可以: UINT8 mInitDisk( void ) { /* 初始化磁盘 */ UINT8 Status,i,j=0; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ Status = CH375_RD_DAT_PORT( ); if ( Status == USB_INT_DISCONNECT ) return( Status ); /* USB设备断开 */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存储器 */ Status = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出现错误 */ while(1){j++; CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ Status = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( Status == USB_INT_SUCCESS ) break; /* 出现错误 */ /*这里需要加上这个之后才可以,正确的做法也是这样*/ CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 获取USB存储器的容量 */ mDelaymS( 250 ); if(j==5) return(Status); } for(i=0;i!=5;i++){ printf("Ready\n"); CH375_WR_CMD_PORT( CMD_DISK_READY ); /* 获取USB存储器的容量 */ Status = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( Status == USB_INT_SUCCESS ) break; /* 出现错误 */ CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 获取USB存储器的容量 */ mDelaymS( 250 ); } return( 0 ); /* U盘已经成功初始化 */ } 同时我们提供给你的头文件是不允许客户来进行修改的,如果修改出了问题的话那肯定是你软件上面的问题!!!
同时还有一个非常重要的就是375的晶振一定要是12M的,否则是操作不起来的
经过测试u盘没有初始化成功
我现在的是关于ARM和芯片的通信都没有问题 就是在芯片和U盘的通信上存在问题 还没有找到解决办法
在线等回答 能不能再给些建议啊!!
重新再确认一下 (1)先前提到的硬件部分是否没问题 (2)目前库中那个函数出错,代码是多少? (3)把完整地程序贴出来看看
硬件部分ARM和芯片的通信完全没问题,CH375GetVer( void );CH375Init( void ); CH375DiskConnect( ); 这几个函数都没问题,剩下的与u盘通信的函数就昨天都返回ox2c,今天都返回0x20,不知道怎么回事,还有就是 我用示波器看d+和d-都有方波出现,就是周期长一点,还有就是不是特别规则的方波 程序如下: #define Fcclk (Fosc * 5) //系统频率,必须为Fosc的整数倍(1~32),且<=60MHZ #define Fcco (Fcclk /2) //CCO频率,必须为Fcclk的2、4、8、16倍,范围为156MHz~320MHz #define Fpclk (Fcclk / 4) * 1 //VPB时钟频率,只能为(Fcclk / 4)的1、2、4倍
/* 以下定义的详细说明请看CH375HFM.H文件 */ #define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */
/* 单片机的RAM有限,其中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲 */ //#define DISK_BASE_BUF_LEN 4096 /* 默认的磁盘数据缓冲区大小为512字节,建议选择为2048甚至4096以支持某些大扇区的U盘,为0则禁止在.H文件中定义缓冲区并由应用程序在pDISK_BASE_BUF中指定 */ #define FILE_DATA_BUF_LEN 0x800 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */ /* 如果准备使用双缓冲区交替读写,那么不要定义FILE_DATA_BUF_LEN,而是在参数中指定缓冲区起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */
#define CH375_INT_WIRE ( IO0PIN & 0x200000 ) /* P0.1, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */ //#define EN_DISK_WRITE 1 #define NO_DEFAULT_CH375_F_ENUM 1 /* 未调用CH375FileEnumer程序故禁止以节约代码 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未调用CH375FileQuery程序故禁止以节约代码 */
#include "CH375HFM.H"
/* 有些ARM单片机提供开放系统总线,那么直接将CH375挂在其系统总线上,以8位I/O方式进行读写 */ /* 本例使用的LPC2114不开放系统总线,所以用I/O引脚模拟产生CH375的并口读写时序 */ /* 本例中的硬件连接方式如下(实际应用电路可以参照修改下述3个并口读写子程序) */ /* LPC2114单片机的引脚 CH375芯片的引脚 P0.21 INT# P0.4 A0 P0.7 CS# P0.6 WR# P0.5 RD# P0.15-P0.8(8位端口) D7-D0 */
void mDelay1_2uS( ) /* 至少延时1.2uS,根据单片机主频调整 */ { UINT32 i; for ( i = 10; i != 0; i -- ); /* 本例由于模拟I/O较慢故只需少量延时 */ }
void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { IO0SET |= 0x00010060; /* 设置CS,WR,RD默认为高电平 */ IO0DIR &= 0xFFDF00FF; /* 设置8位并口和INT#为输入 */ IO0DIR |= 0x00010070; /* 设置CS,WR,RD,A0为输出 */ }
void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { mDelay1_2uS( ); /* 至少延时1uS */ IO0CLR |= 0x0000FF00; /* 清并口输出 */ IO0SET |= ( (UINT32)mCmd << 8 ) | 0x00000010; /* 向CH375的并口输出数据, 输出A0(P0.4)=1; */ IO0DIR |= 0x0001FF70; /* 写操作所以数据输出, 设置CS,WR,RD,A0为输出 */ IO0CLR |= 0x00010040; /* 输出有效写控制信号, 写CH375芯片的命令端口, A0(P0.4)=1; CS(P0.16)=0; WR=(P0.6)=0; RD(P0.5)=1; */ IO0DIR = IO0DIR; IO0DIR = IO0DIR; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ IO0SET |= 0x00010070; /* 输出无效的控制信号, 完成操作CH375芯片, A0(P0.4)=1; CS(P0.16)=1; WR=(P0.6)=1; RD(P0.5)=1; */ IO0CLR |= 0x00000010; /* 输出A0(P0.4)=0; 可选操作 */ IO0DIR &= 0xFFFF00FF; /* 禁止数据输出 */ mDelay1_2uS( ); /* 至少延时2uS */ }
void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { mDelay1_2uS( ); IO0CLR |= 0x0000FF00; /* 清并口输出 */ IO0SET |= (UINT32)mData << 8; /* 向CH375的并口输出数据 */ IO0DIR |= 0x0000FF00; /* 写操作所以数据输出 */ IO0CLR |= 0x00010050; /* 输出有效写控制信号, 写CH375芯片的数据端口, A0(P0.4)=0; CS(P0.16)=0; WR=(P0.6)=0; RD(P0.5)=1; */ IO0DIR = IO0DIR; IO0DIR = IO0DIR; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ IO0SET |= 0x00010060; /* 输出无效的控制信号, 完成操作CH375芯片, A0(P0.4)=0; CS(P0.16)=1; WR=(P0.6)=1; RD(P0.5)=1; */ IO0DIR &= 0xFFFF00FF; /* 禁止数据输出 */ mDelay1_2uS( ); /* 至少延时1.2uS */ }
UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { //mDelay1_2uS( ); UINT8 mData; IO0DIR &= 0xFFFF00FF; /* 读操作所以数据输入 */ IO0CLR |= 0x00010030; /* 输出有效读控制信号, 读CH375芯片的数据端口, A0(P0.4)=0; CS(P0.16)=0; WR=(P0.6)=1; RD(P0.5)=0; */ IO0DIR = IO0DIR; IO0DIR = IO0DIR; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */ mData = (UINT8)( IO0PIN >> 8 ); /* 从CH375的并口P0.15-P0.8输入数据 */ IO0SET |= 0x00010060; /* 输出无效的控制信号, 完成操作CH375芯片, A0(P0.4)=0; CS(P0.16)=1; WR=(P0.6)=1; RD(P0.5)=1; */ mDelay1_2uS( ); return( mData ); } void InitSTDIO( ) { UINT32 x; PINSEL0 = PINSEL0 & 0xFFFFFFF0 | 0x00000005; // 设置I/O连接到UART0 U0LCR = 0x80; // DLAB位置1 x = (Fpclk>>4)/9600; // 9600bps U0DLM = x>>8; U0DLL = x&0xff; U0LCR = 0x03; // 8位数据位,1位停止位,无奇偶校验 //U0FCR = 0x01; } void transmitchar(char ch) { U0THR = ch; // 发送数据 while( ( U0LSR & 0x20)== 0 ); // 等待数据发送 }
/* 在P0.20连接一个LED用于监控演示程序的进度,低电平LED亮 */ #define LED_OUT_INIT( ) { IO0DIR |= (~0xefffff); } /* P0.0 高电平为输出方向 */ #define LED_OUT_ACT( ) { IO0CLR |= (~0xefffff); } /* P0.0 低电平驱动LED显示 */ #define LED_OUT_INACT( ) { IO0SET |= (~0xefffff); } /* P0.0 低电平驱动LED显示 */
/* 延时指定毫秒时间,根据单片机主频调整,不精确 */ void mDelaymS( UINT32 ms ) { UINT32 i; while ( ms -- ) for ( i = 25000; i != 0; i -- ); }
int main( ) { UINT8 i, c, SecCount; UINT16 NewSize, count; /* 因为RAM容量有限,所以NewSize限制为16位,实际上如果文件较大,应该分几次读写并且将NewSize改为UINT32以便累计 */ UINT8 *pCodeStr; LED_OUT_INIT( ); LED_OUT_ACT( ); mDelaymS( 100 ); /* 延时100毫秒 */ LED_OUT_INACT( ); CH375_PORT_INIT(); InitSTDIO(); xWriteCH375Cmd(CMD_RESET_ALL); i = CH375LibInit(); transmitchar(i); xWriteCH375Cmd(CMD_GET_IC_VER); i=xReadCH375Data(); transmitchar(i); i=CH375DiskConnect(); transmitchar(i); i = CH375DiskSize(); transmitchar(i); i=CH375DiskReady(); transmitchar(i); i = CH375FileCreate(); transmitchar(i); mDelaymS( 200 ); }
我把原来的例子程序改了一下,用来测试的