微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于ATmega8515的USB-CAN适配器的实现

基于ATmega8515的USB-CAN适配器的实现

时间:10-26 来源:互联网 点击:

  CAN(Controller Area Network)总线作为一种多主机局部网现场总线,由于其组网的灵活性和便捷性、通信的高效性和可靠性以及低廉的成本,在工厂的分散控制领域受到了广泛的应用. 现在的工厂自动化控制,既需要“分散控制”,更需要有效的“集中管理”,以保障生产的安全和效率,而联络各种设备的现场总线和对设备进行监控的工作站(通常为工业PC机) 之间的通信成为一个关键的咽喉. 以往的监控站和现场总线之间的通信大多采用两种方式:一是设计专用的通信卡和现场总线进行通信;二是通过PC机的RS-232C标准接口和现场总线进行接口.使用专用的通信卡对于现在的小型化控制设备已不太方便和实用,而以最高波特率仅为38. 4kb/s 的RS-232C标准接口和最高波特率达1 Mb/s的CAN总线进行接口,无疑会造成CAN总线和监控站之间的通信“瓶颈”问题.

  可见,包括RS-232 在内的接口已经无法满足PC机与外部设备之间不断提高的速度以及稳定性、易用性等方面的要求,并给工程技术人员的设计和用户的运用带来诸多不便. USB(通用串行总线) 的出现解决了上述问题. USB以其优越的易用性、稳定性、兼容性、扩展性、完备性、网络性和低功耗的特点得到了广泛的欢迎和应用,目前的PC机无论是台式还是便携式,均带有 USB插口,并且在最新发布的USB2. 0 版本中,USB 的带宽已经提升到了480Mb/s. 基于上述原因,作者利用Atmel公司最新推出的RISC架构的微控器ATmega8515 , 设计了一种USB总线到CAN总线的专用适配器来对CAN 总线上的设备进行监控. 用USB和CAN总线进行对接,解决了CAN总线和PC机间的通信“瓶颈”问题,提高了通信速度及效率,同时又达到了稳定、易用的目的.

1  USB-CAN适配器的硬件设计

  本文所设计的USB-CAN适配器的主要特点是:(1) PC机和CAN总线之间数据传输波特率可以达到CAN总线1 Mb/s 的最高传输效率; (2) PC机和CAN总线之间数据传输可靠性高,其硬件系统电路如图1 所示,其中CAN 总线的控制器选用Philips公司的独立CAN总线控制器SJA1000 ,USB总线控制器选择全速器件USBN9603 ,两个总线控制器之间的协调处理器采用高性能的AVR 单片机ATmega8515,从而保障了通信速率;CAN 总线控制器和CAN 总线进行光电隔离,采用DC/DC 电源变换器件给光电隔离器件及其后端器件供电,彻底隔离CAN 总线和PC机之间的电气干扰,保障了PC机的安全性.

图1  USB-CAN适配器电气原理图

1. 1  外部微控制器
  独立CAN总线控制器SJA1000 和全速USB总线节点控制器USBN9603必须有外部微控制器进行控制才能工作. 设计中采用Atmel公司最新推出的高性能、低功耗的8 位AVR微控制器ATmega8515 ,给USB-CAN适配器带来诸多优点,并且提高了其性价比.

  ATmega8515具有低功耗特点,供电电压在4.5 ~5.5V DC ,其引脚Vcc 和GND之间最高电流为20mA. 而USB口电源为+ 5V DC,最大可提供500mA电流,故在适配器的电路设计中利用USB口提供的电源直接供电,免去了电源电路,使电路更为简洁.

  ATmega8515 是RISC架构,有多达130 条功能强大的指令(大部分只用一个时钟周期执行) ,32×8通用工作寄存器,完全静态运作,在16MHz 的晶振下运行速度可以达到16MIPS ,片上2周期的乘法器,其运算速度是目前常用的8051单片机的10多倍,用它可以大大减少USB总线控制器和CAN总线控制器之间协调处理的时间,提高了USB-CAN适配器的实际通信速率.

  微控制器具有非易失性的程序和数据存储器,8K字节的在线可编程Flash;可选驻留代码区带有独立的锁存位,通过片上驻留程序可以在线编程实现真正的Read-While-Write 操作;512字节的EEPROM,可进行10 万次擦写,使USB-CAN 适配器的重要设置参数在掉电情况下仍能保存;512 字节的SRAM,可选用对AVR 微控制器进行C 或C + + 编程的编译器, 为开发比较大的程序带来了方便( 例如AT90S1200 没有RAM空间来建立堆栈,只能运用汇编器) ;带有软件加密位;而且微控制器的外围器件中有2 个定时P计数器,具有独立的预分频、比较模式及捕捉模式;3 个PWM通道;可编程串行USART;主P从SPI 串行接口,如图1 中J2 和SPI 的MISO、MOSI、SCK相接,J2 接在串行下载线ISP 上可在线编程;具有独立片上振荡器的可编程看门狗计时器,这些给USB-CAN 适配器控制软件提供了充足的存储、开发空间和安全性.

  ATmega8515可以扩展高达64K字节的外部程序存储器,带有ALE (即外部数据存储器地址锁存使能) 引脚,可以很方便地与SJA1000 和USBN9603引脚相连,这是除了AT90S4414/8815 外其它AVR 微处理器所没有的. 如图1 所示,SJA1000 在Meag8515 的空间地址为0x7F00H ~ 0x7F7FH , USBN9603 在Meag8515 的空间地址为0xBF00H~0xBFFFH.

1. 2  USB总线控制器
  USB -CAN适配器中的USB 总线控制器USBN9603是全速USB 总线节点控制器,传输数据波特率最高可达12Mb/s. USBN9603内部集成收发器,通过18~27Ω的终端电阻与USB 电缆连接,如图1中R7、R8 ;片内集成了倍频电路PLL ,可降低EMI ;并具有可编程时钟输出功能,如图1 中U2 的CLKOUT引脚,在加电复位状态下,默认频率输出为4 MHz ,通过微处理器编程设置,其输出频率为frequency = 48 MHz/(CLKdiv + 1) ,其中CLKdiv 为0~15 之间的整数,当CLKdiv = 2时,可以为ATmega8515 提供16MHz 时钟源,简化了微处理器外围电路;USBN9603 内部集成了1个3. 3V 的调节器,通过1 个1. 5 kΩ的上拉电阻(如图1中R1) 连接到USB 的D + 数据线上,可以使USB 主控制器识别出有1 个USB 全速设备正在连接.

  USBN9603 有7 个基于FIFO 的端点:1 个必需的双向控制端点EPC0 (8 字节缓存), 3 个发送端点EPC1、EPC3 和EPC5 (每个64 字节缓存) ,3 个接端点EPC2、EPC4 和EPC6 (每个64 字节缓存) . 充分利用USBN9603 的FIFO ,可以使ATmega8515 微处理器和USBN9603 控制器并行运行,大大提高了适配器的运行效率.

  USBN9603 的MODE0、MODE1 和ATmega8515 的2 个引脚相连,通过控制2 个引脚的电平,可以选择USBN9603 和微处理器之间的接口方式(如表1 所示) .

表1  USBN9603 接口方式

  USBN9603 支持DMA ,图1 中ATmega8515 通过控制BACK为低电平来使能或高电平禁止DMA. 此外,USBN9603 的中断输出INTR 接到ATmega8515 的INTR0 上,使ATmega8515 能够对USBN9603进行及时的状态诊断和事件处理.

1. 3  CAN总线控制器
  USB -CAN适配器中的SJA1000是工业自动控制领域中独立的CAN总线控制器, 是PhilipsSemiconductors公司继PCA82C200的下一代产品,在PCA82C200 的BasicCAN模式基础上, 增加了符合CAN2.0 协议规定的PeliCAN 模式, 因此它和PCA82C200 在电气上是兼容的;支持11 位标识符ID和29 位标识符ID ;在最高达24MHz 的晶振下,通信速率达1 Mb/s ;发送缓存13 个字节,接收缓存有64个字节,采用FIFO 模式,减少了接收等待时间,提高了实际通信效率.

  USB-CAN 适配器数据传输处理框图如图2 所示,CAN 总线控制器的数据地址复用口和ATmega8515的PA 口相连,它的中断使能端和ATmega8515 的INT1引脚相连,使得ATmega8515能够对SJA1000进行及时的状态诊断和事件处理;串行数据传输端通过光电隔离器件6N137和CAN控制器接口器件PCA82C250相连,使USB-CAN适配器的稳定性及抗干扰能力大为提高.

图2  USB2CAN适配器数据传输处理框图

2  USB-CAN适配器的软件设计

  USB-CAN 适配器软件包括两部分:ATmega8515中的固件和PC机内USB2CAN适配器的驱动软件.

2. 1  USB-CAN适配器固件编程
  良好的开发环境是开发单片机软件质量和速度的保证.USB2CAN 适配器采用GNU AVR 的最新版本WinAVR 编程,它能够对所有AVR 单片机用C 或C + + 语言进行编程,且能在WIN2000 下运行.

  USB-CAN 适配器固件设计成完全的中断驱动,当ATmega8515处理前台任务时,USB 和CAN 的传输可以在后台同时进行,大大提高了实际传输效率,编程和调试亦很方便. 后台的中断处理子程序通过设置事件标志和数据缓冲区来实现和前台主程序之间的数据交换(如图2 所示) .当ATmega8515检测到CAN 控制器的状态寄存器而得知接收缓冲CANRX-Buffer有数据,就会把数据传到USB 控制器空闲发送缓冲区TXFIFO-1或TXFIFO-2中; 同样, 当USB控制器的接收缓冲区RXFIFO-1或RXFIFO-2充满数据时,ATmega8515就会把RXFIFO-1或RXFIFO-2的数据读到内部一个连续的RAM空间,当CAN总线控制器发送缓冲区CAN-TX-Buffer 为空时,再把数据从RAM传到CAN-TX-Buffer.

  USB -CAN适配器固件设计中采用乒乓缓存法提高实际传输速率. USBN9603有7个端点, 通常FIFO内的数据进行传送或接收时每个端点对应一个管道,但是,两个同方向传输数据的端点也可以利用一个管道,这样可以有效地提高数据的传输率,因为当第一个端点的FIFO传输数据时,微处理器可以对第二个端点的FIFO进行数据读或写,反之亦然.

  USBN9603 在进行批量传输时,其实际传输率大约是512kb/s ,这往往是由于主机的控制器最大每帧数据包数量限制造成的,而并非USBN9603本身传输性能. 其它传输方式,如中断传输、同步传输、控制传输的最高传输速率为1.5Mb/s. 采用乒乓缓存法后,可使传输速率提高一倍,从而使传输速率为1Mb/s 的CAN总线控制器没有等待接收数据和发送数据空间的情况,解决了数据传输中的“瓶颈”问题.在USB-CAN 适配器中,端点EP1 (TXFIFO-1) 和EP3 (TXFIFO-2)发送数据到主机,EP2(RXFIFO-1) 和EP4(RXFIFO-2)从主机接收数据(如图2 所示) ,其FIFO中的数据长度都是64字节. 在主机进行枚举过程中,当节点接收到配置设备请求,固件程序就可以把EP1/EP3和EP2/EP4分别分配到同一个端点地址.USBN9603 内置有一个优先级表,如果多个端点编程指定为同一个端点号,具有较低号的端点(利用TOGGL 标志区分高低)首先得到响应和数据.

2. 1. 1  数据上传
  当主机发送一个IN 令牌给USB-CAN 适配器,适配器就开始向PC机发送数据. 图3 为数据上传的流程图. 通过两个标志UPDATE1 和UPDATE2 把主程序和Tx 中断子程序紧密联系起来,体现了前台后台程序设计思想. 当UPDATE1 清0 ,上传数据完毕;当置1 时,开始传输下一批数据. 图4为EP1的Tx中断子程序流程图,UPDATE1 在该中断子程序置1.UPDATE2的运行和UPDATE1相似.

图3  主程序处理上传送FIFO 数据流程

图4  EP1 的Tx 中断子程序流程


2. 1. 2  数据下传
  当主机发送一个OUT令牌给USB2CAN适配器,适配器就开始接收PC发送的数据,并将其暂存在ATmega8515 的RAM中,然后传到CAN总线控制器的数据发送缓冲区CAN.TX.Buffer. 图5 为EP2的Rx中断子程序流程,显示了PC的数据如何传到CAN总线的发送缓冲区. 端点EP4 的Rx 中断子程序流程和EP2的相似.


图5  EP2 的Rx 中断子程序流程

2. 2  USB-CAN适配器驱动程序编程
  USB-CAN适配器设备驱动程序采用Win2000DDK编写,在VC6.0+ +环境中编译. 驱动程序运行于内核模式,其程序组织主要是按功能进行划分,而不是一种层次结构. 即插即用例程和电源管理例程完全按照USB 标准总线驱动程序参考编写.一个驱动程序可以被多个类似的硬件使用,但驱动程序的某些全局初始化操作只能在第一次被装入时执行一次. 而DriverEntry例程就是用于这个目的,它是内核模式驱动程序主入口点. I/O管理器按下面方式调用该例程:
extern“C”NTSTATUS DriverEntry ( IN PDRIVER OBJ ECT DriverObject , INPUNICODE STRING RegistryPath)
DriverEntry 的第一个参数是一个指针,指向一个刚被创建的驱动程序对象.
DriverEntry 的第二个参数是设备服务键的键名.

本设计中该例程的各个域设置如下:
DriverObject - > DriverUnload =
  UsbCan- DriverUnload ;
DriverObject - > DriverExtension - > AddDevice =
  UsbCan- AddDevice ;
DriverObject - >MajorFunction[ IRP- MJ - CREATE] =
  UsbCan- DispatchCreate ;
DriverObject - >MajorFunction[ IRP- MJ - CLOSE] =
  UsbCan- DispatchClose ;
DriverObject - >MajorFunction[ IRP- MJ - READ] =
   
  UsbCan- DispatchRead ;
DriverObject - >MajorFunction[ IRP- MJ - WRITE] =
  UsbCan- DispatchWrite ;
DriverObject - > MajorFunction[ IRP- MJ - INTERNAL - DEVICECONTROL
] =
  UsbCan- DispatchInternalControl ;
DriverObject - >MajorFunction[ IRP- MJ - POWER] =
  UsbCan- DispatchPower ;
DriverObject - >MajorFunction[ IRP- MJ - PNP] =
  UsbCan- DispatchPnp ;
DriverObject - > MajorFunction [ IRP- MJ - DEVICE- CONTROL ]
=
  UsbCan- DispatchControl.

3  USB-CAN适配器的应用

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top