做的课题是单片机读写U盘:
单片机使用ATmega8,USB芯片使用CH375S.上次发贴询问无法检测到U盘,后来发现是USB
的D+和D-线接反了。。呵呵。
现在CH375能读写U盘(以扇区方式),但是读写时不稳定,有时会出现读写错误。
读写一个扇区的时候分8次,每次64个字节大小,
现在最致命的状况是这64个字节存在漏读(写)一两个字节,这样后面的数据的位置便依次
往前移一两个字节。。 /////////////////////////////////////////////////////// 本来初步估计应该是时序的问题,但无论单片机内读写CH375子函数怎么延时均会出现漏
读的现象,而且漏读的数据位置似乎是没有规律的。。
CH375用的晶振是12M的,两个电容用20P,换个晶振也还是一样。。单片机使用的是内部8M的
RC振荡,会不会是单片机内部的问题?
我还想问一点的就是CH375的#ACT端接的LED灯一直都不亮这算不算正常??
下面附上读写CH375的子函数:
/* *函数:void Wch375Cmd(cmd) *功能:模拟AD总线往CH375写一个命令字 *输入参数:无 *输出参数:无 */ void Wch375Cmd( Uint8 CMD ) { DDRB = 0XFF; //置B口为输出方式 delay_nus(2); ClrBit(PORTD,CS_375);//使能CH375 SetBit(PORTD,A0); //置命令方式 PORTB = CMD; //输出命令字 ClrBit(PORTD,WR); //写使能 DDRB = 0XFF; //延时 SetBit(PORTD,WR); SetBit(PORTD,CS_375);//取消使能375 DDRB = 0X00; delay_nus(2); }
/* *功能 : 模拟AD总线往CH375写一个8位数据 */ void Wch375Dat( Uint8 DATA ) { DDRB = 0XFF; ClrBit(PORTD,CS_375); ClrBit(PORTD,A0); PORTB = DATA; ClrBit(PORTD,WR); //写使能 DDRB = 0XFF; SetBit(PORTD,WR); //取消写使能 SetBit(PORTD,CS_375);//取消使能375 DDRB = 0X00; delay_nus(2); }
/* *功能 :模拟AD总线读取CH375一个8位数据(状态) */ Uint8 Rch375Dat( void ) { Uint8 temp; DDRB = 0X00; ClrBit(PORTD,CS_375); ClrBit(PORTD,A0); ClrBit(PORTD,RD); //读使能 DDRB = 0X00; temp = PINB; SetBit(PORTD,RD); //取消读使能 SetBit(PORTD,CS_375);//取消使能375 delay_nus(2); return temp; }
这些子函数的延时都改了N遍,从0.2us改到3us,4us都还是一样会出现漏读数据的现象。