用文件系统库初始化的问题[求助]

我用的430单片机,调用430的库CH375HFF.R43,初始化函数CH375LibInit返回值为0X81,不为0,这是怎么回事?用单独的命令测试、读U盘的容量都没问题。[Emot]1[/Emot]

请做测试命令检查硬件和时序是否正确. 你看以下编译器的版本是不是一致的,在CH375HFF.H头文件中.头文件的位置和我们例子程序要一样.不要放在前面. 检查磁盘缓冲区是否有效.如果以上问题排除的话, 主要是以上问题导致.


CH375LibInit返回值为0X81,原因一般是硬件连接错误和读写时序不准确。库初始化没通过,那么单独作测试命令,读容量也不应该通过。 测试命令一般要做2次: (1)第一次发送数据0x55,返回数据应为0xAA (2)第一次发送数据0xAA,返回数据应为0x55


测试、读容量都没有问题。只是我在测试命令和读数之间需要延时几毫秒,如果延时时间短就得不到正确的结果,不知道什么原因?


那么应该是时序上的问题,命令与数据之间需要1.5uS的延时,数据与数据之间需要0.6uS的延时,三个读写子程序中需要加上这些延时试试。


都有延时程序,且都满足要求。


只是在发送命令和读数之间需要延时几毫秒。命令与数据之间需要1.5uS的延时,数据与数据之间需要0.6uS的延时都有保证。


(1)程序编译时有没有异常的警告 (2)把完整的程序贴出来看看


延时几个MS时间太长了,这样会影响后面的读写速度.你仔细检查一下你的读写子程序,I/O的方向设置有没有问题.初始化过不了就而且返回0X81代表硬件有问题.


文件系统库对爱国者U盘能不能识别?


void xWriteCH375Cmd( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ usdelay(20); UTCTL1|=TXWAKE; // 发送地址位,375第9位为1时写命令 TXBUF1=cmd; while((UTCTL1&0X01)==0); usdelay(20); } void xWriteCH375Data( unsigned char c ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ UTCTL1&=~TXWAKE; //第9位为0时写数据 TXBUF1 = c; while((UTCTL1&0X01)==0); usdelay(20); /* 因为MCS51单片机较慢所以实际上无需延时 */ }

unsigned char xReadCH375Data() { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ usdelay(20); /* 因为MCS51单片机较慢所以实际上无需延时 */ return( RXBUF1 ); }

/* 等待CH375中断并获取状态 */ unsigned char mWaitInterrupt() { /* 主机端等待操作完成, 返回操作状态 */ while(P2IN&0X01); /* 查询等待CH375操作完成中断(INT#低电平) */ xWriteCH375Cmd( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ delay(10); //如果不延时几毫秒得不到正确状态 return( xReadCH375Data( ) );

} unsigned char mInitDisk( ) { unsigned char mIntStatus, i; xWriteCH375Cmd( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ mIntStatus = xReadCH375Data( ); if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); /* USB设备断开 */ xWriteCH375Cmd( CMD_DISK_INIT ); /* 初始化USB存储器 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出现错误 */ xWriteCH375Cmd( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus != USB_INT_SUCCESS ) { /* 出错重试 */ delay( 500 ); xWriteCH375Cmd( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ } if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出现错误 */

/* 可以由CMD_RD_USB_DATA命令将容量数据读出,分析每扇区字节数 */ xWriteCH375Cmd( CMD_RD_USB_DATA );usdelay(10); /* 从CH375缓冲区读取数据块 */ xWriteCH375Cmd( CMD_RD_USB_DATA ); i = xReadCH375Data( ); /* 后续数据的长度 */ if ( i != 8 ) return( USB_INT_DISK_ERR ); /* 异常 */ for ( i = 0; i != 8; i ++ ) { /* 根据长度读取数据 */ usdelay(150);//如果不延时得到的数据是错误的,为什么? DATA_BUFFER[ i ] = xReadCH375Data( ); /* 读出数据并保存 */ } }


测试过一些该品牌的U盘,可以识别。 不知道你遇到哪款不支持


智慧棒2.0 128M


测试过一款爱国者智慧棒(UC-P100E 128M),文件系统完全支持 不知哪个步骤出错,出什么错?


调用430的库CH375HFF.R43,初始化函数CH375LibInit返回值为0X81,不为0,这是怎么回事?帮我看一下前面的程序有什么问题没有?


单片机在用串口操作CH375的时候,单片机的串口最好不要在做其他的事务,比如数据的检测之类的.


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