文件写入成功,但是有不希望的字符,请指导!

Uint16 WriteReqDataBlock(Uint08 *Buf)

{

Uint16 BlockLen,BlockLenBak;

SendCmdToCh376(WriteReqData);

BlockLenBak=BlockLen=GetCh376IntStatus();

if(BlockLen)

{

do

{

//SendOneByteToCh376(*Buf++);

SendOneByteToCh376('1');

}while(--BlockLen);

}

return(BlockLenBak);

}


void ByteWriteCh376(Uint08 *Buf,Uint32 Len)

{

Uint16 BlockLen;

SendCmdToCh376(Byte_Write);

SendOneByteToCh376((Uint08)Len);

SendOneByteToCh376((Uint08)(Len>>8));

while(1)

{

if(GetCh376IntStatus() == USB_DISK_WRITE)

{

BlockLen=WriteReqDataBlock(Buf);

SendCmdToCh376(Byte_Write_Go);

Buf = Buf + BlockLen;

}

else

{

CloseFile();

break;

}

}

}



如图

blob.png程序中写入的都是1,但是出现了不希望的字符,且每次请求都有不希望的字符出现。及时是新创建的文件,没有打开更没有写数据,也有一个不希望的字符。

文件大小不错,需要写入592个字节,PC上显示文件大小也是592个字节,但为什么有乱码呢?j_0064.gif


在PC上新建一个空文件,文件大小显示为0字节,占用空间0字节;而CH376新建的空文件,文件大小为1字节(有1个W字符,占用空间8192字节;为什么呢??


究竟哪出问题了呢?通过“SendOneByteToCh376('1');给CH376写数据内容是没错的,计数也正确,就是在每次“向内部指定的缓冲区写入请求的数据块”时前几个字节为乱码!!请求指点!谢谢!


GetCh376IntStatus()是怎么实现的?检测到INT的中断信号了吗?

强烈建议使用FILE_SYS.C文件。


回5楼,我也想可能是时序配合问题,其它产生中断并且需要读取中断状态的命令可以先判断INT状态,可WR_REQ_DATA命令不产生中断啊!


执行“SendCmdToCh376(WriteReqData);”命令后,读取状态返回的字节数是完全正确的!为什么写就有问题!


芯片是在网上买的,市场上有没有问题芯片在流通?谢谢!


字节写命令和字节继续写命令是有中断的,必须等中断。

可以用ch376.exe工具调试一下。

icon_rar.gifch376.rar



void ByteWriteCh376(Uint08 *Buf,Uint32 Len)

{

Uint16 BlockLen,Sta;

SendCmdToCh376(Byte_Write);

SendOneByteToCh376((Uint08)Len);

SendOneByteToCh376((Uint08)(Len>>8));

while(1)

{

while(INT376);

if(GetCh376IntStatus() == USB_DISK_WRITE)

{

BlockLen=WriteReqDataBlock(Buf);

SendCmdToCh376(Byte_Write_Go);

Buf = Buf + BlockLen;

Usb.FileCntLen += BlockLen;

}

else

{

CloseFile();

break;

}

}

}

这个函数里在读取中断状态前已经等待中断发生了!



8、关于CH376串口操作方式的注意事项。(部分用户会混淆中断检测的方式)

CH376串口操作时,INT引脚也是可选的。第一种情况是使用INT引脚作为中断检测引脚,也就是中断是通过INT引脚变为低电平来进入的,使INT引脚重新恢复高电平的唯一方式是执行GET_STATUS(0x22)命令读取“中断状态”。但是,在INT引脚变成低电平的同时,单片机串口也会接收到一个字节数据(中断状态),这个数据一般丢掉(清中断一般可以丢弃),使用0x22命令重新获取中断状态,同时恢复INT引脚电平。

第二种情况是不使用INT引脚作为中断判别标志的,而是使用上文提到的和INT引脚变低的同时串口收到的数据作为中断判别标志,即只要收到数据就说明中断到来(376的中断只会在确定的一些命令发下去之后产生或者拔插操作也会产生,所以中断产生的时刻是确定的,在那些时刻等待这个串口数据就可以了)。读到的这个数据可以作为中断状态直接返回,也可以丢弃,只作为一个中断到来的标志,使用0x22再次读取中断状态值。关于串口方式的这两种检测使用的详细代码参考CH376EVT资料包(UART_HW.C)

特别说明:例程中xWriteCH376Cmd函数中RI=0就是丢弃串口数据的一种方式。


暂时已经解决(用CPU串口接收中断接收的数据做判据,不用再一次读取CH376的中断状态),还是程序与芯片之间的逻辑时序配合不好造成的,有空还要继续找读取CH376的中断状态时序不合理的原因。


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