基于WIN32的USB逻辑分析仪
1、硬件和软件的一个win-32逻辑分析仪,采用多线程win-32前端和本地接口。当你的爱好是收集旧计算机(包括一些6800处理器上的老游戏机),逻辑分析仪证明了宝贵的诊断大量的问题。这个项目是一个混合的硬件,离散逻辑和微控制器和软件在汇编代码,vc + +。实际分析仪是从原来的文章“高速逻辑分析仪的视窗95”出现在12月97页46线路地窖弗兰西斯甲板。基本系统使用一种特殊的芯片(7204)这是双端口存储logic-state样品转移到一台电脑和显示使用win-32前端。原分析仪的硬件,建于1998,精选前端写在基础但有许多缺点,这种方法和系统“悬挂”如果一个无效触发通道选择。在这个更新项目(已超过十二岁,多次更新),一个多线程的win-32前端是书面允许良好的用户控制的硬件。该系统在这里显示功能、50 Ms /S的采样率,计算采样深度,触发系统开始采样的上升或下降沿的任何特定的渠道,信息和通信逻辑系列兼容,和一个高速串行接口。在前面的彩色提示插座对应的各个通道输入几个额外的辅助触发输入和输出插孔。一个屏幕截图的Win 32的前端分析仪(旧版本3.100)。8个痕迹都显示在宽显示屏(1024 * 768显示进行了优化)。下拉菜单让用户选择采样率,系统电压,触发源,以及其他参数。采样线程的状态显示在右下角的 - 这表明USB连接的状态以及。只有400个样本显示在屏幕上,但使用箭头键允许一个左/右平移显示在跟踪存储器的所有4096个采样。一个计划的升级(目前不完整的),是一个模式匹配的触发时,将启动跟踪八个输入模式匹配一个已知值(时非常有用的监测微处理器总线) - 目前的触发是在一个选定的通道只完成。硬件和固件:分析仪的关键因素是AM7204 FIFO芯片。这是一个双端口的4K RAM芯片有单独的读(QX)和write(DX)数据路径。每个数据路径也有一个地址计数器。要品尝到芯片的逻辑状态,首先复位/ RS线通过柜台和然后写在芯片上的时钟(/ W)提供时钟脉冲,在这点上写总线输入(DX)的逻辑状态存储到该芯片。当FIFO满时,一个“缓冲区满”信号(/ FF)。断言从芯片。为了从芯片中读取,芯片之一提供一个读时钟(/ R) - 对每个脉冲传输一个字节从内存中读总线输出(QX)。4095时钟脉冲一样的“写”的循环,需要读4096个字节。参考的AMD表(P / N 14430)芯片的全部细节和时机。虽然原始版本的功能通过PC的并行端口的FIFO芯片的直接控制,规定即使是在原来的版本升级到智能处理器:在一个阶段,有人甚至认为,以添加一个微控制器(可能的Z - 8日,当时)允许如一个DEC - 300系列彩色图形终端的接口。随着时间的进展,PC成为一个显而易见的选择,并在2000年年中,USB成为明显的(第一个暗示是我的新的笔记本电脑没有串行和并行连接:)。一个PIC18F4550微控制器通过USB接口与PC机进行通信和控制硬件的功能,包括采样时钟速率,读取时钟(从FIFO中读取存储的数据),并触发源。实际的采样时钟提供一个50MHz的晶体,分为许多频率使用74HCT4040 CMOS计数器(FIFO芯片的速度有限,早期版本中使用一个20MHz振荡器振荡器 - 最新版本的使用更快的“L12”芯片的运行速度比以前的版本)。这提供了以下采样率:50MS / S,12.5MS / S,3.125MS / S,780KS / S,195KS / S,48.8KS / S,和12.2KS /秒 重新布线的计数器输出(和使用不同的晶体振荡器),但这些比率是可以改变的选择,因为每个采样率比去年慢4倍。通过主界面分析仪,可放置在空闲状态,复位,启用进行取样,并从FIFO中读取的数据。闲置(非运行)的条件是使断言使行高(禁用时钟),复位线高,和读时钟线高 。复位的影响,再次触发的复位线低后高 。数据采样开始通过选择一个时钟速率(通过74HCT151复用器),并能够使该行低时钟-触发也可能首先选择使用 。最后,从FIFO中读取数据是通过再次复位FIFO芯片,读指针复位到零,切换放置到芯片的“Q”输出(数据从FIFO 读时钟,然后读取PIC)。最后一个计划的升级是一个模式匹配触发,可以实现使用一个74HCT688模式出现时,将触发采样(例如,当连接到数据总线和ASCII字母“A”{1000001}出现或几个匹配的条件使线必须同时发生)。对于模式匹配的触发,是计划上传的模式,以串行一个74HCT595锁存器使用控制线,然后匹配条件触发分析仪通过的第八通道(,使“通道”触发源不再可用) 。甚至可以使用“>”和“<”'688提供的条件作为触发源,以及如果需要的话(虽然迄今为止最有用的是“平等”的条件)。离散电路被修建了一个44针插头的原板与地平面上的噪音干扰的顶部。原板有几个,现在一个18F4550 40引脚微控制器的USB接口,和一个模式匹配触发几个离散逻辑芯片未来的扩展保留的区域填充未使用的区域。一个USB接口安装在后方已经到位的DB - 25接头(的DB - 25连接器,用于在版本1和2,是留在地方,事实上,仍然可以使用,如果单片机是从旁边它的插座)。完整的原理图,第4版,可以在这里找到( PDF格式)。一个RJ - 12连接器是永久地安装在允许使用一个ICD 2调试器的快速升级板... 连接器不使用时,只需断开和藏入的情况下。引脚RB6和RB7未使用的任何其他目的。一个74AHC573被用作一个输入缓冲器(允许3.3V操作),和两个继电器(RA0和RA1微控制器上的驱动)选择VCC(3.3V,默认情况下,或5V)和一个拉(至VCC)或下拉(地)对所有未使用的输入的功能。74AHC573是因为它有一个很小的传播测试延迟,可以从3.3V或5V操作,即使在3.3V可承受5V输入。实际的逻辑电平的定义,在3.3V它们对应于真正的TTL电平(理想情况下,0.8V和2.0V低的高是真正的TTL电平,但AHC573经营3V电源0.9V和2.1V相应水平 - 看到从恩智浦的摘录,前身为飞利浦,数据表的权利)。5V TTL逻辑是当选定为目标的供应水平,该芯片实际上是运行在Vcc = 3.3V真正的TTL兼容性,而且只有当CMOS 5V逻辑是选择是该芯片的VCC至5V(在这点芯片在1.65V和3.85V的逻辑转换,所以MOS兼容)。即使同一个3.3V的电源供应,输出的AHC573水平仍然是一个“高”(逻辑“低”输出0.1V最大),所以它仍然是TTL兼容的逻辑的2.9V最低,并能驱动的输入这是一个5V电源供电,如在电路中的74HCT573已经(或FIFO,直接为此事)供电电路中的其它芯片。请注意,只有74AHC573版本可以做到这一点伎俩:小贩管理队的版本(如逻辑分析仪使用以前的版本)是严格5V只有2.0V和0.8V的逻辑电平 - 选择逻辑系列(和考试的详情数据表)是这个项目的关键。一个共同的LD1086稳压器(TO - 220封装在)是用于3.3V稳压器 - 稳压器(+5 V是不是足够,以确保3.3V输出)为+9 V输入。至于速度,重要的是,所有的芯片速度不够快。现有74HC573AN一个40ns的典型传播测试延时,现有74HCT251N具有19ns的延迟。这是因为,在本质上,允许触发信号“赶上”在FIFO中的数据线的信号延迟573行为的良好局面。出于这个原因,新AHC573补充说,除了现有HCT573。最后,74HC4040N允许的额定功率为79MHz,因此在50MHz操作。18F4550的D港是从FIFO输入数据,在8位的并行格式(不再需要以前的版本中的半字节的74157多工器)。端口B处理控制线来设置采样率,使时钟和端口C处理触发源选择的控制线。基本USB固件开发利用是尼克Christoudoulou中断驱动的实施布拉德利门奇的汇编语言的USB框架 。18F4550是只有一个单一的控制管道(EP0)外,所有数据通过这个接口通过配置。从PC发送消息作为供应商的具体要求。wValue的另外一个命令,派出两个16位的参数(wValue的和索引) -在这个项目的情况下,包含分析仪(采样率,触发通道等)的配置信息。命令的定义如下:CMD_IDLE:空闲的硬件(采样)CMD_RESET:复位FIFO计数器和触发器FFCMD_START:启动与指定的参数在wValue的分析仪GET_FIFO_STATUS:返回一个字节描述的FIFO状态(满或空)GET_FIFO_DATA:检索8个字节的数据从FIFO争夺EP0缓冲区CMD_START命令接受一个单一的16位字,作为在该位分配如下参数:位D0 - D2的定义采样率(000 =分机,001 = 20M ... 111 = 4.9K)位D3 - D6定义的触发通道(0000 =免费,1-8 =通道#,9 =模式选择)位D7设置触发的边缘(0标志着从低到高边缘)位首长级薪级第8点定义VCC(0 = 1 = 3.3V,5V)D9位定义上拉或下未使用的输入(0 =上拉下来,1 =拉起)值从分析仪的PC发送的命令,参数是发送的wValue,这是从传入USB缓冲区摘录如下:MOVF USB_buffer_data + wValue的W,库存MOVWF ParmwValue1,库存在现实中,它是作为两个8位值中提取wValue的,因为实际上是一个从PC的16位数字。位,代表个人的价值观,然后提取。例如,位0-2的wValue的提取,然后发送到PORTB如下: ANDLW b'00000111 IORLW b'00111000';确保CLK / RST /使线保持高MOVWF PORTB的这段代码确保PORTB的3-5位保持较高水平,以禁用时钟。凡值是要发送的值写入到USB缓冲区,并设置发送缓冲区回PC的端点控制寄存器PC。在GET_FIFO_STATUS命令FSR0的情况下是第一次设置为指向的缓冲区EP0,FIFO芯片测试(PORTE的,FIFO_FULL线),POSTINC0设置为0x00或0x80到代表FIFO状态(因此,只有首先缓冲区中的8个字节,在这种情况下使用)。最后,缓冲区控制寄存器设置为发送8个字节UOWN位设置允许的USB SIE采取控制的缓冲区,并将其发送到PC(用于控制对缓冲区的访问,这是单位系统) :banksel伪BD0IBC MOVLW 0x08的MOVWF BD0IBC,编组8 MOVLW 0xC8 MOVWF BD0IST设置的字节数,库存;发送数据包DATA1,UOWN位只有8个字节的数据包发送回PC(最基本的USB允许)。较大的数据包可以被发送到提高trabsfer利率,但它只是似乎没有这样一个项目需要。已被枚举(发生这种情况后,PC会识别设备,通常是由伴随着“冰邦”的声音效果),并闪烁,表示设备已配置(即当一个LED指示与显示设备的一个常数的USB状态前端软件运行,实际上是打开USB通道的访问)。LED是唯一的任务,在主运行此相同的LED用作单位功率LED(所以,“权力”实际上是“状态”)。最新的4.0版本的汇编代码可以在这里找到 。也可以是旧的汇编代码3.1版 - “点一个”版本说明一个漏洞修正(在3.0版本中,我忘了进入空闲模式前读取数据的芯片,使数据被覆盖在读 )。使用小猎犬- 480协议分析仪的USB部分进行了核实。该项目是建立与MPLAB 7.50和8.43版本和一个链接脚本(18F4550)(8.xx 18F4550_g.lkr)。其他所需的文件包括18F4550.inc(MPASM汇编器)和两个包括从原来的框架文件。最近,我进入了一个 电路酒窖“杂志在比赛中,我获得了一个免费的小猎犬- 480 USB协议 分析仪的总相,公司,这是绝好的机会来尝试!该分析仪允许预期的设备描述符,地址,配置描述符,和字符串开始的PC机和PIC之间交换的所有数据。随后,人们可以“看到”的前端程序审讯FIFO的状态,并开始了数据传输 :正常操作显示如下:配置分析仪(触发通道等)和重置后,PC调查指数395以上,其中“获取FIFO的状态”命令(03)发送到PIC的FIFO的状态。个人电脑通常必须等待FIFO中很多这样的周期,但在这种情况下(指数400分之398)FIFO已满,所以0x80是在DATA1数据包返回。四百十分之四百〇八在索引和数据从PIC的问题“读FIFO”命令(04)在PC机上的前端程序发送到PC415分之413指数(在这里看到的所有8个字节为一组“ 01“ - 这是一个缓慢的方波仅在通道1)。电脑继续发出“读”命令和响应收到8个字节的数据从FIFO。数据被限制为8个字节,允许在任何速度传输数据端点EP0(低速模式是这里的限制因素)。出手后可以打开另一个管道(如EP1)在一个传输FIFO的全部内容,但是单管的简单的方法是使用在这里(因此Beagle分析仪解释为什么数据包从PC机的数据传输到PIC“设置事务处理“... ...通常一个预计数据通过不同的管道比EP0)。在调试过程中的逻辑分析仪。我上了一个周末,当我上楼趋向的烧烤,所以我只是堆在餐桌的设备和做的工作有需要,这个项目 - 你必须爱这些开发工具的简洁!左侧可见ICD 2调试器连接到逻辑分析仪本身。在中心的蓝色方块是比格尔USB分析仪和信号发生器的灰色方块。下载(仅适用于硬件部分):第4版PDF格式原理图旧版本的PDF格式 的说明:原理是在原理图中的错误:74HC573的缓冲区11引脚应连接到VCC,而不是地面)汇编代码4.0版(版本4.0和4.1)汇编代码3.1版(旧版本)软件内容:不断运行一个线程来处理实际的数据采集(即硬件和PC之间的接口)。线程的Win - 32前端(通过信号灯)的命令,开始数据采集。当FIFO满时,数据读入一个全局数组,一个消息发送到的Win - 32前端强制油漆和重绘屏幕(随着新的数据读取分析仪)。前端和线程之间的同步,那么,是通过一个信号和一个Windows消息(DATA_RDY)来完成。为了防止线程从“悬”一个未使用的触发通道被选中时,当前的触发通道,触发边缘,和采样率数据采集之前发生(之前,参数被发送到逻辑分析仪硬件)被立即保存。在等待为FIFO,这些参数(全球所有)相比,启动参数 - 任何改变,分析仪将复位和数据采集,将重新启动。然后,用户,始终保持采集线程的控制权,尽管它是在等待FIFO,以填补循环。基本算法,在数据采集线程运行,看起来像这样:(ParameterChange == TRUE){/ /保存启动参数检测数据采集过程中CurrentSampleRate =采样率的变化; CurrentTriggerChannel = TriggerChannel; CurrentTriggerEdge = TriggerEdge; ParameterChange = FALSE; / /发送START_ACQUISITION命令启动逻辑分析仪RET = usb_control_msg(.. CMD_START,...); / /用于FIFO等待填补 - 不要做一个双赢的32 PROC FifoFull = FALSE,这(FifoFull == FALSE)/ /输入(InputAddress)FULLFIFO){/ /检查FIFO的状态RET = usb_control_msg(...,GET_FIFO_STATUS,...);如果(缓冲[0] == 0x80的)/ /检查EP0缓冲区返回设备FifoFull = TRUE;(CurrentSampleRate! =采样率) {ParameterChange = TRUE;打破;}如果(CurrentTriggerChannel! = TriggerChannel){ParameterChange = TRUE;打破;}如果(CurrentTriggerEdge! = TriggerEdge){ParameterChange = TRUE;突破;}} / /当FifoFull} / /而ParameterChange一个线程的用处在这里是显而易见的:它不可能有一个循环,不断检查用户更改。人们有可能使用一个定时器来实现这一点,但是一个线程肯定是最方便的(代码已经实施以前的版本,所以需要加入的USB端口时,只有轻微的变化)。接下来,创建信号量同步线程:hSyncDAQ = CreateSemaphore(NULL,0,1,NULL);信号量是在主程序释放,导致线程暂停,直到通过WaitForSingleObject的“内螺纹本身释放。这样做的好处是,线程在等待时,不消耗CPU时间的丰富数量!这就要求该线程拥有信号量的处理 - 目前这是通过一个全局变量,但它可以传递给线程的线程创建时,因为的CreateThread允许的参数传递。在收到一个WM_COMMAND,参数,如采样率从菜单更新。当通过菜单选项中选择一个端口,硬件是在I / O地址,如果运作,数据采集线程开始检查 - 这可以防止试图访问不存在的硬件。测试硬件,系统设置为20MS / s采样率,自由运行(无触发),复位FIFO芯片是。缓冲器满线(低电平有效)应该是高的,因为缓冲区现在是空的(如果不是,硬件不能正常工作)。该分析仪是现在允许为1ms的运行。约在0.2ms的,将填充的缓冲区(4095时钟后)和缓冲区满线应该低 - 如果它是,硬件现被视为具有可操作性。顺便说一句,这是因为在Windows程序中插入一个“处于休眠状态(1)”命令的一个黑客位一般是不是一个好主意(尽管它是,至少可预见的,不会等待indefinetely)。因为这只是做了很少(只有当设置最初的端口),它是可以容忍的(虽然使用适当的Windows计时器也很可能是最好的“教科书”解决方案)。像往常一样使用Windows程序,所有的屏幕上绘制在WM_PAINT消息部分。被吸引到在本节线划分网格,绘制文本标签电网当前的系统参数,如采样率绘制在屏幕上,每个通道绘制的痕迹。绘画的痕迹是有点棘手,因为垂直线,必须在每个过渡绘制。后,整个屏幕是完全重绘,信号被释放,允许线程获得一个新的数据集绘制... ... 释放信号量只完成后,油漆,防止产生消息的速度比屏幕重绘他们的数据采集线程(它也发现有必要限制每秒线程倍的数量可以不管运行,以防止更新太形象很快,以防止被读取)。最新的更新程序,包括一个复制到剪贴板功能,使屏幕输出保存在任何图形程序。此前,用户需要按“PRTSC”键和粘贴图像图形软件包 - 复印功能,节省了这一步。其他附加功能包括平移通过使用箭头键,让所有4000个样本,以被视为样本的能力。在这个例子中的屏幕截图(4.1版)的时钟,数据和/片选线SPI接口(在一个dsPIC33FJ芯片上)在显示屏上看到。通道3显示变低,整个传输过程中的选线。通道1上的16个时钟都可见。2通道,显示的数据,代表{10000000}这是命令寄存器读“0”目标SPI设备(ADXL312加速度计芯片)。48.8KS / s的采样率,使整个比特流被视为但是只有前400个样本是可见的。通过改变采样率,将扩大和观点,使信号的细节可以看出,但是另一个有用的功能是平移...这两个屏幕截图显示了更快的195KS / s的采样率相同的比特流 使用平移功能(通过键盘的光标箭头),在左边的显示器显示的第400个样本,一个在右边接下来的400个样本(编号400至800)。在这种方式下,令人难以置信的细节就可以看出端倪,包括时钟和数据线(是否,例如,通道2上的数据通道1上的下一个时钟脉冲的上升沿之前属于低)之间的关键时序关系。USB接口USB接口使用的开放源码LIB - USB驱动程序从sourceforge.net(我已经在尝试使用通用的“usbser.sys”Windows附带的驱动程序来模拟一个虚拟的COM端口足够的挫折,除了创建LIB - USB驱动程序运动更快的传输速率)。从第二个版本的原代码被修改为带USB接口的使用,基本上相当于USB功能取代旧“INP”和“出”呼叫。首先,DLL(具体为Microsoft Visual C + +)是链接到项目以及USB.H文件,它描述了USB数据结构和函数 。访问USB设备,然后提供usb_control_msg功能。后的WM - CREATE,一个USB设备(它必须符合PIC固件使用,在这种情况下VID = 0x04D8和PID = 0x0004)返回一个“USB设备”处理的udev匹配指定的VID和PID代码搜索。然后,该代码设置配置,债权接口,调用下面的例子为从USB设备传输数据到/:RET = usb_control_msg(udev时,USB_TYPE_VENDOR | USB_RECIP_DEVICE,CMD_RESET,0,0,缓冲,0,100);这个调用发送设备供应商特定的命令“CMD_RESET”。缓冲区是在这种情况下,未使用的,是的wValue(参数#4),其中之一可用于将数据发送到USB设备。RET = usb_control_msg(udev时,0xC0,GET_FIFO_DATA,0,0,缓冲,8,100);这个调用的问题GET_FIFO_DATA命令。在调用完成后,将返回8个字节的“缓冲区”,从FIFO中有八个连续采样。该接口是非常简单的使用。下载完整的逻辑分析仪的C + +文件(版本4.1)在一个ZIP文件。第4版将与第3版的硬件(反之亦然),VCC选择功能根本无法使用。的第4版的USB驱动程序可以在这里找到(在一个ZIP文件) 。所需的文件包括一个INF文件以及几位司机。将文件解压缩到一个目录时,提示为驱动的设备连接时,在该目录中的文件(Windows将会找到所有需要的驱动程序有)看 。这些文件是项目上的libusb - Win32的0.1.12.0版本的子集sourceforge.net和提供简单的利益,只为当前版本的LIB - USB驱动程序,看在SourceForge上的更新。这是一个开源的项目涵盖GNU许可证等的驱动程序都是免费的 。要安装USB驱动程序,只需运行安装程序从SourceForge项目的libusb - win32的,过滤槽,0.1.12.2.exe,插入到您的电脑设备,并安装时,提示司机。要确保运行testlibusb.exe的程序包含驱动程序(在zip文件以及),并确保逻辑分析仪的出现有前试图运行的LogicAnalyzer可执行文件(用正确的VID和PID)。输出的libusb - win32的驱动程序提供的测试程序。逻辑分析仪是在这里看到,设备量0x004。USB设备indentified提前(以及输出的一部分,在这里看到)是一个存储钥匙插入到同一台机器上。如果驱动程序安装不正确,逻辑分析仪将总是回应一个错误(“没有匹配的USB设备”)。只要测试程序显示设备,它应该工作。启动逻辑分析仪后,你会看到一个红色的错误信息,在右上角的窗口loweer,直到该线程的启动和通讯建立后,该消息变成绿色,并指出采样线程准备。如果发生错误,详细说明错误的几个消息框后,会显示程序将坐在休眠处于非活动状态(它不会,但“挂”等,可正常终止)。Sidebar:USB DeMystified..USB can seem mystical, but with the benefit of a protocol analyzer (in my case a TotalPhase Beagle 480), allow me to present the process of USB transfers in a simplified manner by demonstrating how the logic analyzer accomplishes communications with a PC.The USB transfer process begins with enumeration in which the device is assigned an address by the host PC. Once detected upon plug-in, the PC sends the device a request for the device descriptor:Get Device Descriptor (64 bytes) SETUP 2D 00 E8 DATA C3 80 06 00 01 00 00 40 00 DD 94 ACK D2This request is directed to “device 00”, our logic analyzer which is unassigned right now. The device (analyzer) responds with a description. Even though 64 bytes (max) were requested by the PC, the device sends back only eight bytes as follows which describe the device as a USB 1.1 device with an 8-byte maximum packet size:IN txn 12 01 10 01 00 00 00 08The actual transfer looks like this through the protocol analyzer's eyes:Here we see the request from the PC for the descriptor and the 8-byte response from the PIC in our logic analyzer. The actual bytes sent are simply a table in the PIC as follows:db 0x12, DEVICE ; bLength, bDescriptorType db 0x10, 0x01 ; bcdUSB (low byte), bcdUSB (high byte) db 0x00, 0x00 ; bDeviceClass, bDeviceSubClass db 0x00, MAX_PACKET_SIZE ; bDeviceProtocol, bMaxPacketSize db 0xD8, 0x04 ; idVendor (low byte), idVendor (high byte) db 0x04, 0x00 ; idProduct (low byte), idProduct (high byte) db 0x00, 0x00 ; bcdDevice (low byte), bcdDevice (high byte)The PC now instructs the USB device to become address 1 with the following command (when first started, the device has no address assigned and so responds to address zero):Set Address (=01) SETUP 2D 00 10 DATA C3 80 05 01 00 00 00 00 00 EB 25 ACK D2The USB device now responds only to address 1. The PC now requests the device descriptor again (this time, from address 01 – seen in the setup portion of the packet sent from the PC as “2D 01”, and this time only 18 bytes are requested since the PC now knows the size of the descriptor packet from the first request):Get Device Descriptor (18 bytes) SETUP 2D 01 E8 DATA C3 80 06 00 01 00 00 12 00 E0 F4 ACK D2And the device responds with the entire 18-byte long descriptor in three packets (each with a maximum length of eight bytes):IN txn 12 01 10 01 00 00 00 08 D8 04 04 00 00 00 02 02 00 01Next, the PC requests the configuration descriptor which describes how the device is powered as well as the interfaces it contains. First, the PC asks for 9 bytes then for the descriptor again, this time up to 255 bytes in length:Once again, the descriptor packet is simply a series of bytes stored in a table in the PIC as follows which describes the interface including the class (in this case vendor, but in many cases a device may belong to a class such as communications or human interface devices such as a keyboard or mouse):db 0x09, CONFIGURATION ; bLength, bDescriptorType db 0x12, 0x00 ; wTotalLength (low byte), wTotalLength (high byte) db NUM_INTERFACES, 0x01 ; bNumInterfaces, bConfigurationValue db 0x00, 0xA0 ; iConfiguration (none), bmAttributes db 0x32, 0x09 ; bMaxPower (100 mA), ; bLength (Interface1 descriptor starts here) db INTERFACE, 0x00 ; bDescriptorType, bInterfaceNumber db 0x00, 0x00 ; bAlternateSetting, bNumEndpoints (excluding EP0) db 0xFF, 0x00 ; bInterfaceClass (vendor specific class code), ; bInterfaceSubClass db 0xFF, 0x00 ; bInterfaceProtocol (vendor specific protocol used), ; iInterface (none)Description strings are now requested by the PC which describe the device:Get String Descriptor (255 bytes) SETUP 2D 01 E8 DATA C3 80 06 02 03 09 04 FF 00 97 DB ACK D2And the string describes the device as "Logic Analyzer ...."IN txn 2E 03 4C 00 6F 00 67 00 ; L o g 69 00 63 00 20 00 41 00 ; i c _ A 6E 00 61 00 6C 00 79 00 ; n a l y 7A 00 65 00 72 00 20 00 ; z e r _ 33 00 2E 00 58 00 20 00 ; 3 . X _ 55 00 53 00 42 00 ; U S BThese strings are the ones which appear in the lower-right corner of the screen when a new device is plugged-into a PC. They are for identification to the user only. The PC can request the string, device, and configuration descriptors again as required.Finally, the Configuration is set to 1 (normal for a single device):Set Configuration SETUP 2D 01 E8 DATA C3 00 09 01 00 00 00 00 00 27 25 ACK D2该装置是最后准备,用这个装置可以产生数据传输。在这个案例中的逻辑分析仪,数据通过一个单一的端点(Ⅱ)双向发送,实际设备的数据传输是在这页的其他地方有描述的。下载(仅适用于PC的软件部分):逻辑分析仪的C + +文件(版本4.1)在一个ZIP文件(包括一个内置的可执行文件 )。在一个ZIP文件的USB驱动程序(从SourceForge上完整的驱动程序简化 )。旧版本这个项目,于1998年开始在QBasic编写的原始版本,已经升级过很多次。此页的部分概述了以前的版本。第二个版本(如第一)使用PC的并行端口分析仪的数据传输。在它的最简单的形式,一个并行端口由12个输出线和5个输入线,所有的I / O映射。输出线,通常使用的数据以及如频闪和复位控制线,输入线通常用于读取打印机的状态(例如,如果缺纸)。双向模式确实存在,但这是更为复杂和不支持并行端口。通常用于数据发送到打印机的主要数据端口,8位宽。在大多数PC它是坐落在I / O地址0x378。在此分析仪,它是用来选择采样时钟速率,以及控制如下FIFO芯片的读取功能:D0-D2: Sample clock select (0=external, 1-7 selects internal rates)D3: Enable clock (active low)D4: Read resetD5: Read clockD6: Odd/Even nybble read selectD7: Trigger Enable复制代码控制端口是只有四行,和通常的频闪和其他控制信号到打印机。在此分析仪,它是用来选择一个触发通道和边缘:C0-C2: Trigger channel selectC3: Edge select复制代码最后,并行端口提供阅读打印机的状态投入(如纸张等)。它是用来读取FIFO缓冲器的状态,以及一个字节的数据,一次4位(1个半字节):S3: FIFO Buffer full (active low)S4-S7: data nybble复制代码通过74HCT157复用器的选择上四个或四个较低位,8位从FIFO中的数据读入一次4位的PC。在计划从FIFO的USB升级数据将直接传递给一个USB接口。并行接口到PC 在过去是一个好主意,但保护模式Windows O / S的像XP不支持直接访问并行端口硬件,因此需要特殊的驱动程序 。完整的原理图,第2版(使用并行接口),可以在这里找到( PDF格式)。U5的是FIFO芯片,U4(74HCT573)是用来作为缓冲-这是嵌分析仪是无意中连接到一个高电压,从而有利于保护FIFO的输入(FIFO是相当昂贵),U6是多路复用选择其中半字节读通过并行端口输入(USB版本报废),U2和U3产生的采样时钟,和U7选择哪一个通道作为触发。原前端软件(第1版,大约1998年)写的是基本的,但,这是非常有限。最大的单笔限制是失去控制时,例如,一个无效的通道作为触发选择的硬件。了一会儿,假设用户选择通道2的触发,分析仪启动,但从来没有到达该通道上的一个脉冲.... 然后分析仪“挂起”,而等待的脉冲到达。定时器超时,使逻辑分析仪在合理时间内没有响应,超时消息报道,用户可以重设参数的程序。不过,现在需要的是一个多线程的方法,用户界面运行不断,允许选择,例如,另一个触发通道,而一个线程运行时不断与分析仪的硬件接口。使用32一个双赢的平台,并写在代码的C + +提供了此功能(见下面的“软件”,...).在第二个版本中,首先关注的是直接进入到并行端口的硬件,这是必需的,但不提供32位保护模式程序的O / S(有没有想过发生了什么事老好人“INP( )“和”出“存在于旧的16位编译器的功能?)。销售用户模式I / O访问是被禁止的NT(及更高版本)的操作系统在关闭一个可能的安全漏洞,但是微软从来没有解决问题,如何让一个如该分析仪方案安全地使用I / O端口(我想。最终的答案是“使用USB”)。通常情况下,试图写入到一个I / O地址将直接导致异常。为了克服这个问题,UserPort是由Tomas Franzon使用。在后台运行时,逻辑分析仪开始前,这个驱动程序允许硬件读取和写入通过改变处理器的x86 IOPM(I / O权限地图选择)I / O地址。这与NT和XP,但它不知道这项计划是否将与Vista或更高版本。软件第2版的主要(前端)方案是一个标准的Win 32应用程序。创建后(处理WM_CREATE),DLL被加载提供两个函数的输出()“和”输入()'的I / O执行如下:hDLL = LoadLibrary( "INPOUT32" );Output = (LPFNDLLFUNC1) GetProcAddress( hDLL, "Out32" );Input = (LPFNDLLFUNC2) GetProcAddress( hDLL, "Inp32" );复制代码当然,每个指针(hDLL,输出和输入)检查,以确保它们不为NULL,... ... 如果他们是一个消息框,警告用户失败,程序终止。下载完整的逻辑分析仪的文件(第2版),包括EXE文件,CPP,H,和一个ZIP文件中的RC文件。该方案是用C写的- ... ... 这就像C + +只写不好:)。版本2.002 -原来几个新功能(如复制到剪贴板),但仍然是“脏”,并需要大量的清理工作,包括消除大量的全局变量的版本略有改善。部分附件下载请见参考资料 </p>






