1、测试命令不能正常取反(CHECK_EXIST)。
需要从硬件和软件两个方面排查问题。
硬件方面:分析上电默认接口选择是否正确。例如,使用CH376S的SPI接口,硬件电路必须保证WR#,RD#引脚接地,PCS#,A0,RXD,TXD引脚悬空或接高电平,其他具体配置方法见CH37xDS1手册通讯接口章节;测量晶振起振情况,不起振尝试调节电容大小或换晶振;确保V3引脚在电源电压为5V时通过103电容接地,在3.3V供电时,直接连接到3.3V电源上;RSTI引脚是否符合该芯片上电复位的状态,例如CH376为高电平复位,所以RSTI一般需接103电容到VCC,该引脚也可以选择悬空。
软件方面:上电后芯片有复位时间,所以一般需要延时50~100ms后操作CH37x。对于串口模式操作,波特率是否正确,可用串口调试助手发命令测试(CH375较为特殊,9位数据位,只能用单片机等控制器发送测试命令,实际编程时也应注意该问题);对于SPI通讯接口,CH37x仅支持SPI模式0和模式3,命令与数据之间需要保留2us延时,数据与数据之间需要保留1us延时。命令开始前拉低CS,命令相关的数据发/收结束后拉高CS,即CS拉低后的第一个数据代表的是命令码;对于并口通讯方式,检查软件时序、总线地址是否有误,软件模拟的并口,注意IO方向切换。
2、关于U盘插入检测不到连接的解决办法
检测失败返回值,如果主机模式已设置,插入U盘会产生中断状态0X15,拔出会产生中断状态0X16。如果CH376/CH378执行0x30命令,如果U盘已连接产生0x14中断状态,如果U盘未连接产生0x82中断状态;如果测试命令、模式设置都已通过,检查设置的模式能否自动检测连接?(一般设置成已启用的主机方式,自动产生SOF包模式);测试D+、D-信号线,对于全速、高速设备,总线空闲时D+是高电平,D-是低电平,低速设备D+ D-电平与之相反;另外,还可以U口加电容或外供电方式以防止某些U盘功耗比较大导致CH37x供电不稳甚至芯片复位的情况。
3、执行DiskReady()或者DiskMount() (0x31)不通过的解决办法
USB设备接入后,需至少延时100ms,等待设备供电稳定后,才可执行磁盘初始化命令;当前模式是否正确,是否在操作U盘或SD卡模式,对于U盘,设置为主机产生SOF包模式;读出失败返回值,此命令是芯片首次和U盘之间进行数据传输,此问题一般是硬件原因,U盘的供电上可尝试采用5V外部供电或者USB口并接大电容;检测USB信号线是否接反(线序是VCC D- D+ GND);建议可参考给我司提供的README.pdf文档(官网搜索“README”下载 /download/README_PDF.html),里面提供了USB口设计要求;循环执行“DiskMount()”,抓一下D+,D-信号波形,观察是否规整,可以先去掉USB口的ESD保护器件;更换U盘测试。对于SD卡,如果返回0x82错误,检查SD_SDI(输入),SD_SDO(输出)是否接反。
4、SPI通讯模式下,收发数据一致,常见的有返回0x22等数据
SPI通讯模式下,命令的开始需要拉低CS,命令的结束需要拉高CS,如果不清楚命令什么时候结束,命令是否产生中断,请详细看CH37XDS1手册的“命令”章节。命令码与数据之间的时间间隔需要保证2微秒,数据与数据之间的时间间隔需要保证1微秒。执行像0x30,0x31等这一类有中断产生的命令,必须要等中断产生后,才可执行磁盘状态检测命令(0x22)。
5、创建文件成功(0x14),但是在电脑上不可见。
首先确认文件名格式保证是正常的短文件名(长文件名方法必须参考例程):文件名<=8字符,必须全部大写,扩展名<=3字符,也必须全部大写。
使用CH376能否读取自己创建的文件内容或者电脑创建的短文件CH376能否打开?发0x01命令读取芯片版本是否是低版本(小于0X43),如果是低版本,设置文件名之前是否设置一些内部变量?(详见FILESYS.C文件的CH376SetFileName函数)。(对于某些参考编程指南写的用户往往会忽略这一点,所以建议用户都直接使用已提供的应用层函数FILESYS.C,免去大量开发时间,并且这个文件也很成熟,不需要任何修改就可以添加到工程直接使用)。
6、创建文件成功(0x14),但是在电脑上看到乱码或者打不开文件。
重点检查文件名,是否符合短文件名规范。短文件名的文件名长度不超过8字节,后缀不超过3字节,并且由英文大写字母、数字、下划线等组合。
7、写文件之后,文件长度只有一个字节。
是否执行文件长度刷新操作,常用的文件长度刷新有两种,可以执行关闭文件,同时指定参数为1,或者调用CH376ByteWrite(buf, 0, 0 )或CH376SecWrite(buf,0, 0) (使用前者还是后者取决于使用字节写还是扇区写,不可混用);如果已经执行了文件长度的刷新,但是文件长度仍是1,那么可能是部分盘的写入缓存导致的文件刷新操作没有执行到,所以可以另外执行额外的操作,例如创建文件再删除或者打开文件等操作。
8、关于CH376串口操作方式的注意事项。(部分用户会混淆中断检测的方式)
CH376串口操作时,INT引脚也是可选的。第一种情况是使用INT引脚作为中断检测引脚,也就是中断是通过INT引脚变为低电平来进入的,使INT引脚重新恢复高电平的唯一方式是执行GET_STATUS(0x22)命令读取“中断状态”。但是,在INT引脚变成低电平的同时,单片机串口也会接收到一个字节数据(中断状态),这个数据一般丢掉(清中断一般可以丢弃),使用0x22命令重新获取中断状态,同时恢复INT引脚电平。
第二种情况是不使用INT引脚作为中断判别标志的,而是使用上文提到的和INT引脚变低的同时串口收到的数据作为中断判别标志,即只要收到数据就说明中断到来(376的中断只会在确定的一些命令发下去之后产生或者拔插操作也会产生,所以中断产生的时刻是确定的,在那些时刻等待这个串口数据就可以了)。读到的这个数据可以作为中断状态直接返回,也可以丢弃,只作为一个中断到来的标志,使用0x22再次读取中断状态值。关于串口方式的这两种检测使用的详细代码参考CH376EVT资料包(UART_HW.C)。
特别说明:例程中xWriteCH376Cmd函数中RI=0就是丢弃串口数据的一种方式。
9、枚举USB设备过程返回0x20,0x24,0x28,0x2C错误
以上错误统称为“设备响应超时,设备没有返回”。检查USB通讯速度是否匹配,检测方法参考375/6主机代码。对于获取描述符还可以使用GET_DESCR(0x46)命令尝试。其他解决方法参考第三点“执行DiskReady()或者DiskMount() (0x31)不通过的解决办法”。
10、模拟USB设备时枚举出现问题
代码中不可以有过多的打印信息,防止未能及时响应PC而导致PC将其挂起,当然也不可使用硬件单步调试;看BUSHOUND软件能否抓到一些数据包辅助调试(可能会抓不到,但是可以把要模拟的设备放到电脑上抓一些包,仿照收发包流程并模拟设备的响应);进入中断后都需要缓冲区解锁(参考提供的示例代码)。
11、测试命令抓包数据(20MHz时钟,发送0x65,返回0x9A)
CS信号需要在发送0x06命令码之前拉低,读取到数据0x9A数据之后拉高。发送命令码0x06之后一般需要延时2us发送数据0x65,之后延时1us读数据0x9A。
12、把CH376EVT代码从C51驱动移植到其他MCU。
主要需要修改4个函数的实现形式,分别是xWriteCH376Cmd、xWriteCH376Data、xReadCH376Data、Query376Interrupt,可以使用串口、并口、SPI接口,其他的如延时函数、打印函数等也需要修改。推荐直接使用FILE_SYS.H提供的文件操作函数,不建议修改FILE_SYS.C文件。
13、关于并口操作CH375、CH376、U盘模块、CH4XX等芯片,读写数据出错的可能原因。
首先,如果有逻辑分析仪或示波器最好抓取数据线、AO、CS、WR、RD信号线,然后对照手册时序图参数调整时序。其次,可能因为MCU与芯片供电电平不匹配,同时共地不可靠导致数据不稳定(时好时坏)。可以增加共地线、匹配信号线电平(可以调整单片机IO输出模式,如开漏输出+外部上拉方式;切换CH37X供电电压)、读信号拉高后立刻采数据、读信号对地加pF级电容尝试。
注:CH37X 参考示例代码 /bbs/thread-65122-1.html