最简单的CH375读U盘 问题! 管理员和高手请进

最简单的CH375读U盘 问题! 管理员和高手请进 文字

#ifndef _CH375_H #define _CH375_H

#include

void CH375_WriteCmd(unsigned char cmd) // 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 { delay_us(2); // 2 CH375_OPEN_CMD_DDR; // A0=1 CH375_DATA_PORT=cmd; // 放好数据 CH375_DATA_PORT_OUT; // 方向输出 CH375_WRITE_CMD_OK; // A0=1 CS=0 WR=0 RD=1 delay_us(1); // 1 // 发出命令码前后应该各延时2uS,对于不快的单片机可以不需要延时 CH375_CLOSE; // CS=1 WR=1 RD=1 命令状态关闭 CH375_DATA_PORT_IN; // 数据方向输入 delay_us(1); // 1 }

void CH375_WriteData(unsigned char data) //向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 { CH375_DATA_PORT=data; // 放好数据 CH375_DATA_PORT_OUT; // 数据方向输出 CH375_WRITE_DATA_OK; // A0=0 CS=0 WR=0 RD=1 delay_us(5); // 1 CH375_CLOSE; //CS=1 WR=1 RD=1 命令状态关闭 CH375_DATA_PORT_IN; // 禁止数据输出 delay_us(1); // 1 // 延时 } unsigned char CH375_ReadData(void) //从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 { unsigned char d; delay_us(1); // 1 CH375_DATA_PORT_IN; // 数据输入 CH375_READ_DATA_OK; // A0=0 CS=0 WR=1 RD=0 delay_us(1); // 1 d=CH375_DATA_PIN; // 读引脚数据 CH375_CLOSE; // CS=1 WR=1 RD=1 命令状态关闭 return d;

}

unsigned char CH375_WaitInt( void ) //等待CH375中断并获取状态,主机端等待操作完成,返回操作状态 { unsigned char d; while(CH375_INT_PIN==0); CH375_WriteCmd(CMD_GET_STATUS); d=CH375_ReadData(); return d; }

unsigned char CH375_CheckData(unsigned char data) { CH375_WriteCmd(0x06); CH375_WriteData(data); data=CH375_ReadData(); return data; }

unsigned char CH375_CheckDisk(void) //等待U盘插入 产生中断 不停的检测状态 属于进入函数 { unsigned char Status; CH375_WriteCmd( CMD_SET_USB_MODE ); // 初始化CH375,设置USB工作模式 CH375_WriteData( 6 ); // 模式代码,自动检测USB设备连接 delay_ms(10); while ( CH375_WaitInt()!=USB_INT_CONNECT); // 等待U盘连接 CH375_WriteCmd(CMD_GET_STATUS); // 产生操作完成中断, 获取中断状态 Status=CH375_ReadData(); if ( Status != USB_INT_CONNECT ) return( Status ); //USB设备断开 return 0; }

unsigned char CH375_DiskIni( void ) // 初始化磁盘 { unsigned char Status; unsigned char i;

CH375_WriteCmd(CMD_DISK_INIT); // 初始化USB存储器 Status=CH375_WaitInt(); delay_ms(100) ; CH375_WriteCmd(CMD_DISK_SIZE); // 获取USB存储器的容量 Status=CH375_WaitInt(); if (Status !=USB_INT_SUCCESS) { for(i=0 ; i<10 ; i++) { CH375_WriteCmd( CMD_DISK_SIZE ); // 获取USB存储器的容量 Status=CH375_WaitInt(); if ( Status == USB_INT_SUCCESS) break; delay_ms(100) ; //这里很关键 必须延时 } } if ( Status !=USB_INT_SUCCESS ) return( Status ); //USB设备断开 return 0; }

endif

芯片的管脚 定义随便 我使用了 mega8 mega162 都可以读到255个扇区 [Emot]27[/Emot]

是不是因为CH375_WriteData( iSectorCount ); iSectorCount最大只能是255. 要想读出大于255个扇区要多次读如:每次读个iSectorCount =100


我错了,我也没有实现,只读出了9个扇区


CH375_WriteData( )这个函数每次写入一个字节的数据,也就是0--255;即使定义了unsigned int iSectorCount,最多一次也只能是读取255个扇区。


你单片机的晶振是多少啊?顺便把延时子函数帖出来,延时太长了也可能出问题。


谢谢 两位 我突然有了新的发现 我今天晚上 是是 我在给你们答复 !

谢谢 大家


我已经 严格修改了程序 ! 按照datasheet 的要求修改了 !

可是还是不行 大家请看新的 程序 ! 结果还是 读 255次 我晕啊 !

这是怎么回事那 ?

hcn { M } 硕研一年级 你到那去了 给我指点一下好吗 ?


CH375_CLOSE; // A0=1 CS=1 WR=1 RD=1 命令状态关闭 应该为A0=0,CS=1,WR=1,RD=1


还有一个问题就是大小端的问题,你将上面的读函数按照小端的格式修改下看可以不可以读


han 如果按你说的 可是 我可以读出好多啊

就是以后不能读了

开始能读 说明CH375_CLOSE 正常啊 ! 我觉得 CS=1 WR=1 RD=1 ch375 已经失效了 A0 的状态应该不用去管 啊

hcn 我就是冲你来的 你帮帮我 谢谢


hcn 你的 QQ 是多少啊 ?286708537 我的

我加你行吗 ?

还有就是 你说的小端 我不懂 你在说明白点好吗 ? 谢谢

我的QQ 每天都在线上 我等你啊


可以这样解释,即使你反写了的话,应该是可以读0-255,当读256扇区的时候,实际应该是进位,这个时候如果大小端错误的话,有可能导致你要读的扇区数超过了U盘本身具有的扇区数,例如一个U盘只有10000个扇区,而你下面要读的扇区数却是第20000个扇区,那你说还可以不可以读出数据来,当然,这只是一个比喻而已。


哦 知道了

你有QQ 吗 能加我吗 我能跟你学到东西 加我吧


你看一下每次读的时候,CH375_ReadSector这个函数返回的c是多少,若c不是0而是0X1F的话,就有可能是你所要读的扇区数过大,超出了U盘最大扇区数了。


luoye268268你用我的程序测试过吗


不是,我用的是51单片机,不过把大小端换过来,也就是把iLbaStart的高低位反过来试了一下。 不过如果起始扇区号iLbaStart大于U盘最大扇区数的话,可能会返回0X1F。


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