1、如果是在没有单片机的情况下,进行简单的I/O输入输出,那么可以参考CH341的资料,CH341不需要单片机就能独立工作,可以提供串口、并口、兼容IIC或I2C的2线接口、兼容SPI及JTAG的4线接口、5线接口等,可以提供多个GPIO通用I/O,可以用于控制低速模数转换AD、DA、数字I/O、I/O扩展等。
2、如果是单片机/DSP等与计算机相连接,也就是USB设备方式的应用,那么参考CH372的资料。可以下载CH372+CH451评估板/演示板的资料CH372EVT.ZIP,有PDF文档和例子程序,例如,评估板说明及USB设备应用参考CH375451,参考电路和PCB,小数据量交互传输/应用层中断演示的例子DEMO,含MCS51单片机C程序和汇编程序,批量数据传输的例子BULK测试速度,USB外置固件的C和汇编例子XFIRM,VC/VB/BC/DELPHI的例子等。另外,可以下载CH37X在计算机WINDOWS下的简单调试工具CH372DBG.ZIP,其中有MCS51单片机上位机与下位机的C源程序,PC机程序可以通过USB对MCS51进行简单仿真和控制,其中的C程序稍作修改就可以用于其它单片机。调试工具DEBUG372可以用于调试和检查下位机的程序。
3、如果是单片机/DSP等控制其它USB设备,也就是USB主机方式的应用,那么可以参考CH375的资料。如果是读写U盘并且用量较少或者是系统集成,关心快速入门并且简单易用,那么可以参考半成品U盘文件读写模块的说明CH375HM.ZIP;如果是做原始产品设计,关心成本,那么可以参考CH375评估板资料CH375EVT.ZIP,其中有单片机读写U盘的例子和U盘文件级子程序库的API说明;如果是单片机控制USB打印机等,或者CH375与CH372等其它USB产品通讯,可以参考USB主机方式应用参考CH375HST.ZIP。在设计USB-HOST电路和PCB之前,强烈建议参考CH375的设计注意事项README.PDF。
*关于电源
优先使用5V电源,CH37X在5V电源时的性能高于3.3V,可以作为工业级使用。
对于USB-HOST应用,建议参考CH375的设计注意事项README.PDF,要考虑USB带电插拔的实际情况。
样板中的电阻R1(串在USB电源与本板电源之间)是为了便于双电源供电,防止两个电源电压不同冲突。如果仪器本身有电源,或者不需要计算机双电源供电,那么可以去掉该电阻。
*单片机无法与CH372或者CH375进行通讯,例如CMD_CHECK_EXIST不成功或者CMD_SET_USB_MODE返回错误
通常是硬件问题,例如:
1、CH375没有时钟,可能是晶体不良未振荡,电容或者晶体漏电,CH375的时钟必须是12MHz。
2、CH375没有成功复位,可能是RSTI引脚没有0.47uF上拉电容,也可以用单片机I/O口或者uP监控电路为其提供复位,注意CH375的RSTI引脚内部有下拉电阻。对于CH372应该确保电源完全放电后再通电。
3、CH375的片选地址译码错误,例如,与RAM地址范围冲突
4、数据总线或者读写线连接错误等
5、用CMD_CHECK_EXIST命令测试硬件问题,该命令必然返回数据,如果返回数据不是0FFH,那么通常是数据总线连接错误,这种问题容易处理,可以根据返回的值分析是哪个数据线有误。
如果返回数据是0FFH,那么可能CH375不正常,例如,无时钟、未复位、读写片选线有误、工作于串口方式等,如果复位期间CH375的TXD引脚是高电平,那么CH375工作于串口方式,当然并口操作无效
*测量CH375的晶体振荡时好象不振荡
为了降低EMI,CH375的振荡为接近正弦波,所以振荡相对较弱,而一般单片机的振荡接近方波,振荡较强但是电磁辐射大很多。当测量仪器接入CH375的引脚时,由于引入电容,在3.3V电源电压时容易导致CH375停振,当去掉测量仪器时通常会恢复。如果是在3.3V电源电压下,建议使用有源晶振或者外部振荡,或者将XI引脚的电容换为10pF。振荡后XO引脚的电压在一半电源电压附近。
*连接到计算机没有反应
当单片机控制CH37X执行CMD_SET_USB_MODE命令,选择模式2后,首次连接计算机,计算机就应该提示找到新硬件,否则应该检查CH37X是否正常工作(看前面的问题)。如果确认单片机端没问题,那么可以用万用表测量CH37X的UD+和UD-引脚,也就是USB信号线,应该UD+为3V以上,UD-为0.4V以下,否则说明CH375未工作或者未收到CMD_SET_USB_MODE命令,只有模式1和2会导致UD+上拉到3V电压以上。
*连接到计算机,无法安装驱动,提示未知设备
1、CH375的GND以及单片机的GND必须与USB的GND可靠地连接,USB的VBUS/+5V可以不连接。
2、USB的D+和D-信号线接反,导致通讯失败,USB线4个,分别是+5V,D-,D+,GND,顺序不能错。
3、USB信号线必须用标准的USB线,不能用普通排线等代替,D+和D-布线要平行,附近铺地减少干扰。
4、由于CH37X内置了USB电阻,所以外部电路中D+和D-不需要串电阻,如果一定要串也不能大于5欧姆。
5、如果是5V工作电压,CH37X的V3引脚必须与VCC断开,如果是3.3V工作电压,那么V3应该连接VCC。
6、建议调试初期不要设置USB-ID,也就是单片机不要执行CMD_SET_USB_ID命令,等调通后再尝试修改。
如果单片机执行CMD_SET_USB_ID命令,那么必须在CMD_SET_USB_MODE之前执行。如果单片机执行CMD_SET_USB_ID命令修改了USB-ID,那么必须同步修改驱动程序INF中的ID才能安装驱动。
*计算机成功安装驱动程序,但是无法进行任何USB通讯
通常是单片机未收到或者未处理USB中断,驱动的安装与初始化是由CH372和CH375内置USB固件实现的,不需要单片机的任何干预,而USB数据通讯需要由单片机收到USB中断并由程序实现
*在与计算机连接时,为什么不能对单片机进行程序单步调试
标准的USB传输都是时间限制,单步调试容易导致USB超时,尤其在外置固件模式下,更容易超时。
解决方法是,用CH375作为USB-HOST,代替计算机单步调试您的USB设备,CH375可以不超时。
*如何用一个CH375实现USB-HOST和USB-DEVICE
CH375的串口连接只支持USB-HOST,所以必须通过8位并口与单片机连接。由于CH375自身没有主导权,只能在单片机的控制下,切换为主机或者设备模式,所以单片机应该决定是主机还是设备,具体可以参考USB电路及PCB设计注意事项README中的说明,在CH375评估板资料中,EXAM0是主从切换应用的例子。
*关于应用层USB中断服务的特点
CH372的动态锭接库DLL提供了伪中断服务,实际的中断服务仍然是在驱动程序库完成的,只是在完成后向DLL发了个通知,由DLL再调用伪中断服务子程序。由于涉及到系统层与应用层切换以及线程切换,所以中断频率不能太高,如果太高,虽然驱动程序能够收到中断,但是等到通知到应用层,再调用客户的伪中断服务程序,最慢可能需要10毫秒,从而在应用层丢失中断。自己写驱动可以提高响应速度。
*关于USB传输速度
CH372/CH375与计算机通讯时,默认的CH37X驱动程序和DLL提供的API是同步I/O而非异步I/O,所以API返回就说明该API执行完成,由于WINDOWS要提前安排USB帧调度,所以两次USB传输之间的间隔总是会大于1mS,例如传两个64字节的包可能需要2mS,而传一个256字节的包可能只需要1mS。这种情况可以通过修改驱动程序在驱动程序层传输数据或者用异步I/O解决,注意异步I/O在API返回时不代表该API完成。
计算机单次收发的数据块越大平均速度越快(单次最大4KB),CH372/CH375实测传输速度最高为400K字节每秒(在10秒内连续测试的平均值),但是实际应用考虑到留些余量,考虑到应用程序在收发数据之外还要分析处理数据,通常应该按200K计算。USB作为串行总线,采用包传输的方法,实时性不如PCI总线,PCI能达到微秒级,而USB的响应时间只有几百微秒到几毫秒,在驱动程序中实现的性能要好些。
*如何做WINDOWS驱动程序,WINDOWS DDK如何获得
我们的驱动程序全部使用WINDOWS 98/2000/XP DDK编译,同时支持WINDOWS 98/ME/2000/XP。DDK可以从微软官方网站免费下载(订购芯片时如果需要我们也可以提供刻录光盘),除此之外,只需VC 5.0或者VC 6.0编译器,完全不需要额外软件支持。这样做出的驱动程序代码效率高并且文件短小,通常我们用INF安装信息文件而不是SETUP可执行程序,可以算是绿色软件。用户如果希望有更友好或者更简单的编译方法,那么可以使用第三方的驱动程序生成工具,当然,那些软件通常都不便宜。
对于非WINDOWS驱动程序,可以参考其它USB设备的驱动源码修改,大多数USB设备的枚举、初始化过程都是一样的,区别仅在于端点/管道:CH372/CH375除端点0外有三个端点,地址分别是02H、82H、81H,依次为主输出BULK-OUT/64字节,主输入BULK-IN/64字节,辅输入INTERRUPT-IN/8字节/1mS,通常只用前两个主端点,一个从计算机输出到CH375,一个从CH375输入到计算机。
*数据采集中,单片机如何设计USB程序
简单的做法是,单片机开两个64字节的缓冲区,主程序定时采集数据,累加到第一个64字节缓冲区中,当第一个缓冲区满时,使用CMD_WR_USB_DATA7命令上传64字节,然后主程序切换到第二个缓冲区继续采集数据,当第二个缓冲区满时,首先检查上次的上传是否成功(上传成功会收到CH37X的中断),如果成功则继续上传64字节,如果不成功,说明计算机应用程序没有来取走数据(正忙或者未执行采集程序),那么可以忽略或者另行处理(提示计算机未连接)。该方法不使用中断,但是需要计算机不断地来读取数据,实际的计算机程序可以设置USB读取超时,防止在单片机不上传数据时计算机一直等待。
*设计的计算机端应用程序在读写USB时有时会死机,而计算机的其它程序一切正常
1、这种死机实际上是计算机端程序以为下位机会收发数据,而实际下位机没有,导致计算机一直等待。
一般情况下,在计算机与单片机的应用层应该有一定的约定:如何传数据、传多少、什么时候传、双方如何同步,如果双方没有约定好,那么可能出现甲方以为乙方会传而乙方未传则会导致甲方一直等待。最佳的解决方法是,设计良好的程序结构和双方约定,确保不出现上述的“以为”,另外再辅助以超时解决方法,超时解决方法是,甲方收发数据,如果乙方正忙,那么甲方只等待一定时间而非一直等待。新版的驱动程序都支持超时CH375SetTimeout,如果设置超时为200毫秒,那么超过200毫秒收不到数据,甲方也不会一直等待下去,但是主程序应该分析这种情况是什么原因。建议超时值大于正常情况下最大传输时间的2倍以上,最小要有数毫秒,因为计算机忙时正常传输时间也会增大。
2、类似情况还有,应用程序调用API准备接收80字节,而单片机只打算上传64字节,那么在计算机收到64字节之后,因为不足所需要的80字节,所以继续等待后面的数据。原因是,USB传输最大包是64字节,所以单片机上传64字节不能说明后面没有数据(真正的80字节传输是先传64再传16)。
解决方法是,单片机在64字节之后再上传0字节,当计算机收到0到63字节时,认为后面没有数据(因为USB最后一个包的长度才可以少于最大包长度64),从而不管应用程序需要多少字节而提前退出接收。
3、另外还有一种失误,单片机程序在收到上传成功中断后未解锁CMD_UNLOCK_USB,导致CH372/CH375拒绝处理后面的USB传输,而计算机程序不知道,会一直等待下去,除非超时退出。
4、如果要求的传输速度不高(小于20K字节每秒),那么可以参考CH37X调试工具中的调试程序,它使用单个数据包的请求加应答方式,每个回合的USB操作都是计算机发下去一个命令包(含数据),然后单片机返回应答包(含数据),因为双方约定有序,所以理论上绝对不会出现死机情况。
5、默认情况下的DLL是同步操作I/O,所以打开设备的同一句柄handle同一时候只能用于一个API,如果同时有多个API使用同一个句柄则会导致阻塞。如果应用程序的多个线程都需要调用DLL的API,那么必须使每个调用者分别使用各自的句柄handle,可以在主线程中OpenDevice后,用GetDeviceName获取设备名称,然后由各线程调用CreateFile分别打开USB设备获得各自的句柄,再用于API调用,
*单片机是否要对USB传输的数据进行校验
USB传输本身是带CRC16校验的包传输,CH375自动检查CRC16,如果它检查通过,那么实际出错概率非常之低,如果CH375检查CRC16未通过,那么它会和计算机约定重传几次直到CRC正确,所以正常情况下单片机不需要考虑数据校验和数据重传。
*关于丢数据、计算机调用API返回出错、数据错误等
1、丢数据通常是这样,上位机准备读取5个字节,而下位机上传8个字节,那么CH372的DLL及驱动程序在收到8个字节后,只将应用程序所需的5个字节返回,而丢弃后面3字节。
2、正常情况下USB传输不会出错,如果返回错误通常是USB设备断开、USB传输超时(超时太短)、或者单片机程序有误,写入无效的数据长度等(例如向端点2写入长度65等)。
3、数据错误通常是这种情况:应用程序未检查API返回时USB传输的实际长度,以为有足够数据返回,可能实际上没有,当然缓冲区中的数据是无效的。例如,应用程序准备读取512字节,而单片机只上传200字节,那么API返回时的实际长度只有200,如果应用程序不检查该长度而以为是500,那么就会认为后面的数据错误。类似情况是USB超时太短,计算机接收到一半时因为超时提前返回,长度不足。
*想自己做U盘、做定制功能的USB鼠标等
使用CH372、CH375的外置固件模式,外置固件模式下与市面上大多数USB接口芯片的使用方法差不多。我们网上可以提供自己动手做U盘的全套低成本方案/源程序/样品等。做USB鼠标也有源程序供参考。
*单片机通过CH375能否从其它带USB端口的仪器中采集数据?能否操作其它USB设备、例如USB打印机等
理论上可以,实际上有个条件,就是必须了解被操作方的USB传输的具体细节,例如通过哪些端点收发数据,数据的格式是怎样的。例如,USB打印机是符合USB类规范的,所以USB传输的细节是公开,当然能够进行USB传输操作,但是如何打印出文字还需要了解打印描述语言。对于带USB端口的仪器,因为通常都不符合类规范,所以需要知道其传输数据的端点和数据格式,才能采集数据,否则即使通过某端点接收到数据,也不知道是什么数据,所以关键是被操作方必须公开USB传输的资料,同一厂家当然没问题。
*与计算机USB通讯有时不稳定
有3种原因,一是时钟不稳定,二是时钟受干扰,三是USB信号受干扰。这三种情况通常与电路及PCB设计有关,尤其是时钟电路的GND、USB芯片的GND、电源退耦电容的GND之间尽量缩短连接,具体说明请参考USB芯片的电路及PCB设计的注意事项README.PDF。
CH375和CH372常见问题的解决:
1:问:U盘插在板子上,然后上电,工作正常。板子先上电,然后插U盘,板子检测不到U盘插上和拔除。
答:该问题是由于U盘插上时,电源对U盘供电,电源电压产生波动,导致CH375复位,不产生中断引起的。可以在USB口上的电源和地之间接一个大于200UF的电解电容。
2:若要使用3.3V电压对CH375供电,要求VCC和V3引脚接3.3V,与CH375相连的处理器的电压也要是3.3V,除USB口的D+、D-外,任何与CH375相连的引脚都必须是3.3V的。
3:问:当在我没启动CH375设备模式时居然插在算计上能找到USB设备,不过不能装驱动。
答:如果这种情况属实则是CH375没有正常复位。
4:问:我用LPC的单片机作模拟IO口时做输入时不正确。
答:用模拟IO时序要掌握好,IO口作输入时要往口上写入1。
5:问:C8051F单片机可不可以用你们的U盘读写的库函数,
答:可以,不过C8051F大部分是单周期指令,所以要考虑速度,应用的时候要注意MOVX指令的时间周期,(61就可以了);或者用我们的第5个库,读写CH375靠用户自己设定。
6:问:是不是可以用CH375作主机CH372作从机进行通讯,并且不处理描述符?
答:可以。
7:问:直接写入U盘的数据为何不能格式化掉?
答:这牵扯到文件格式,对于现代格式化都是高级格式化(软盘除外),格式化就是将引导区的文件信息删除,对于存在存储器的具体文件可能还在原处。用一些工具是可以看到文件的存在的。所以对于直接写入的数据计算机就有可能不理会。这就是你所说的删除不掉。这不会对使用U盘有影响。如果想格式化掉可能需要重新分区。
8:问:我的U盘插上为什麽出现错误91?
答:这是因为库不支持你的U盘格式建议你重新格式化。格成FAT16或者FAT12。
9:问:我的U盘写入时为什麽在写入64K是可以,写入90K时长度变成20多K呢,
答:我们定义的长度是16位的,当自动修改长度时只能识别64K之内,当长度超过64K时要手动修该长度,或者重新定义长度为32位。
10:问:下位机每次通过端点2上传4字节,为什麽上位机有时候会收到一串其他数据?
答:这要看你写的具体程序。下位机每次发过一组数据后,没有查看上位机是否接收就发第2组。假如第一次还没被上传就写入了第二组,数据被覆盖掉。
11:问:为什麽我在用CH375直接读取U盘设备描述符时会读取不成功,而其他向U盘初始化等命令能成功。
答:第一是否设置模式。第二是否设备插上来延时充分。第三在给U盘操作时要对U盘复位一次,再操作。因为有的USB设备自己没有复位功能,要依靠外界各其复位后才能工作。PC机给所有刚插上来的USB设备都是先复位总线再操作的。CH375中的初始化U盘命令也是先复位总线再操作的。
12:问:在用CH375做HOST时,使用内部U盘读写固件操作U盘进行扇区操作均正常,但是当用程序进行SETUP过程时出现问题,程序执行过程:
a.初始化CH375芯片:复位芯片,发送测试命令,发送设置工作模式(0x06)命令,等待USB设备连接。
b.USB设备连接产生中断后,发送获取设备描述符命令,此时CH375返回中断状态字为0x20,无论USB设备是U盘还是摄像头均出现此错误,运行环境:CPU:89S52,11.0592Mhz,附源程序。
答:错误码20H说明目标USB设备应答超时,可能原因有:
a、目标设备尚未正常工作,例如未连接,或者已连接但未初始化好
解决方法,确认连接后再延时数百毫秒
b、通讯错误,例如,晶振频率不准(电容不符),非标准USB信号线
解决方法,1、调整硬件,2、用SET-RETRY命令带参数25H、8FH增加重试次数
c、目标USB设备连接时瞬时电流太大(降低了电源电压),导致CH375不正常,
解决方法:分开供电,或者为USB设备串入限流电阻或者电感
d、CH375操作时序不佳,导致数据不稳定,例如CMD与DATA之间不足2.5uS等
另外,您若是用I/O引脚模拟并口读写的,要考虑在模拟到一半时出现中断的情况,
如果关中断,又会影响速度。如果是51单片机,想省点I/O引脚,可以用MOVX@R0,A和MOVXA,@R0,这样P2口只用两个:CS和A0,其它随便用。
顺便unsignedcharu1_read_data(void)
{
unsignedcharch;
U1_A0=0
U1_CS=0
P0=0xff//放在RD=0之前更安全,否则如果之前P0输出0,CH375输出1会短路
RD=0//CH375开始输出数据
P0=0xff//原来的这一行就当延时吧,因为RD=0到CH375输出数据要20纳秒
ch=P0
RD=1
U1_CS=1;
returnch
}
13:问:341可以单独控制外部设备吗?
答:341的开发就是考虑在没有处理器使用的,假如要控制剧电器或者发光管,只要用CH341+74HC273就可以了。