关于单片机读取从U盘传输到CH375缓冲区的数据相关问题

请大家看一下我对读U盘数据步骤的一些理解对不对: 1.单片机首先发出要求读U盘数据的命令后,再连续分四次发出LBA地址 2.如果CH375收到从U盘上传输来的相关数据,CH375向单片机发出中断 3.单片机收到中断后发出要求读CH375中断状态的命令 4.单片机分析中断状态并确认有效后就连续分四次从CH375的缓冲区中读取数据并保存.

我的问题是:在第4步中,当单片机确认后,是连续地从数据总线上四次读数据并保存,在这期间,CH375怎么知道单片机已从数据总线上读走了数据,从而的下一个字节的数据发到数据总路线上的呢?

1、发完LBA地址之后,还得发需要读取的扇区数; 2、一个扇区分8次进行读取,每读取一次64个字节后,会发CMD_DISK_RD_GO继续读取; 具体如下:

/* 从U盘读取多个扇区的数据块到缓冲区 */ unsigned char mReadSector( unsigned long iLbaStart, unsigned char iSectorCount ) /* iLbaStart 是准备读取的线性起始扇区号, iSectorCount 是准备读取的扇区数 */ { unsigned char mIntStatus; unsigned char *mBufferPoint; unsigned int mBlockCount; unsigned char mLength; CH375_WR_CMD_PORT( CMD_DISK_READ ); /* 从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 = DATA_BUFFER; /* 指向缓冲区起始地址 */ for ( mBlockCount = iSectorCount * CH375_BLK_PER_SEC; mBlockCount != 0; mBlockCount -- ) { /* 数据块计数 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus == USB_INT_DISK_READ ) { /* USB存储器读数据块,请求数据读出 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从CH375缓冲区读取数据块 */ mLength = CH375_RD_DAT_PORT( ); /* 后续数据的长度 */ while ( mLength ) { /* 根据长度读取数据 */ *mBufferPoint = CH375_RD_DAT_PORT( ); /* 读出数据并保存 */ mBufferPoint ++; mLength --; } CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 继续执行USB存储器的读操作 */ } else break; /* 返回错误状态 */ } if ( mBlockCount == 0 ) { mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus == USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */ } return( mIntStatus ); /* 操作失败 */ }

至于最低层是怎么执行的,你得看UFI协议了。


就是这里: CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从CH375缓冲区读取数据块 */ mLength = CH375_RD_DAT_PORT( ); /* 后续数据的长度 */ while ( mLength ) { /* 根据长度读取数据 */ *mBufferPoint = CH375_RD_DAT_PORT( ); /* 读出数据并保存 */ mBufferPoint ++; mLength --; } 中的*mBufferPoint= CH375_RD_DAT_PORT(); mBufferPoint ++; mLength --; 单片机是根据之前所读数据的长度来连续循环从数据总线上读数据,那CH375是怎么知道一次循环中单片机已读了数据,再把下一个数据放到总线的呢?


实际是根据你的RD的上升延来判断下一个数据的准备,也就是说在芯片内部,前一个RD的上升沿做为后一个数据写到数据端口的一个标志,实际处理的时候可能比这个还要复杂点,这里只是一个简单的说明


谢谢啦


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