DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 806|回复: 0
打印 上一主题 下一主题

[接口电路] 基于usb接口的arm嵌入式仿真器的设计

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-16 18:49:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

                    ?
  在嵌入式系统的设计过程中,仿真器完成的工作是把从PC机发出的命令和数据通过JTAG命令传送到目标机,实现协议转换的功能。目前,常用的仿真器有基于PC机串行端口和并行端口的仿真机两种类型。基于PC机串行口得功能有限,且速度很慢。基于PC机并行口得仿真机一般是采用PC机并行口外加一些锁存器来实现的,并通过PC机模拟JTAG时序。PC的并口一般只有一个,加上并口带电插拔容易损坏,当存在多个基于并口的JTAGT调试器系统时,实现使用过程中会很不方便,因此设计实现一种速度快、性能稳定、价格低廉、易于实现的ARM调试工具是十分必要的。
? 1 ARM JTAG调试原理
  ARM典型的调试系统结构如图1所示。调试系统包括调试主机、仿真器和调试目标。
?



?
??? 调试主机是一台运行调试软件(例如ADS)的计算机。调试主机可以发出高层的调试命令,例如设置断点、访问内存等。
??? 仿真器用来将调试主机发出的高层调试命令转换为底层的ARM JTAG调试命令。因为目标机无法识别调试主机发送来的高级命令,因此就需要仿真器将调试主机发出的高层调试命令转换为底层的ARM JTAG调试命令[3]。在整个调试系统中起到重要的作用,其性能也决定了整个调试系统性能。
??? 2 方案设计
??? 本文提出了一种采用PHILIPS公司的ARM7芯片LPC2148设计,具有USB2.0通信方式、高速稳定的ARM仿真器实现方案,如图2所示。
?



?

??? 守护进程接收从IDE集成开发环境发送来的调试命令,将其通过USB总线转发到ARM仿真器,ARM仿真器再将调试命令转换成JTAG格式的信号并发送到I/O口,从而控制调试目标执行特定的操作,达到调试的目的。同理,从调试目标返回的数据,先经过ARM仿真器的译码,再经过守护进程返回到IDE开发环境,从而形成一个完整的调试系统。
??? 3 硬件电路设计
??? 本设计的最大特点是采用了LPC2148作为主控芯片。该芯片内部集成了ARM7TDMI-S微控制器和完全兼容USB2.0的设备控制器,支持32个物理(16个逻辑)端点;支持控制、批量、中断和同步端点;所有端点都有一个双向的DMA通道。因为芯片内部集成了USB控制器,大大降低了电路板的设计难度和开发成本。其硬件电路框图如图3所示。
  目标Monitor相比之下要好得多,因为它是在实际硬件中运行的。但是为了使MONitor程序能够运行起来,目标系统必须是一个完整的、能够工作的系统。采用仿真器后就不是这样,仿真器在目标系统硬件不完整、或者是一点硬件都没有的情况下都可以运行。然而目标Monitor可以安装在最终产品的程序中,随时都可以激活,用来进行调试,所以这对于测试和维护来说还是有一定优势的。
?



?
??? (1)本机JTAG调试电路
??? 为了便于调试和烧写程序,将芯片LPC2148的JTAG接口接到一个20引脚的标准JTAG插口。本设计中使用引脚P0.8、P0.9、P0.10、P0.12、P0.14作为外部JTAG接口,尽量不用有其他接口功能的引脚,如P0.11、P0.14接口与I2C接口SCL1、SDA1功能复用,以便于将来的硬件升级。为了增强带负载能力,使用一片74HC244芯片,同时为了尽量兼容大部分ARM开发板上的不同JTAG插口,本设计提供了一个20引脚的JTAG插口和一个14引脚的JTAG插口。
??? (2)USB电路(包括供电电路)
??? USB接口电路如图4所示。为了使LPC2148的软件可以更灵活地控制USB设备与主机之间的连接,本接口电路使用P0.31(只能使用该引脚)来实现SoftConnect特性。当P0.31输出低电平时,D+线通过电阻上拉到VDD3.3,通知USB主机:USB设备与其建立连接;当P0.31输出高电平时,D+线断开与VDD3.3的连接,通知USB主机:USB设备已经断开与USB主机的连接。
?



?
??? Q1选用的是P沟道MOS管,而不选用普通的PNP三极管,因为MOS管是电压驱动型,驱动电流几乎为0;而普通的PNP三极管是电流驱动,需要一定的驱动电流。导通时,P0.31_P17有可能被拉低,LPC2148要求该引脚在复位引脚为低电平期间不能被拉低,否则JTAG口将被禁止,因此必须选用P沟道的MOS管。LPC2148的P0.23引脚为USB设备控制器,用于检测USB总线是否插入检测引脚[4]。
??? 4 仿真器固件程序设计
??? 仿真器LPC2148芯片中的固件程序实现的功能包括:通过USB与上位机软件进行通信,并将上位机发送过来的、经过封装的USB数据流转换为JTAG信号,并最终送到相应的引脚或者将相应引脚的数据经过封装后,通过USB传送到PC机中。图5为应用程序的流程图。
?



?
??? 主函数首先将作为JTAG接口使用的5个引脚设置成相应属性,并完成USB设备初始化,配置中断向量、开中断,然后进入无限循环函数。
??? 无限循环函数首先处理USB事件,如USB控制传输、USB总线复位等。然后判断标志位是否收到数据,如果未收到则继续执行无限循环;如果收到了数据,则将数据从端点缓冲区读出,再交给数据处理函数处理。数据处理函数按照上位机程序对数据封装方式进行解析,根据解析的命令(读取TDI、写TMS或TDO等),通过分支处理跳到相应的处理函数。
??? 软件模拟器和目标Monitor只能模拟系统运行,然后进行性能分析,但是它们已经做得不错了;而仿真器则更进一步,在实际硬件上面进行性能分析,这样就增加了精度。而且,使用实际的硬件能够发现在软件模拟中无法发现的错误。虚假中断以及其它一些故障可能会出乎意料地消耗CPU资源,导致严重的性能问题,而且很难发现。利用仿真器的性能分析,这些问题很容易暴露。
?



?
??? C语言定义的命令码如下:
??? #define UNKOWN_COMMAND?? ? 0x00??? //未知指令
??? #define PORT_DIRECTION?? ? 0x01?????? //设置端口方向为输入或输出
??? #define PORT_SET???? 0x02???? ? ? ? ?? //将JTAG端口的引脚都设为高电平
??? #define PORT_GET?? ????? 0x03??? ? ?? //读JTAG端口的引脚数据
??? #define PORT_SETBIT? 0x04????????? //设置JTAG端口的某一位为1,由DATA[0]中数据决定设置的具体位数
??? #define PORT_GETBIT? 0x05??????? //读取JTAG端口的某一位为1,由DATA[0]中数据决定读取的具体位数
??? #define WRIte_TDI?? ? 0x06??????????? //写TDI信号命令
??? #define READ_TDO?? ? 0x07? ? ? ? ? ? ?? //读TDO信号命令
??? #define WRITE_AND_READ?? ? 0x08??? //读写指令,对TDI写一位,对TDO一位
??? #define WRITE_TMS?? ????? 0x09????????? //写TMS信号命令
??? #define WRITE_TMS_CHAIN 0x0A????? //写TMS扫描链命令
  本文给出了基于USB接口,并通过可编程系统芯片实现的ARM仿真器,不但速度上较常用传统串口、并口仿真器快很多,而且避免了传统的Angel调试程序占用目标资源的缺点,具有较好的实用价值,是一种易于被ARM个人开发者和团体开发组接受的高性价比、实用型仿真器的设计方案。
            
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-5-10 06:08 , 耗时 0.082308 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表