USB接口

1、新增一个class里面没有参考示例的设备

如果用户想增加一个device设备但是在TinyUSB class里面又没有参考示例,本次我们一起来移植一个CDC+printer复合设备。操作步骤还是和上篇一样,先将TinyUSB 从GitHub上克隆下来,将src 整个文件夹copy替换到例程components目录下的src。

1.png

图1 TinyUSB源码

将tinyusb 目录下example下的对应文件,将tinyusb\examples\device\cdc_dual_ports\src 三个文件copy到例程user文件夹里面,其他增加时钟配置函数和添加tud_dcd_port.c 接口函数文件和上一篇一致(tud_dcd_port.c 文件可以参考现有例程或者联系灵动技术支持)。

2.png

图2 工程的USER文件

在tinyusb\src\class里面新增一个printer文件夹,可以参考其他设备比如从hid里面copy两个hid_device.c和hid_device.h 文件做为模板,将文件名修改成printer_device.c和printer_device.h,在这个文件里面修改对应的函数接口。

3.png

图3 新增printer文件

工程文件树如下:

1. TinyUSB_CDC_Printer

2.     │

3.     ├─USER

4.     │       main.c

5.     │       usb_descriptors.c

6.     │       usb_dcd_port.c

7.     │  

8.     └─TinyUSB

9.  

10.            tusb.c

11.            cdc_device.c

12.            tud_fifo.c

13.            usbd.c

14.            usb_control.c

15.           printer_device.c

2、修改printer接口函数

1、在printer接口文件里面需要修改实现以下几个函数:

printer_init,              //接口变量初始化
printer_reset,            //接口变量重置
printer_open,           
printer_control_xfer_cb,   //控制接口回调
printer_xfer_cb           //数据接口回调
tud_printer_task           //while(1)循环打印机数据处理

4.png

图4 需要实现的接口函数

2、在tusb_config.h 文件里面增加宏定义#define CFG_TUD_PRINTER 1 ,同时将对应的设备define改成2 ( #define CFG_TUD_CDC 2 ) ,使能两个CDC设备。

//------------- CLASS -------------//
#define CFG_TUD_CDC               2
#define CFG_TUD_MSC               0
#define CFG_TUD_PRINTER           1
#define CFG_TUD_HID               0
#define CFG_TUD_MIDI              0
#define CFG_TUD_VENDOR            0

3、在usbd.c 里面增加printer回调函数接口处理。

#if CFG_TUD_PRINTER
    {
        DRIVER_NAME("PRINTER")
        .init             = printer_init,
        .reset            = printer_reset,
        .open             = printer_open,
        .control_xfer_cb  = printer_control_xfer_cb,
        .xfer_cb          = printer_xfer_cb,
        .sof              = NULL
    },
#endif

4、在tusb.h增加printer对应的头文件。

#if CFG_TUD_PRINTER
  #include "class/printer/printer_device.h"
#endif

5、在tusb.h增加printer描述符。

//--------------------------------------------------------------------+
// PRINTER Descriptor Templates
//--------------------------------------------------------------------+

// Length of template descriptor: 23 bytes
#define TUD_PRINTER_DESC_LEN    (9 + 7 + 7)

// Interface number, string index, EP Out & EP In address, EP size
#define TUD_PRINTER_DESCRIPTOR(_itfnum, _stridx, _epout, _epin, _epsize) \
  /* Interface */\
  9, TUSB_DESC_INTERFACE, _itfnum, 0, 2, TUSB_CLASS_PRINTER, 0x01, 0x02, 0,\
  /* Endpoint Out */\
  7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0x00,\
  /* Endpoint In */\
  7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0x00

6、修改usb_descriptors.c 的描述符,增加一个printer的描述符和对应的端点。

//--------------------------------------------------------------------+
// Configuration Descriptor
//--------------------------------------------------------------------+
enum
{
  ITF_NUM_PRINTER= 0,    
  ITF_NUM_CDC_0,
  ITF_NUM_CDC_0_DATA,
  ITF_NUM_CDC_1,
  ITF_NUM_CDC_1_DATA,
  ITF_NUM_TOTAL
};

  #define EPNUM_CDC_0_NOTIF   0x81
  #define EPNUM_CDC_0_OUT     0x02
  #define EPNUM_CDC_0_IN      0x82

  #define EPNUM_CDC_1_NOTIF   0x83
  #define EPNUM_CDC_1_OUT     0x04
  #define EPNUM_CDC_1_IN      0x84

  #define EPNUM_PRINTER_OUT     0x05
  #define EPNUM_PRINTER_IN      0x86

uint8_t const desc_fs_configuration[] =
{
  // Config number, interface count, string index, total length, attribute, power in mA
  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),

  TUD_PRINTER_DESCRIPTOR(ITF_NUM_PRINTER, 5, EPNUM_PRINTER_OUT, EPNUM_PRINTER_IN, 64),  

  // 1st CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size.
  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_0, 4, EPNUM_CDC_0_NOTIF, 8, EPNUM_CDC_0_OUT, EPNUM_CDC_0_IN, 64),

  // 2nd CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size.
  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_1, 4, EPNUM_CDC_1_NOTIF, 8, EPNUM_CDC_1_OUT, EPNUM_CDC_1_IN, 64),
};

7、增加device id描述符和string字符串。

//--------------------------------------------------------------------+
// String Descriptors
//--------------------------------------------------------------------+

// array of pointer to string descriptors
char const* string_desc_arr [] =
{
  (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)
  "TinyUSB",                      // 1: Manufacturer
  "TinyUSB Device",              // 2: Product
  "123456",                       // 3: Serials, should use chip ID
  "TinyUSB CDC",                 // 4: CDC Interface
  "MM32 Printer",                // 5: printer Interface
};

uint8_t const desc_printer_device_id[] = {
   0x00,0x08, 'p', 'r', 'i', 'n', 't', '0', '0', '0',
};

uint8_t * tud_printer_device_id_cb(void)
{
    //(void) itf;
    return desc_printer_device_id;
}


8、对应的需要在printer_device.c的printer_control_xfer_cb实现 device id的数据回复。

bool printer_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const* p_request)
{
    uint8_t  * devicedesc;
    // nothing to do with DATA & ACK stage
    if (stage != CONTROL_STAGE_SETUP) return true;
        // Handle class request only
    TU_VERIFY(p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);

    switch ( p_request->bRequest ) {
        case 0x00:
             devicedesc = tud_printer_device_id_cb();
             tud_control_xfer(rhport, p_request, (void*) devicedesc, 10);

            break;
        case 0x01:
             devicedesc = tud_printer_device_id_cb();
             tud_control_xfer(rhport, p_request, (void*) devicedesc, 10);            
            break;
        default:
            return false; // stall unsupported request
    }

    return true;
}

9、在tusb_config.h文件里面添加#define CFG_TUSB_MCU OPT_MCU_MM32F016X

Tusb_option.h 文件里面增加:

#define OPT_MCU_MM32F016X        1501 ///< MindMotion MM32F0160

否则TUP_DCD_ENDPOINT_MAX 没有定义。

5.png

6.png

图5 增加MM32F0160 宏定义

10、在main.c 里面主循环增加三个处理函数:

tud_task();    
cdc_task();   
tud_printer_task();

main函数:

/*------------- MAIN -------------*/
int main(void)
{
  USB_DeviceClockInit(); // board_init();

  CONSOLE_Init(460800); //Config uart2

  // init device stack on configured roothub port
  tud_init(BOARD_TUD_RHPORT);

  TU_LOG1("TinyUSB Printer & CDC\r\n");

  while (1)
  {
    tud_task(); // tinyusb device task
    cdc_task();
    tud_printer_task();  //user printer task
  }
}

3、功能验证测试

完成上述移植修改解决基本的编译问题后烧录测试能枚举打印机和CDC两个设备。

7.png

图6 枚举过程

8.png

图7 枚举成功

选择打印机设备,直接打印word的内容,能抓到通过枚举的打印机28号设备端点4下发的数据。

9.png

图8 枚举成功

10.png

图9 printer EP4 OUT包数据

相关链接:基于MM32F0163D7P的USB接口TinyUSB应用:移植和新增设备(一)

来源:灵动MM32MCU百科

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 244

概述

USB接口的可热插拔特性会容易受静电损坏器件,造成死机、烧板、掉线等。在USB接口上设计ESD保护是必要的,USB ESD设计需要满足JS-001-2017(HBM)和IEC61000-4-2两个标准。HBM要求设备USB接口能够承受高达2 kV的放电,图1和表1为JS-001-2017标准测试波形和等级分类。图2和表2为IEC61000-4-2标准测试波形和等级分类。

“图1.
图1. JS-001-2017标准测试波形

“表1.
表1. JS-001-2017标准等级分类

“图2.
图2. IEC61000-4-2标准测试波形

“表2.
表2. IEC61000-4-2标准等级分类

ESD保护设计要点

在USB接口设计时建议加入ESD保护器件并加入VBUS侦测电路检测过压。设计要点列出如下:

  • ESD保护器件应尽量靠近USB插座接口放置(ESD进入点)
  • VBUS、USB数据线(USB_D+/USB_D-)、ID(若为OTG)都要进行ESD保护

“图3.
图3. USB ESD保护电路
  • VBUS的走线尽量远离D+/D-
  • USB插座金属壳要与设备外壳地可靠连接
  • 设备不需要VBUS提供电源时,可通过电阻分压后连接于AT32的非5 V耐压的一般GPIO,或直接连接于5 V耐压的GPIO,作为VBUS侦测信号

“图4.
图4. VBUS侦测电路

ESD保护器件的选择

USBFS的传输速率达到12 Mbps,一般选用TVS阵列管来实现ESD防护。当ESD事件到来时,TVS中的二极管会正向导通,使得瞬态电流绕过敏感的CMOS器件,将瞬态高压降低到钳位电压值,进而实现对接口电路的保护。

钳位电压

在ESD事件到来时,保护器件对高压脉冲钳制到钳位电压,并且分流大部分脉冲电流到地,以保护后端敏感器件。但是,仍然会有残余电流流入受保护器件,ESD事件期间的峰值电流是通过ESD保 护器件的分流电流与流入受保护器件的残余电流之和。受保护器件承受的功率取决于ESD保护器件的钳位电压和流入的残余电流。

钳位电压可用以下公式计算:

钳位电压(VCL)=VBR+Io(残余电流)x Ro(受保护器件电阻)

在选择ESD保护器件钳位电压时,设计人员必需了解使用何种测试设置来确定数值。根据IEC61000-4-2 Level 4标准,ESD脉冲具有少于1 ns的上升时间和小于100 ns的持续时间,以及30 A峰值电流。具有5 V钳位电压的ESD保护二极管可能在实际的ESD测试中出现超过30 V的钳位电压。如果不了解这一点,设计人员可能会仅仅根据数据表中最低钳位电压来选择ESD保护器件。

信号完整性

在数据传输系统中要求确保接收器达到一定的信号完整性水平,信号的上升、下降时间是由整个传输路径阻抗来限制的,并且结合了接口的所有寄生电容。这些寄生电容可能由不匹配的PCB线路、USB插座引脚或其它并联电容引起,因此要求ESD保护器件的电容必须小,并且也要能提供足够的ESD防护能力。

关于雅特力

雅特力科技于2016年成立,是一家致力于推动全球市场32位微控制器(MCU)创新趋势的芯片设计公司,专注于ARM ®Cortex®-M4/M0+的32位微控制器研发与创新,全系列采用55nm先进工艺及ARM® Cortex®-M4高效能或M0+低功耗内核,缔造M4业界最高主频288MHz运算效能,并支持工业级别芯片工作温度范围(-40°~105°)。

雅特力目前已累积相当多元的终端产品成功案例:如微型打印机、扫地机、光流无人机、热成像仪、激光雷达、工业缝纫机、伺服驱控、电竞周边市场、断路器、ADAS、T-BOX、数字电源、电动工具等终端设备应用,广泛地覆盖5G、物联网、消费、商务及工控等领域。

来源:AT32 MCU 雅特力科技
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 420

USB是一种快速、双向、同步传输、价格便宜、方便使用的可热拔插的串行接口。

由于数据传输快,接口方便,支持热插拔等优点使USB设备得到广泛应用。目前,市场上以USB2.0为接口的产品居多,但很多硬件新手在USB应用中遇到很多困扰,往往PCB装配完之后USB接口出现各种问题。

USB 接口电路设计常见问题

比如通讯不稳定或是无法通讯,检查原理图和焊接都无问题,或许这个时候就需怀疑PCB设计不合理。绘制满足USB2.0数据传输要求的PCB对产品的性能及可靠性有着极为重要的作用。

USB协议定义由两根差分信号线(D+、D-)传输数字信号,若要USB设备工作稳定差分信号线就必须严格按照差分信号的规则来布局布线。根据笔者多年USB相关产品设计与调试经验,总结以下注意要点:

1. 在元件布局时,尽量使差分线路最短,以缩短差分线走线距离(√为合理的方式,×为不合理方式);

USB 接口电路设计常见问题

2. 优先绘制差分线,一对差分线上尽量不要超过两对过孔(过孔会增加线路的寄生电感,从而影响线路的信号完整性),且需对称放置(√为合理的方式,×为不合理方式);

USB 接口电路设计常见问题

3.对称平行走线,这样能保证两根线紧耦合,避免90°走线,弧形或45°均是较好的走线方式(√为合理的方式,×为不合理方式);

USB 接口电路设计常见问题

4. 差分串接阻容,测试点,上下拉电阻的摆放(√为合理的方式,×为不合理方式);

USB 接口电路设计常见问题

5. 由于管脚分布、过孔、以及走线空间等因素存在使得差分线长易不匹配,而线长一旦不匹配,时序会发生偏移,还会引入共模干扰,降低信号质量。所以,相应的要对差分对不匹配的情况作出补偿,使其线长匹配,长度差通常控制在5mil以内,补偿原则是哪里出现长度差补偿哪里;

USB 接口电路设计常见问题

6.为了减少串扰,在空间允许的情况下,其他信号网络及地离差分线的间距至少20mil(20mil是经验值),覆地与差分线的距离过近将对差分线的阻抗产生影响;

USB 接口电路设计常见问题

7.USB的输出电流是500mA,需注意VBUS及GND的线宽,若采用的1Oz的铜箔,线宽大于20mil即可满足载流要求,当然线宽越宽电源的完整性越好。

USB 接口电路设计常见问题

普通USB设备差分线信号线宽及线间距与整板信号线宽及线间距一致即可。然而当USB设备工作速度是480 Mbits/s,只做到以上几点是不够的,我们还需对差分信号进行阻抗控制,控制差分信号线的阻抗对高速数字信号的完整性是非常重要的。

因为差分阻抗影响差分信号的眼图、信号带宽、信号抖动和信号线上的干扰电压。差分线阻抗一般控制在90(±10%)欧姆(具体值参照芯片手册指导),差分线阻抗与线宽W1、W2、T1成反比,与介电常数Er1成反比,与线间距S1成正比,与参考层的距离H1正比,如下图是差分线的截面图。

下图为四层板的参考叠层,其中中间两层为参考层,参考层通常为GND或Power,并且差分线所对应的参考层必须完整,不能被分割,否则会导致差分线阻抗不连续。若是以图 2叠层设计四层板,通常设计时差分线采用4.5mil的线宽及5.5mil的线间距既可以满足差分阻抗90Ω。

然而4.5mil线宽及5.5mil线间距只是我们理论设计值,最终电路板厂依据要求的阻抗值并结合生产的实际情况和板材会对线宽线间距及到参考层的距离做适当的调整。

USB 接口电路设计常见问题

以上所描述的布线规则是基于USB2.0设备,在USB布线过程中把握差分线路最短、紧耦合、等长、阻抗一致且注意好USB电源线的载流能力,掌握好以上原则USB设备运行基本没问题。

来源:百度文库、硬件笔记本
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
demi@eetrend.com)。

围观 139

USB接口具有传输速度快,支持热插拔以及连接多个设备的特点,目前已经在各类计算机、消费类产品中广泛应用。

一、 usb接口面临电磁兼容问题

由于usb接口其运行速率较高,容易通过usb连接线缆对外高频辐射超标,同时由于带电热插拔,容易受到瞬间电压冲击和静电干扰。因此我们在产品接口设计时,需要着重从接口滤波设计,防护设计,PCB设计、结构电缆多个方面考虑电磁兼容设计。

本文电磁兼容解决方案主要结合usb2.0接口电路特点,从产品原理图的接口电路出发,提供符合产品实际设计要求的具体的emc设计方案,从而使产品能够满足电磁兼容标准与规格要求,获得良好的emc品质,提升产品的可靠性。

二、 usb接口标准要求

带有usb接口的典型消费类产品,需要满足相关电磁兼容要求,与usb相关的电磁兼容项目要求如下,其他如应用在军品、汽车电子、铁路电子要求则有所不一样,具体请参考相关电磁兼容标准要求。

USB接口电磁兼容(EMC)解决方案

三、原理图emc设计:

USB接口电磁兼容(EMC)解决方案

四、原理图设计要点说明:

4.1滤波设计要点:

L1为共模滤波电感,用于滤除差分信号上的共模干扰;

L2为滤波磁珠,用于滤除为电源上的干扰;

C3、C4为电源滤波电容,滤除电源上的干扰;

C1、C2 为预留设计,注意电容尽量小,如实际影响信号传输,可以不焊接。

4.2防护设计要点:

D1、D2、D3组成usb接口防护电路,能快速泄放静电干扰,避免内部电路遭受静电的干扰。

C5、C6为接口地和数字地之间的跨接电容,典型取值为1000pF,耐压要求达到2KV以上。

4.3 特殊要求:

4.3 R1、R2为限流电阻,差分线之间耦合会影响信号线的外在阻抗,可以用此电阻实现终端最佳匹配,使用时根据实际情况进行调整。

4.4 器件选型要求:

L1为共模电感,共模电感阻抗选择范围为60Ω/100MHz~120Ω/100MHz,典型值选取90Ω/100MHz

L2选用磁珠,磁珠阻抗范围为100Ω/100MHz~1000Ω/100MHz,典型值选取600Ω/100MHz ;磁珠在选取时通流量应符合电路电流的要求,磁珠推荐使用电源用磁珠

C3、C4两个电容在取值时要相差100倍,典型值为1000pF、0.1uF;小电容用滤除电源上的高频干扰,大电容用于滤除电源线上的纹波干扰;

D1、D2、D3选用TVS,TVS反向关断电压为5V。TVS管的结电容对信号传输频率有一定的影响,usb2.0的TVS结电容小于5pF;

C5、C6为接口地和数字地之间的跨接电容,典型取值为1000pF,耐压要求达到2KV以上。

4.5 相关电磁兼容器件选型建议清单

USB接口电磁兼容(EMC)解决方案

五、PCB设计说明

5.1布局设计要点

元器件布局要按照信号流向进行布局;

防护器件要尽可能的靠近接口放置,确保引线电感最小,以保证防护器件能正常的进行防护动作。

应将芯片放置在离地层最近的信号层,并尽量靠近usb插座,缩短差分线走线距离。

5.2布线设计要点

共模电感下方不能走其它信号线。

如果usb接口芯片需串联端电阻或者D线接上拉电阻时.务必将这些电阻尽可能的靠近芯片放置。

将usb差分信号线布在离地层最近的信号层。

保持usb差分线下端地层完整性,如果分割差分线下端的地层,会造成差分线阻抗的不连续性,并会增加外部噪声对差分线的影响。

在usb差分线的布线过程中,应避免在差分线上放置过孔(via),过孔会造成差分线阻抗失配。

保证差分线的线间距在走线过程中的一致性,如果在走线过程中差分线的间距发生改变,会造成差分线阻抗的不连续性。

在绘制差分线的过程中,使用45°弯角或圆弧弯角来代替90°弯角,并尽量在差分线周围的150 mil范围内不要走其他的信号线,特别是边沿比较陡峭的数字信号线更加要注意其走线不能影响usb差分线。

转自:电磁兼容之家

围观 485

为了更好的将USB的通用性和CAN的专业性结合起来,通过计算机的USB接口接入CAN专业网络,实现系统控制的便利性和应用的高效性,本文讲述了一种基于ARM7处理器实现USB接口与CAN总线的实例,通过其可以在PC实现对CAN总线上设备的监控。

1、硬件系统设计

1.1 处理器简介及其外围电路设计

主控制器选用NXP公司的ARM7核处理器LPC2119。LPC2119是基于一个支持实时仿真和跟踪的16/32位ARM7TDMI-STM CPU,并带有128 KB嵌入的高速FLASH存储器。128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低超过30%,而性能的损失却很小。实行流水线作业,提供Embedded ICE逻辑,支持片上断点和调试点,具有先进的软件开发和调试环境。LPC2119具有非常小的64脚封装、极低的功耗、多个32位定时器、4路10位ADC、2路CAN、PWM通道、多个串行接口,包括2个16C550工业标准UART、高速I2C接口(400 kHz)和2个SPI接口,46个GPIO以及多达9个外部中断,特别适用于汽车、工业控制应用以及医疗系统和容错维护总线。

LPC2119内部集成2个CAN控制器,每一个CAN控制器都与独立CAN控制器SJA1000有着相似的寄存器结构。它的主要特性有:单个总线上的数据传输速率高达1 Mb/s;32位寄存器和RAM访问;兼容CAN2.0B,ISO11898-1规范;全局验收滤波器可以识别所有的11位和29位标识符;验收滤波器为选择的标准标识符提供Full CAN-style自动接收。图1所示为LPC2119外围电路,为保证可靠复位,采用外部复位电路STM809。

基于ARM7处理器的USB接口与CAN总线的实例
图1 LPC2119外围电路

1.2 USB接口电路设计

USB接口采用沁恒电子的CH375。CH375是一个USB总线的通用接口芯片,支持USB-HOST主机方式和USB-DEVICE/SLAVE设备方式。在本地端,CH375具有8位数据总线和读、写、片选控制线以及中断输出,可以方便地挂接到单片机/DSP/MCU/MPU等控制器的系统总线上。CH375提供了串行通信方式,通过串行输入、串行输出和中断输出与单片机/DSP/MCU/MPU等相连接。图2所示为CH375的接口电路。

基于ARM7处理器的USB接口与CAN总线的实例
图2 USB接口电路

1.3 CAN总线接口电路设计

CAN总线收发器采用82C250,并选用6N137作隔离,LPC2119的TD和RD引脚不是直接与82C250的TX、RX引脚相连,而是通过高速光耦6N137与82C250相连,这样可增强CAN总线节点的抗干扰能力,从而实现总线各节点间电气隔离。高速光耦6N137用于保护LPC2119内部CAN总线控制器,该光耦两侧采用5 V的DC-DC电源,可使器件的VCC与VCC1完全隔离,提高系统的抗干扰能力以及节点的稳定性和安全性。图3所示为LPC2 119与CAN驱动器82C250的连接电路。DC-DC电源模块采用B0505LS-2W,电路在图4中所示。

基于ARM7处理器的USB接口与CAN总线的实例
图3 CAN驱动器82C250的连接电路

基于ARM7处理器的USB接口与CAN总线的实例
图4 DC-DC隔离电路

1.4 系统电源设计

整个电路的电源由USB供电,由于LPC2119的IO电路电源要求为3.3 V,内核电路电源要求为1.8 V,在本应用中采用两片低压差线性温压器(LDO)1117为系统供电,如图4所示。

1.5 系统PCB设计

整个系统的PCB采用双面板方式设计,大小为100×120,布局及外形如图5所示。

基于ARM7处理器的USB接口与CAN总线的实例
图5 布局及外形

2、固件设计

本系统软件设计时采用μVision3 IDE,μVision3IDE是一个窗口化的软件开发平台,它集成了功能强大的编辑器、工程管理器以及各种编译工具(包括C编译器、宏汇编器、链接/装载器和16进制文件转换器),通过ULINK仿真调试。程序框架采用传统的前后台方式。CAN控制器驱动程序包括4部分内容:CAN控制器的初始化、报文的接收、报文的发送和总线异常处理。由于LPC2119没有开发内部读写总线,本设计在对CH375操作时使用通用I/O模拟并口读写时序,其端口定义方式如下:

基于ARM7处理器的USB接口与CAN总线的实例

程序在使用通用I/O模拟并口读写时序对CH375的基本操作包括CPU端口初始化、向CH375写命令、向CH375写数据、从CH375读数据,其实现过程包含:初始化void CH375_PORT_INIT();向CH375写命令void xWriteCH375Cmd(uint8 mCmd);向CH375写数据void xWrite CH375 Data(uint8 mData);从CH375读数据uint8 xReadCH375Data(void)等4个基本函数。

3、结语

本系统设计采用内置CAN控制器的LPC2119作为主控制器,CH375作为USB接口芯片,实现USBCAN转换器,论述了LPC2119的外围电路、CAN总线驱动电路以及LPC2119与CH375之间的接口连接,并在软件给出LPC2119使用通用I/O模拟并口读写时序的方法,对LPC2119,CH375及CAN总线的实际应用具有一定的参考价值。

来源:畅学电子网

围观 392

1 引言

MIL-STD-1553B军用总线标准,在军事装备,特别是飞机系统中得到了广泛的应用,舰载系统中也正在逐步推广。对于1553B总线传输信息的飞机系统,特别是由该总线网络构成的综合航火控系统、通信系统而言,系统时实监测与在线故障诊断均建立在信息录取的前提下。为了方便录取1553B总线上传输的信息就需要应用1553B总线到计算机标准接口转换器,目前常用转换器有1553B-PCI、1553B-VXI等,但在工程实践过程中,它们存在体积大、价格高、使用不方便等缺陷。相比而言,USB接口具有体积小、携带方便、热插拔等特征,具有不可替代的优势。

本文介绍的1553B设备检测系统就是基于USB接口的。设计包含两大部分:硬件设计和软件设计。硬件设计主要实现1553B接口到USB接口的转换;软件设计主要是USB芯片固件开发、USB接口驱动、开发计算机测试1553B设备软件。

2 硬件系统设计

本系统的硬件设计工作主要集中在1553B与USB总线接口的转换设计。硬件系统分成三部分:1553B接口转换电路、FPGA译码电路和USB接口电路。

2.1 1553B接口转换电路

目前,1553B接口芯片种类繁多,根据工程应用场合和实际需要,我们选用DDC公司BU-61580芯片。BU-61580芯片除了具有远程终端(RT)功能外,还可以用作总线控制器(BC)、总线监控器(MT)。其内部功能极强,接口灵活、便于控制,有各种封装形式和供电电压供用户选择。

2.2 FPGA译码电路

FPGA作为现场可编程器件越来越广泛地应用到工程设计中。利用FPGA对系统中信号进行译码可避免由于开始硬件电路设计考虑不周造成的硬件设计错误,而且方便系统的以后的升级。本系统中,FPGA通过1553B接口芯片读取1553B总线上的数据并暂存在FPGA内部RAM中,然后通知USB接口芯片把数据读出;同时,还要通过USB接口接收从PC下发的数据,重新打包,发送到1553B设备。

2.3 USB接口电路

USB接口控制芯片包含两大类:一类是需要外置控制器的芯片,还有一类为内置控制器,如Cypress公司的CY7C64613芯片。本系统选用PHILIP公司的PDIUSBD12芯片,需外置控制器的芯片。

PDIUSBD12芯片是带有并行总线和局部DMA传输能力的全速USB接口器件。片内集成了高性能USB接口器件、SIE、FIFO存储器、收发器以及电压调整器等,可与任何外部微控制器/微处理器实现高速并行接口(2MB/s),完全能匹配1553B总线最高传输速率(1MB/s)。

USB 实现模块的核心是PIDUSB12。外置控制器AT89C52的P0口接PIDUSBD12的DATA0~DATA7,用来传输要交换的数据。P0 口所有引脚都要外接上拉电阻。PIDUSBD12的片选信号和复位信号由AT89C52的P1.6与P1.7提供。AT89C52 的P3.6与P3.7作为PIDUSBD12的写读控制端,AT89C52和PIDUSBD12的ALE相连,PIDUSBD12的挂起状态和中断控制都接高电平。 PIDUSB12的D+和D-加上+5V电源和地就构成了USB接口,从而能与计算机相连。

PDIUSBD12与USB的连接通过1.5K上拉电阻将D+置为高实现,默认状态不与Vcc相连,可用SoftConnect技术通过AT89C52发送专门的命令来实现该连接,允许AT89C52在决定与USB建立连接之前完成初始化时序,USB总线连接可以重新初始化而不需要拨出电缆。随后USB设备识别和通信就要依靠固件程序和驱动程序了。

3 软件设计

1553B设备测试软件首先要实现USB接口与PC之间的通信,然后,再对设备进行性能检测。因此,需要对USB芯片进行固件、PC驱动程序和测试程序设计。

3.1 USB固件设计

AT89C52中的固化程序可采用C51 设计,
主要功能是:
控制PDIUSBDl2接受USB驱动程序的请求;
控制PDIUSBDl2接受应用程序的控制指令;
通过PDIUSBDl2存储数据并实时上传PC机。

PDIUSBDl2的固件设计成完全的中断驱动,当CPU处理前台任务时USB的传输可在后台进行,确保了最佳的传输速率和更好的软件结构,简化了编程和调试。

单片机通过PDIUSBDl2与主机通信的过程简述如下:
当PDIUSBDl2接收到主机发来的令牌包后就给单片机发中断,单片机进入中断服务程序。它将数据从PDIUSBD12的内部FIFO取回到CPU存储器并根据中断寄存器判断USB令牌包的类型从而建立正确的事件标志以通知主循环程序进行处理,主循环检查事件标志并进入对应的子程序进行进一步的处理。

系统上电后,先检测PDIUSBD12,如检测不成功则报错,要使用者重插USB接口,再次检测。检测成功则根据PDIUSBD12的中断类型设定中断标志位的值,再根据中断位的值调用相应的功能子程序。

在本设计中,功能子程序主要包括两部分:

1)通过AT89C52的P0端口从FPGA接收1553B设备数据,重新打包,再经过P0端口写入PC机;

2) 通过P0端口接收PC数据,重新打包,通过AT89C52的P0端口从FPGA写入1553B设备。

3.2 驱动程序

完成驱动程序设计的方法一般有三种:基于DDK开发、基于Windrive开发和基于DriveStudio开发。由于Windrive和DriveStudio开发对DDK中的函数进行了一定程度的封装,它们开发的难度比直接用DDK开发要小,但开发的灵活性不如DDK。本设计使用的驱动是DriveStudio与DDK配合进行开发,开发驱动程序的效率较高。

在驱动程序开发平台搭建成功后,我们利用驱动程序生成向导Driver Wizard,根据硬件设置生成USB设备驱动程序的大体框架。

设置如下:
①选择 WDM的驱动程序类型和Windows 2000运行平台。
②选择 USB总线类型,填写它的VID(供应商ID)和PID(设备ID),这些信息由芯片的供应商提供。
③增加端点 1和端点2,它们分别具有IN 和OUT属性。
④根据需要选择对设备的操作有:Read、Write、Device Control和CleanUp。
⑤选择给端点2产生 BULK Read和Write的代码, 向导会自动产生一套对端点2进行读、写的代码。
⑥设置驱动程序的属性,采用WDM接口;在选取读写方式时应遵循一条原则:需要快速传送大量数据时,用 Direct I/O,反之用 Buffer I/O,本设计数据量不大,故选用Buffer I/O;由于无特殊的电源需求,故选用系统默认的Manage Power For This Device。
⑦增加IOCTL接口,在其生成的代码框架中加入自己的操作,以实现一个完整的USB 设备驱动程序。最后就生成了一个 WDM 型的 USB 设备驱动程序框架和一个测试该驱动程序的测试程序大体框架。然后在其中添加需要的功能代码。

通过DriveStudio初步建立一个驱动程序框架后,我们只要修改TESTFIRMDevice.h和TESTFIRMDevice.cpp就可以了,修改完毕后,可以发现使用DriveStudio向导生成的USB设备驱动程序,不仅不需要对底层的硬件进行编程,甚至可以忽略与硬件控制紧密相关的复杂的Windows数据结构(如,URB、IPR)、API函数(DriveEntry()、IoCreateDevice()、AddDevice())的使用。

用DriveWizard创建USB框架程序自动生成的两个工程(Project)文件:TESTFIRM驱动程序工程和Test_TESTFIRM应用程序工程,将光标定位在其中一个工程上之后,单击右键,选择“set as Acnve Pmiect”即可设置该工程为当前活动工程。对于驱动程序编译,不用进行任何设置,单击Build图标即可生成USB驱动程序TESTFIRM.sys文件。

3.3 通信程序

因为DriveStudio已经替我们把核心驱动程序基本开发完了,在本设计中,只要掌握WriteFile和ReadFile两个函数的使用就可以进行简单的USB通信了。由于DriveStudio所用的类库是对DDK函数一定程度的封装,必须在 VB、VC++等软件开发环境中编译,创建自己的库文件,所以很容易为程序增加了图形界面,使用户操作更加方便。

当USB设备与PC通信时,USB设备是从设备,PC是主设备。PC机通过检测USB总线数据端电平判断是否接入或拔出USB设备。PC检测到USB设备后,调用USB设备函数。如果设备被正确打开,软件开启监听USB设备线程,以20ms周期轮询USB接收数据接口。一旦接收到数据,数据就被分析并且回显到界面上,直到线程被中断。

4 结论

1553B总线是当前飞机系统中广泛应用的总线类型,将它与USB总线融合起来具十分重要的实际意义。在开发过程中,利用DriveStudio与DDK配合进行开发USB驱动程序,大大提高了开发的效率。本设计在实际设备测试中,板卡可以稳定工作,测试软件工作正常,满足项目设计要求。

本文作者创新点:利用PDIUSBDl2外置CPU控制数据的读入和写出,开发USB驱动程序,结合FPGA完成系统时序控制,是对1553B-USB转换器设计一种有益的探索。

来源: 21ic.com

围观 428
订阅 RSS - USB接口