usb逻辑单元号问题!

1.在我发送命令0AH和数据38H后,返回的是0x00,请问在、返回的这个最大逻辑单元号正确吗? 2.在我发送命令28H后,会去读数据,但为什么只能读出数据长度,得到的数据长度是0x40,第二次读就一直等待? 请帮帮忙!困扰我一天了,谢谢![Emot]1[/Emot][Emot]1[/Emot]

(1)如果这个设备只有一个逻辑单元的话,那么返回值是正确的 (2)能读取到长度之后,数据就已经在CH375芯片内部了,不需等待的,你的程序怎么写的


1.请教一下逻辑单元怎么知道是多少? 2.读取了数据长度,下面不是要把数据从375读出吗?它是在读第一个数据时就开始等待了!我用的是你们的库函数,程序我也改不了啊!


观察主控芯片的UART状态寄存器发现:不时的会出现帧错误,溢出错误。是不是我的串口通信有问题啊?


(1)就是通过0AH命令来获取的 (2)用了什么库?如果是库的话,不需要你去发读命令的 (3)读命令成功后,CH375会主动发送数据,如果没有及时去取,是会溢出的,把375的三个接口函数贴出来看看


void xWriteCH375Cmd( uint8 mCmd ) { uint32 i=1; UART1_SendByte(mCmd); for(i=0;i<25;i++) delay2us();

}

void xWriteCH375Data( uint8 mData ) { //uint32 i=1; UART1_SendByte(mData); delay2us();

}

uint8 xReadCH375Data( void ) { uint8 xd; xd = UART1_GetByte(); //读取XD0~7 delay2us(); return xd; }


这是主函数,在执行i = CH375FileCreate( ); 时这条指令出会读数据,但读不出来! int main (void) { UINT8 i, c; UINT8 *pCodeStr; //for(i=0;i<5;i++) mDelaymS( 100 ); /* 延时100毫秒 */ gpio_init(); //IO初始化 mDelaymS( 100 ); /* 延时100毫秒 */ i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ mStopIfError( i ); while ( 1 ) { while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘插入 */ mDelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */

for ( i = 0; i < 10; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */ mDelaymS( 100 ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ }

#ifdef EN_DISK_WRITE /* 子程序库支持写操作 */ /* 产生新文件 */ strcpy( (char *)mCmdParam.Create.mPathName, "/NEWFILE.TXT" ); /* 新文件名,在根目录下,中文文件名 */ i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); pCodeStr = (UINT8 *)"Note: \xd\xa这个程序是以字节为单位进行U盘文件读写,单片机只需要有600字节的RAM\xd\xa"; while( 1 ) { /* 分多次写入文件数据 */ for ( i=0; i { c = *pCodeStr; mCmdParam.ByteWrite.mByteBuffer[i] = c; if ( c == 0 ) break; /* 源字符串结束 */ pCodeStr++; } if ( i == 0 ) break; /* 源字符串结束,完成写文件 */ mCmdParam.ByteWrite.mByteCount = i; /* 写入数据的字符数,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后写 */ i = CH375ByteWrite( ); /* 向文件写入数据 */ mStopIfError( i ); }

mCmdParam.Close.mUpdateLen = 1; /* 自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */ i = CH375FileClose( ); mStopIfError( i );

#endif

while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘拔出 */ mDelaymS( 200 ); } return 0; }


CH375DiskReady( ) 返回值是0 ,应该说明可以对u盘进行读写了吧,为什么不行呢,补充一下我用的库文件是375库文件中arm32里的CH375HF9.LIB,大侠帮忙分析一下!谢谢了!


CH375DiskReady通过说明可以读写U盘了,你的意思是不是FileCreate始终不退出么? (1)建议测试一下磁盘缓冲区DISK_BASE_BUF,先写入数据,再读出,比对是否相同 (2)三个接口函数中的延时要求精确点,命令后延时1.5uS,数据后延时0.6uS


在执行i = CH375FileCreate( )后返回0x82!但是ACT#显示u盘还在连接状态,灯是亮的! 命令后延时1.5us的话,375初始化都不成功!不知道为什么,加大延时到50us才可以! 我先测试一下磁盘缓冲区,非常感谢 SCM!


SCM,对DISK_BASE_BUF的写和读都是对的,执行到FileCreate()以后还是返回0x82,无语了!在论坛里看到好像这个问题一直没有解决啊!!


那估计你的三个读写子函数还是有点有问题,如果工作在串口方式下的话,写命令是需要位9位1的,还有就是三个读写子函数是不需要延时的


void xWriteCH375Cmd( uint8 mCmd ) { uint32 i=1; UART1_SendByte(mCmd); for(i=0;i<25;i++) delay2us();

}

对于这个函数我要怎么修改才能发送第九位呢?UART1_SendByte(mCmd);只能发送8位?


这个需要去看该单片机的串口配置


我用的是lpc2138芯片,附件有它的寄存器说明,寄存器最多只能配置数据位8位,还有没有其他的方法呢?200941611134751.jpg


可以用奇偶校验位来判断啊,发送命令的时候奇偶校验位强制为1,发送数据的时候奇偶校验位强制为0,首先要把串口设置成带有奇偶校验位模式.


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