2013年6月28日 alex

在EP9315(arm920t)标板外扩can总线控制 其他ARM9可类比实现

【2007.10】
压缩包里有原理图和对应的linux标准字符设备驱动程序,原理图中的标号与edb9315a标板中的标号对应.
汽车总线can在工业控制中因其低功耗优于ip互联网,因其性能优于传统485等总线,越来越受应用开发和系统集成者青睐.这里给出一个在arm9平台ep9315实现的can总线外扩的解决方案.方案将常用can总线控制器sja1000t挂在数据总线,使用一个外部片选和两个gpio控制,提供了在linux2.4的sja1000字符设备驱动程序,实现sja1000在peliCAN模式下(支持CAN2.0)的can数据侦收发,经测试可以正常使用.
像类似的扩展在arm9或其他应用中十分常见,最常见到的是一些arm9结合dsp ic的平台,它们也是使用这种方式,以前我做过一个2410控制ac488的ip电话方案就也是如此.一般的控制扩展都是将外部控制ic挂在数据总线,用cpu的外部片选,gpio或地址总线组合控制时序.在linux系统中,对这种扩展经常使用常规字符驱动程序编写具体的时序控制,为应用软件提供控制接口.这里给出的sja1000驱动程序十分简单,和其他此类的应用类似(简单的实现sja1000的初始化,开辟一个小数据缓冲,实现can总线数据的读写,request一个irq,处理sja1000发出的中断).
在开发中主要遇到的问题有以下几点.
一是对peliCAN模式下can2.0b扩展侦的收发尝试,因为sja1000对于29bitID数据侦那部分数据存储器是多出来交叠复用的寄存器,驱动程序想弄个标准数据侦和扩展侦复用的比较麻烦,懒得写了,给出的这个是写死了只支持标准11bitID数据侦的,如果需要扩展的can2.0b收发,就麻烦点自己再改改弄弄吧..
二是起初can总线连接线无法过长,才几十厘米就发不通了,很短的时候可以收发正常.我的数据收发测试是使用microchip的pic单片机pic18f2580外接2551can收发器直接与这里arm板外扩的can总线相连的,直接测线比较长时传输线上的扰波十分猛..最开始认为是端电阻没加会不会有问题,后来发现其实加不加似乎都一样,又怀疑了其他地方的干扰或不同的can收发器ic会不会带来兼容性问题,后来这方面也排除了..最后发现居然是电源干扰过大引起的,再次印证了那句话,”管什么不好,先查电源”..ft~
这个ep9315平台扩展can总线的方案主要用于以下网络模型:
一个ep9315的系统作为核心结点,下面通过can总线接很多单片机板做成的结点,一个个单片机结点可以控制或采集一些io等,而这些单片机又通过一定的协议被核心ep9315结点控制,这样一个ep9315结点就可以通过can总线控制和采集很多io或其他信号(如rs232,spi,iic etc.),而ep9315自身的接口如uart,spi,iic等也可以另外单独使用,每个ep9315结点实际上相当于一台嵌入式工控机.多个9315的核心结点再用以太网连接组成局域网,最终数据汇总到一台互联网上的服务器,服务器可以分别控制各个ep9315结点(一般直接使用普通tcp连接即可,不同操作系统间进行socket通讯).整体形成一个低功耗高性能的优质工业控制网络.实际上类似的网络我几年前已经实现过一个(以太网和485,没用can总线),当时没有项目可以具体应用,所以后来搁置不理了.
ps. 在写这篇文的时候ep9315的所有开发资料是在cirrus logic网站公开的,不需要签什么保密协议就可以全部免费download到,其实大多数厂商都是很开放的,包括atmel等,用9200的时候获得资料也很容易..不像marvell那么变态,搞几片破arm还要签保密协议,鄙视(-n-)…cirrus logic本身做的开发十分到位,这也是我喜欢用9315的原因之一哈~