[原创]CH375S芯片读写时个别数据丢失??

做的课题是单片机读写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都还是一样会出现漏读数据的现象。

按照下面的时序你测试下看可以不可以: void Wch375Cmd( Uint8 CMD ) { delay_nus(2); SetBit(PORTD,A0); //置命令方式 PORTB = CMD; //输出命令字 DDRB = 0XFF; //置B口为输出方式 ClrBit(PORTD,CS_375);//使能CH375 ClrBit(PORTD,WR); //写使能 DDRB = 0XFF; //延时 SetBit(PORTD,WR); SetBit(PORTD,CS_375);//取消使能375 ClrBit(PORTD,A0); DDRB = 0X00; delay_nus(2); }

/* *功能 : 模拟AD总线往CH375写一个8位数据 */ void Wch375Dat( Uint8 DATA ) { delay_nus(2); PORTB = DATA; DDRB = 0XFF; ClrBit(PORTD,A0); ClrBit(PORTD,CS_375); ClrBit(PORTD,WR); //写使能 ClrBit(PORTD,WR); //写使能 ClrBit(PORTD,WR); //写使能 SetBit(PORTD,WR); //取消写使能 SetBit(PORTD,CS_375);//取消使能375 DDRB = 0X00; }

/* *功能 :模拟AD总线读取CH375一个8位数据(状态) */ Uint8 Rch375Dat( void ) { Uint8 temp; delay_nus(2); DDRB = 0X00; ClrBit(PORTD,A0); ClrBit(PORTD,CS_375); ClrBit(PORTD,RD); //读使能 ClrBit(PORTD,RD); //读使能 ClrBit(PORTD,RD); //读使能 ClrBit(PORTD,RD); //读使能 temp = PINB; SetBit(PORTD,RD); //取消读使能 SetBit(PORTD,CS_375);//取消使能375 ClrBit(PORTD,A0); return temp; }


试过了。。

还是一样,延时全换成3US也还是一样,,

而且这种漏读不是说每次都会出现,有的时候第一次读取的是正确的,但第二次重新读取时却会漏掉一两个字

节。


那你在把延时加大点试下看可以不可以


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