首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于ARM920T的两种CAN总线扩展方式(2)

基于ARM920T的两种CAN总线扩展方式(2)

3.2.1 IO接口连接
微处理器的通用IO口可以提供一个简便的方法来控制SJA100T。EP9315的GPIO信号提供了很大的灵活度来满足SJA1000T时间上的要求。将SJA1000T数据地址复用总线全部与EP9315的通用IO接口连接。其它信号线WR、RD、ALE……也与IO接口连接。具体连接方式参考图2。

  3.2.2 数据信号线连接

除了全部由IO端口来控制CAN模块,还可利用ARM9的数据线和信号线来实现CAN模块的扩展。连接电路如图3所示,凡SJA1000T以外的信号均为EP9315芯片上的信号管脚,SJA1000T数据地址复用总线与EP9315数据线相连,GPIOx、GPIOy、GPIOz可以是EP9315任意GPIO引脚,但选择同一个通道的GPIO口将使编程更容易。注意SJA100T的INT可以连接CPU的INT也可以连接到带有中断的通用IO上。在EP9315中,GPIO的通道A,B,F有中断功能。

图2和图3是示意图,具体的由于EP9315信号高电平为3.3V,而SJA1000T高电平为5V,故需要通过74LVC245这类电平匹配芯片进行电平匹配后再连接。
4、驱动开发
由于现场总线控制系统在许多场合具有实时性的要求,本现场总线控制系统采用实时性高的eCos作为操作系统,CAN驱动程序也在eCos操作系统 上进行扩展。
对eCos系统的设备驱动程序的设计主要围绕着DEVTAB_ENTRY和DEVIO_TAB进行,添加新设备的工作就是对这两个表项的各个域进行实现,并且编写与硬件相关的底层函数。通过对驱动程序结构层次的剖析,CAN总线驱动的开发分为四步:
第一步:向内核注册新设备;
第二步:开发驱动程序基本IO函数;
第三步:实现中断处理函数;
第四步:绑定设备中断并进行验证。
具体实现过程如下:
4.1 向内核注册新设备
在向内核注册新设备时,原有的驱动程序中和硬件无关的部分仍然可以使用,例如设备I/O函数表,硬件相关的部分需要自行设计,包括设备描述符、设备名、设备初始化程序init、查找程序lookup和拓展CAN总线的数据结构。
拓展CAN总线的数据结构Can_bus时一组用于描述对设备进行的全部操作的数据结构。通过宏Can_bus产生can总线的数据结构,宏Can_bus的原型为:
Can_bus(1,funs,modereg,intrenreg,bustime,outpctr,clkdiv,acptcode,acptmask,flag)
参数说明如下:
l-该数据结构的语言标识符
funs接口函数组,即硬件接口函数。
flags驱动程序初始表示值。
modereg工作模式初始值
intrenreg中断允许初始值
bustime总线时钟1,和总线时钟2初始值
outpctr输出控制
clkdiv分时
acptcode验收代码
acptmask验收屏蔽
在产生CAN总线的设备表入口时首先要创建can总线的数据对象Can_bus,并且初始化以上所有参数。拓展CAN总线的Can_bus数据对象标识符为EP9315_can_bus。
拓展CAN总线的设备表入口对象实现如下:
DEVTAB_ENTRY(EP9315_can_io0,
CYGDAT_IO_CAN_EP9315_CAN0_NAME,
0,
&cyg_io_can_devio,
EP9315_can_init, //拓展CAN的初始化函数
EP9315_can_lookup, //拓展CAN的查找函数
&EP9315_can_bus //CAN数据结构Can_bus
);
4.2 开发驱动程序基本IO函数
这部分函数指的是驱动程序接口函数中与硬件相关的部分,也就是Can_bus数据结构中的funs接口函数表。funs函数表通过以下宏进行定义:
CAN_FUNS(l,putc,getc,set_config,start_xmit,stop_xmit)
参数说明如下:
l是该funs函数表的C语言标实符。
putc函数:bool (*putc)(can_bus *priv,unsigned char c)该函数发送一个字符到串口。如果发送成功,则返回true,否则返回false。
getc函数:unsigned char (*getc)(can_bus *priv)该函数从设备接口读取一个字符,它只用于非中断方式,通过查询设备是否处于准备(ready)状态来等待一个字符。
set_config函数:bool (*set_config)(can_bus *priv,cyg_can_info_t *config)该函数用于对指定的端口配置。如果对硬件配置成功,则返回true;如果端口不支持给定的配置参数,则返回false。
start_xmit函数:void (*start_xmit)can_bus *priv)在中断方式下,该函数使能发送端,允许发送中断的产生。
stop_xmit函数:void (*stop_xmit)(can_bus *priv)在中断方式下,当数据发送结束后,该函数进制发送端,进制发送中断产生。
start_recv函数:void (*stop_xmit)(can_bus *priv)
stop_recv函数:void (*stop_xmit)(can_bus *priv)
继承事业,薪火相传
返回列表