无法写东西进U盘的问题

我用375串口连接单片机做USB主设备,连接入U盘可以读取数据,但尝试用命令DISK_WRITE 写数据到U盘的时候就收不到375的中断回复了,谁能帮忙看下,谢谢!!!

u8 mWriteSector( unsigned long iLbaStart, unsigned char iSectorCount , u8 * ubuffer ) { unsigned char mIntStatus ; unsigned char *mBufferPoint; unsigned int mBlockCount; unsigned char mLength ; //ÿ´ÎдÈë64×Ö½ÚµÄÊý¾Ý CH375_WR_CMD( CMD_DISK_WRITE ); CH375_WR_DAT( (unsigned char)iLbaStart ); CH375_WR_DAT( (unsigned char)( iLbaStart >> 8 ) ); CH375_WR_DAT( (unsigned char)( iLbaStart >> 16 ) ); CH375_WR_DAT( (unsigned char)( iLbaStart >> 24 ) ); CH375_WR_DAT( iSectorCount ); for ( mBlockCount = iSectorCount * CH375_BLK_PER_SEC; mBlockCount != 0; mBlockCount -- ) { mLength = 0x40 ; mIntStatus = mWaitInterrupt( ); if ( mIntStatus == USB_INT_DISK_WRITE ) { CH375_WR_CMD( CMD_WR_USB_DATA7 ); CH375_WR_DAT( mLength ); while ( mLength -- ) CH375_WR_DAT( *ubuffer++ ); CH375_WR_CMD( CMD_DISK_WR_GO ); } else break; } if ( mBlockCount == 0 ) { mIntStatus = mWaitInterrupt( ); if ( mIntStatus == USB_INT_SUCCESS ) return( 0 ); } return( mIntStatus ); }

你使用下面的程序看下可以不可以: /* 将缓冲区中的多个扇区的数据块写入U盘 */ unsigned char mWriteSector( unsigned long iLbaStart, unsigned char iSectorCount,unsigned char *mBufferPoint ) /* iLbaStart 是写入的线起始性扇区号, iSectorCount 是写入的扇区数 */ { unsigned char mIntStatus; unsigned int mBlockCount; unsigned char mLength; CH375_WR_CMD_PORT( CMD_DISK_WRITE ); /* 向USB存储器写数据块 */ CH375_WR_DAT_PORT( (unsigned char)iLbaStart ); /* LBA的最低8位 */ CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) ); CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) ); CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) ); /* LBA的最高8位 */ CH375_WR_DAT_PORT( iSectorCount ); /* 扇区数 */ // mBufferPoint = DISK_BUFFER; /* 指向缓冲区起始地址 */ for ( mBlockCount = iSectorCount *8; mBlockCount != 0; mBlockCount -- ) { /* 数据块计数 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus == USB_INT_DISK_WRITE ) { /* USB存储器写数据块,请求数据写入 */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向CH375缓冲区写入数据块 */ mLength = 64; CH375_WR_DAT_PORT( mLength ); /* 后续数据的长度 */ do { CH375_WR_DAT_PORT( *mBufferPoint ); mBufferPoint ++; } while ( -- mLength ); CH375_WR_CMD_PORT( CMD_DISK_WR_GO ); /* 继续执行USB存储器的写操作 */ } else break; /* 返回错误状态 */ } if ( mBlockCount == 0 ) { mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus == USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */ } return( mIntStatus ); /* 操作失败 */


试了还是不行, 就是在发完第一个64字节的数据后就卡在mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ 这句了,也就是收不到请求写数据的中断了,怎么回事呢?


求救啊


基本上可以理解为现在根本就不能写数据,前面的初始化磁盘有没有成功?U盘容量有没有获取到?一定要保证磁盘容量能获取.如果磁盘容量不能获取则发送R_SENSE命令后,延时100-200MS后重试获取磁盘容量命令,反复,直到获取. 你程序流程基本正确,可能问题出在U盘插上去后并没有准备好就去进行读写操作.造成失败.


可以获取容量,也能读出所有数据,就是写不进去,难道是你们的片子的问题? 应该不会吧,还有别的可能嘛?


谁来帮帮忙啊


你可以选择换一个U盘来测试下,需要看下你前面初始化的步骤看下有没有问题.


初始化后 读可以随便读的,就是不能写,初始化时有什么和写相关的操作嘛? 我换个U盘试试看


你是采用并口连接还是串口连接方式?如果是串口的话,建议你把波特率提高测试下看,如果是并口模拟时序的话,还是需要注意下模拟时序时的延时问题.


是串口方式,比特率是9600没改,是不是有影响?


波特率可以动态修改吗?我发了修改的命令,375没有回应, CH375_WR_CMD( CMD_SET_BAUDRATE ); CH375_WR_DAT( 3 ); CH375_WR_DAT( 204 );//改成115200 //adjust the uart2's bandrate also // UART2_ChangeConfig(); // DelayMs(1); for ( i = 0xffff; i != 0; i -- ) if ( CH375_RD_DAT( ) == CMD_RET_SUCCESS ) break; if ( i != 0 ) return 0 ; } return 1 ;


修改的位置时机有没有要求?急 啊~~~


在CH375和单片机正常复位之后,就可以改变波特率.在修改CH375的波特率后,需要你去修改单片机自身的波特率,使两者波特率一致,再去读取中断状态代码; 流程:修改CH375波特率->修改单片机自身波特率->读取态中断状


在你修改完波特率之后你可以不去读取状态而延时1MS之后修改自己单片机的波特率在做测试命令看可以不可以.


奇怪,修改波特率后通信只是偶尔能进行,大部分时间收不到375响应. 我一直修改执行读写命令的延时,偶尔能收到响应。。。


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