我用Labview编写的上位机软件发送和收到的数据长度好像都是对 的,可是发送下去的数据是错误! CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ length = CH375_RD_DAT_PORT( ); /* 首先读取后续数据长度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收数据包 */ 上面的语句是贵公司提供的“CH372+CH451的评估板说明和USB设计参考”中的TEST里面的。 读到的length 是正确的,可是buffer[ ]数组里面的数据是错误的。是不是取数组里面的数据有讲究呀? 请多多指教!! 谢谢
用bushound软件抓一下数据包看看
需要设计参考资料(光盘资料可以参考FILELIST.TXT文档,网上资料更新) 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、这种死机实际上是计算机端程序以为下位机会收发数据,而实际下位机没有,导致计算机一直等待。 一般情况下,在计算机与单片机的应用层应该有一定的约定:如何传数据、传多少、什么时候传、 双方如何同步,如果双方没有约定好,那
二楼的兄弟,你好! 我下了那个软件,可就是不会用。 你看一下,我上传的那个图是怎么一回事呀? 谢谢!
问题终于解决了,原来是我上位机那边的数据类型和下位机的类型不一致,因此才读不到数据! 不过还是谢谢,上面帮助我的朋友!