大侠们,请教一个问题,我的一个应用中使用了CH375B,但是感觉读速度很慢,读1M数据需要使用近4分钟。 我使用的是扇区读写方式,没有使用文件系统,读扇区也是一个接着一个的读出来的。 我使用的是ARM cortex m3 运行在50M速度上。 请教一下,这个读速度是否正常,CH375B在我这个情况下,理论上能将U盘读到多快? 最后还有一个问题,我手里有一个多功能读卡器,就是能同时插入很多种卡的读卡器,插到电脑上显示为4个盘符,但是CH375B无法操作它,返回的数据说是无法读写,无论我怎么设置逻辑单元也一样,这个请大侠也帮着告诉一下! 谢谢!!![size=6]文字[/size]
按照你的如果是M3的话,读U盘的速度应该可以做到500K字节/S,你可以去优化你读扇区函数以及三个读写子函数,至于你所说的多合一读卡器的话,你可以把你初始化那部分代码帖出来看下
与375的通讯接口是什么方式?硬件并口、模拟I/O,还是串口,1楼所说的速度必须是硬件并口才能达到
我使用的是流明的1138,直接使用它的8位GPIO 我贴一下我的读扇区函数 unsigned char mReadSector(unsigned char f[]) { unsigned char mIntStatus; // unsigned char *mBufferPoint; unsigned int mBlockCount; unsigned char mLength; unsigned int i=0; CH375_WR_CMD_PORT(CMD_DISK_READ); //发送命令 CH375_WR_DAT_PORT(total_sector[15]); //按照最小地址首先发送原则发送 CH375_WR_DAT_PORT(total_sector[14]); CH375_WR_DAT_PORT(total_sector[13]); CH375_WR_DAT_PORT(total_sector[12]); CH375_WR_DAT_PORT(0X01); //默认读取1个扇区 // mBufferPoint = DATA_BUFFER; /* 指向缓冲区起始地址 */ for ( mBlockCount = BlockPerSector; 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 ++; f[i]=CH375_RD_DAT_PORT( ); i=i+1; 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 ); /* 操作失败 */ }
接着贴一下初始化代码,基本上都是从例程里抄来的
unsigned char mInitDisk( ) { unsigned char mIntStatus, i; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ mIntStatus = CH375_RD_DAT_PORT( ); if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); /* USB设备断开 */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存储器 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出现错误 */ CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus != USB_INT_SUCCESS ) { /* 出错重试 */ mDelaymS( 200 ); CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ } if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出现错误 */
/* 可以由CMD_RD_USB_DATA命令将容量数据读出,分析每扇区字节数 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从CH375缓冲区读取数据块 */ i = CH375_RD_DAT_PORT( ); /* 后续数据的长度 */ if ( i != 8 ) return( USB_INT_DISK_ERR ); /* 异常 */ for ( i = 0; i != 8; i ++ ) { /* 根据长度读取数据 */ DATA_BUFFER[ i ] = CH375_RD_DAT_PORT( ); /* 读出数据并保存 */ } i = DATA_BUFFER[ 6 ]; /* U盘容量数据中的每扇区字节数,大端格式 */ if ( i == 0x04 ) BlockPerSector = 1024/CH375_BLOCK_SIZE; /* 磁盘的物理扇区是1K字节 */ else if ( i == 0x08 ) BlockPerSector = 2048/CH375_BLOCK_SIZE; /* 磁盘的物理扇区是2K字节 */ else if ( i == 0x10 ) BlockPerSector = 4096/CH375_BLOCK_SIZE; /* 磁盘的物理扇区是4K字节 */ else BlockPerSector = 512/CH375_BLOCK_SIZE; /* 默认的磁盘的物理扇区是512字节 */ BytePerSector = BlockPerSector*CH375_BLOCK_SIZE; /* 物理磁盘的扇区大小 */ CH375_WR_CMD_PORT( CMD_SET_PKT_P_SEC ); /* 设置USB存储器的每扇区数据包总数 */ CH375_WR_DAT_PORT( 0x39 ); CH375_WR_DAT_PORT( BlockPerSector ); /* 设置每扇区数据包总数 */ return( 0 ); /* U盘已经成功初始化 */ }
请各位大侠帮着看看,谢谢了!!! 我这个程序,在我这里读只能达到5KB/S
单片机主频和GPIO的速度是多少? 影响速度的是3个接口函数:CH375_WR_CMD_PORT、CH375_WR_DAT_PORT、CH375_RD_DAT_PORT,贴出来看看
我单片机的主频是50M,GPIO的速度实话讲不太清楚,由于使用的是固件库,库中也没有说明 //写入命令函数 void CH375_WR_CMD_PORT(unsigned char cmd) { GPIOPinTypeGPIOOutput(ch375_cmd,0xff); //设置PGE为输出,并且输出高电平
GPIOPinWrite(ch375_cmd,CH375_A0,0xff); //设置CH375为输入命令状态 GPIOPinTypeGPIOOutput(ch375_data,0xff); //设置PGA为输出 GPIOPinWrite(ch375_data,0xff,cmd); //输出命令
GPIOPinWrite(ch375_cmd,CH375_WR,0x00); //设置CH375写入命令
GPIOPinWrite(ch375_cmd,CH375_WR,0xff); // }
//写入数据函数 void CH375_WR_DAT_PORT(unsigned char data) { GPIOPinTypeGPIOOutput(ch375_cmd,0xff); //设置PGE为输出,并且输出高电平
GPIOPinWrite(ch375_cmd,CH375_A0,0x00); //设置CH375为输入数据状态 GPIOPinTypeGPIOOutput(ch375_data,0xff); //设置PGA为输出 GPIOPinWrite(ch375_data,0xff,data); //输出数据
GPIOPinWrite(ch375_cmd,CH375_WR,0x00); //设置CH375写数据
GPIOPinWrite(ch375_cmd,CH375_WR,0xff); // }
//读出数据函数 unsigned char CH375_RD_DAT_PORT() { unsigned char a; GPIOPinTypeGPIOOutput(ch375_cmd,0xff); //设置PGE为输出,并且输出高电平
GPIOPinTypeGPIOOutput(ch375_cmd,CH375_A0); //设置A0管教为输出 GPIOPinWrite(ch375_cmd,CH375_A0,0x00); //设置CH375为读出数据状态 GPIOPinTypeGPIOInput(ch375_data,0xff); //设置PGA为输出 GPIOPinTypeGPIOOutput(ch375_cmd,CH375_RD); //设置WR管教为输出 GPIOPinWrite(ch375_cmd,CH375_RD,0x00); //设置CH375写入命令
a=GPIOPinRead(ch375_data,0xff); //读出数据 GPIOPinWrite(ch375_cmd,CH375_RD,0xff); // return(a); }
优化这三个函数吧,速度太慢了.你可以自己测试一下,循环写数据,用示波器看看写一个字节需要多上时间,就可以计算出实际的速度了.
我通过提高主控频率,现在能够达到41KB/S,但是下一步提高,我也不知道该怎么办了,希望大家给个提示
对I/O的操作,直接操作相关寄存器,不调用函数,速度会提升一些