3 CAN接口硬件设计
can是一种基于广播的通讯机制,报文依靠报文标识符来进行识别。can协议支持两种帧格式,不同之处在于标识符域的长度不同,一种被称为can标准帧,支持11bit的标识符长度;另一种称为can扩展帧,支持29bit的标识符。
can接口芯片选用philips公司的can独立控制器sja1000。arm处理器at91rm9200内部集成了外部总线接口ebi,通过此接口与sja1000连接。从sja1000输出的can信号,通过光藕器件隔离后连接到收发器tja1050,收发器的输出与总线连接。
sja1000的地址线和数据线是分时复用的,而at91rm9200的外部数据总线接口ebi的地址线和数据线是相互独立的,因此,需要通过软件编程实现地址的锁存,以达到数据和地址的分时传输。硬件原理图如图3[3]。
图3CAN接口硬件原理图
sja1000的数据/地址复用总线直接与arm的ebi数据总线低8位连接,地址锁存信号/ale由arm的a0产生,/cs与/we分别由ncs4和new与a0经或运算后产生。由硬件电路可确定sja1000的物理地址是0x50000000。
风电场环境恶劣,为了保证控制系统准确传输数据,增强can总线节点的抗干扰性能, sja1000控制器经过高速光藕6n137隔离后与收发器tja1050相连,实现总线上各can节点之间的电气隔离。采用dc-dc电源隔离模块dcr010505,实现光耦两端的电源隔离。canh接总线的高电平端,canl接总线的低电平端。由于风电机组垂直距离较高,容易受雷电的影响,在两根can总线输入端与地之间分别并联一30pf的电容和一防雷击管,以滤除高频干扰和防止浪涌电压。
4 CAN接口通讯软件设计
对于can的通讯程序,采用分层处理的方法,包括驱动层和应用层。因此,can接口软件通讯包括两部分can驱动程序和can应用程序。驱动程序负责完成linux内核与sja1000之间的数据通讯,即linux内核设置sja1000的控制寄存器,读写sja1000接收、发送缓冲器。应用程序部分负责完成用户空间和内核空间的数据交换,以及分析从sja1000接收到的报文,封装要发送报文。接收的报文主要包括来自变流模块和变桨偏航控制模块的机组状态信息及风速风向、各类温度和转速信号等。发送的报文包括下发给变流模块和变桨偏航控制模块的控制指令及控制参数。
4.1 can驱动程序设计
(1)底层驱动程序总体设计。在linux中设备驱动程序是由一组数据结构和函数组成的,它包含设备服务子程序(如open、read、write、close、ioctl等)、初始化函数can_init()和中断处理程序can_interrupt()。
在linux加载can驱动时调用can_init(),向操作系统注册设备,同时完成can总线波特率的设置,id过滤器的设置,清空接收和发送缓冲区,开启中断等工作,完成初始化后,退出复位模式,进入正常的工作模式。
read从接收缓冲区读取数据;write向发送缓冲区写人数据;release关闭can 控制器;ioctl向can 控制器发各种操作命令,包括设置sja1000总线波特率、id过滤器等;open 打开can 控制器,并使用函数request_irq()向系统申请中断,并设置中断处理程序为can_interrupt(),当sja1000内部中断寄存器(ir)的任意位置为1时,int引脚低电平有效,调用其中断处理函数can-interrupt(),在该函数中读取中断控制寄存器,判断中断原因(接收中断、发送中断、错误中断、数据溢出中断、唤醒中断),从而调用相应的服务子程序。
(2)sja1000读写逻辑分析及设计。由于sja1000的地址线和数据线是分时复用的,需要通过软件编程模拟地址锁存信号,以达到数据和地址的分时传输,因此,在程序设计中,要考虑sja1000的读写时序。图4为sja1000的写时序图。
图4 sja1000写时序图
34