基于Linux的PC104总线与CAN总线通信设计
发布时间:2008/8/16 0:00:00 访问次数:572
1 引 言
pc104嵌入式工业计算机由于其小尺寸结构、堆栈式连接、轻松总线驱动的特点得到了广泛的应用。现场总线领域中,can总线得到了计算机芯片商的广泛支持,他们纷纷推出直接带有can接口的微处理器(mcu)芯片。
带有can的mcu芯片总量已经达到1亿3 000万片,因此在接口芯片技术方面,can已经遥遥领先于ff,pro-fibus,lonworks等其他所有现场总线。但是pc104总线不能与can总线直接通信,因此在can总线控制系统中难以运用。
针对以上问题,以avr单片机为协处理器设计了pc104总线与can总线的转换卡并且考虑到pc104嵌入式工业计算机上通常运行linux操作系统的特点,编写了转换卡linux下pc104总线访问双口ram的驱动程序。该转换卡运用在工业控制系统中,实际表明可以稳定可靠地运行。
2 硬件部分
pc104到can总线转换卡的硬件系统框图如图1所示。在pc104总线与can总线的通信中,要考虑的主要问题是pc104总线与can总线数据同步问题。pc104总线与can总线的总线速度存在很大差异,针对这样的问题通常采用的方法是使用双端口ram或fifo作为缓冲器,这里使用双端口ram作为数据缓冲,同时在双端口ram中预留几个字节作为atmega64处理器与pc104嵌入式计算机的软握手信号,通过以上方法完成pc104总线与can总线的数据同步。epm7128为altera的cpld,这里使用cpld主要用于pc104到can总线转换卡的地址译码。can总线通信选用sja1000 can总线控制器实现,为了适应工业现场恶劣的电磁环境,在sja1000与pc82c250中经过了光隔处理。
2.1 pc104总线与idt7134接口电路
pc104嵌入式计算机为了读取双端口ram idt7134的数据。首先将idt7134映射到pc104嵌入式计算机的存储器空间,使用smemr*、smemw*作为idt7134的oer,r/w控制信号。另外利用cpld epm7128将pc104总线的高3位地址sa19、sa18、sa17译码作为idt7134的片选信号。
2.2 atmega64与idt7134接口电路
处理器atmega64采用的是地址线、数据线分时复用技术,因此需要进行地址锁存。epm7128内使用vhdl硬件描述语言设计了该地址锁存器。atmega64与idt7134接口电路如图3所示。
2.3 cpld epm7128内部逻辑
cpld epm7128在整个设计中主要完成译码,与地址锁存的功能。在quartusⅱ6.0环境下,通过vhdl硬件描述语言,完成上述功能。其程序源码如下:
在上面的vhdl代码中cssja1000为sja1000片选信号,cs7134l为idt7134左端口片选,cs7134r为idt7134右端口片选。
3 软件部分
要实现pc104总线与can总线的数据通信,在上面的硬件设计中已经提到采用的是双端口 ram作为数据缓冲的方法,其中涉及在双端口ram中开辟数据区作为pc104嵌入式pc机与atmega64的软握手标志。握手过程要在pc104嵌入式pc机与atmega64的软件程序中实现,其过程如下:首先在双端口ram中开辟两个缓冲区,分别用来缓冲can总线的收发数据。当pc104总线有数据发到can总线上时,先将数据写到双端口ram的can数据发送缓冲区,然后向双端口ram预留的标志字段写入特定值,通告atmega64有数据要通过can总线发送,atmega64采用查询的方式检测这个标志字段,当检测到标志字段的特定值时,就读取双端口ram的can数据发送缓冲区,同时将读到的数据发到can总线上。上述过程后,atmega64程序将标志字段复位。至此完成了pc104总线对can总线的数据发送。can总线对pc104总线的数据发送与此过程相反。
3.1 atmaga64处理器程序
atmaga64处理器对can总线进行底层的读写工作,同时将数据写到双端口ram idt7134 中,并将idt7134中的首存储字节设为标志位,通知pc104嵌入式pc机有数据被更新,要求pc104嵌入式pc机对idt7134进行读操作。基于以上的过程atmaga64处理器程序包括对sja1000初始化程序、sja1000中断处理程序以及访问idt7134的程序。
3.2 pc104总线访问双口ram的linux驱动程序
linux驱动从结构上分为3个部分:
(1)设备的配置和初始化,包括检查设备的存在、状态,设备的注册及相关设备驱动程序的初始化。一般这部分程序仅在初始化时调用一次,他包含在init_module()例程中。
(2)i/o请求服务程序主要通过系统调用,完成用户的请求功能,如read,write等,设备的大多数操作都由i/o请求服务完成,主要包括read,write,ioct1等例程。
(3)中断服务子程序,由系统接收所有硬件中断,然后调用相应的中断服务子程序。
在linux系统里,设备驱动以文件的方式出现,因此设备驱动的接口就是一个文件系统的接口,该接口由一个数据结构struct file_operations{}来定义,该数据结构是整个虚拟文件系统的标准接口。因此首先定义了pc104总线访问双口ram驱动程序文件系统的数据结构。
对于pc104内存段linux内核在启动时就建立了访问这些地址的页表,访问他们的虚拟地址
1 引 言
pc104嵌入式工业计算机由于其小尺寸结构、堆栈式连接、轻松总线驱动的特点得到了广泛的应用。现场总线领域中,can总线得到了计算机芯片商的广泛支持,他们纷纷推出直接带有can接口的微处理器(mcu)芯片。
带有can的mcu芯片总量已经达到1亿3 000万片,因此在接口芯片技术方面,can已经遥遥领先于ff,pro-fibus,lonworks等其他所有现场总线。但是pc104总线不能与can总线直接通信,因此在can总线控制系统中难以运用。
针对以上问题,以avr单片机为协处理器设计了pc104总线与can总线的转换卡并且考虑到pc104嵌入式工业计算机上通常运行linux操作系统的特点,编写了转换卡linux下pc104总线访问双口ram的驱动程序。该转换卡运用在工业控制系统中,实际表明可以稳定可靠地运行。
2 硬件部分
pc104到can总线转换卡的硬件系统框图如图1所示。在pc104总线与can总线的通信中,要考虑的主要问题是pc104总线与can总线数据同步问题。pc104总线与can总线的总线速度存在很大差异,针对这样的问题通常采用的方法是使用双端口ram或fifo作为缓冲器,这里使用双端口ram作为数据缓冲,同时在双端口ram中预留几个字节作为atmega64处理器与pc104嵌入式计算机的软握手信号,通过以上方法完成pc104总线与can总线的数据同步。epm7128为altera的cpld,这里使用cpld主要用于pc104到can总线转换卡的地址译码。can总线通信选用sja1000 can总线控制器实现,为了适应工业现场恶劣的电磁环境,在sja1000与pc82c250中经过了光隔处理。
2.1 pc104总线与idt7134接口电路
pc104嵌入式计算机为了读取双端口ram idt7134的数据。首先将idt7134映射到pc104嵌入式计算机的存储器空间,使用smemr*、smemw*作为idt7134的oer,r/w控制信号。另外利用cpld epm7128将pc104总线的高3位地址sa19、sa18、sa17译码作为idt7134的片选信号。
2.2 atmega64与idt7134接口电路
处理器atmega64采用的是地址线、数据线分时复用技术,因此需要进行地址锁存。epm7128内使用vhdl硬件描述语言设计了该地址锁存器。atmega64与idt7134接口电路如图3所示。
2.3 cpld epm7128内部逻辑
cpld epm7128在整个设计中主要完成译码,与地址锁存的功能。在quartusⅱ6.0环境下,通过vhdl硬件描述语言,完成上述功能。其程序源码如下:
在上面的vhdl代码中cssja1000为sja1000片选信号,cs7134l为idt7134左端口片选,cs7134r为idt7134右端口片选。
3 软件部分
要实现pc104总线与can总线的数据通信,在上面的硬件设计中已经提到采用的是双端口 ram作为数据缓冲的方法,其中涉及在双端口ram中开辟数据区作为pc104嵌入式pc机与atmega64的软握手标志。握手过程要在pc104嵌入式pc机与atmega64的软件程序中实现,其过程如下:首先在双端口ram中开辟两个缓冲区,分别用来缓冲can总线的收发数据。当pc104总线有数据发到can总线上时,先将数据写到双端口ram的can数据发送缓冲区,然后向双端口ram预留的标志字段写入特定值,通告atmega64有数据要通过can总线发送,atmega64采用查询的方式检测这个标志字段,当检测到标志字段的特定值时,就读取双端口ram的can数据发送缓冲区,同时将读到的数据发到can总线上。上述过程后,atmega64程序将标志字段复位。至此完成了pc104总线对can总线的数据发送。can总线对pc104总线的数据发送与此过程相反。
3.1 atmaga64处理器程序
atmaga64处理器对can总线进行底层的读写工作,同时将数据写到双端口ram idt7134 中,并将idt7134中的首存储字节设为标志位,通知pc104嵌入式pc机有数据被更新,要求pc104嵌入式pc机对idt7134进行读操作。基于以上的过程atmaga64处理器程序包括对sja1000初始化程序、sja1000中断处理程序以及访问idt7134的程序。
3.2 pc104总线访问双口ram的linux驱动程序
linux驱动从结构上分为3个部分:
(1)设备的配置和初始化,包括检查设备的存在、状态,设备的注册及相关设备驱动程序的初始化。一般这部分程序仅在初始化时调用一次,他包含在init_module()例程中。
(2)i/o请求服务程序主要通过系统调用,完成用户的请求功能,如read,write等,设备的大多数操作都由i/o请求服务完成,主要包括read,write,ioct1等例程。
(3)中断服务子程序,由系统接收所有硬件中断,然后调用相应的中断服务子程序。
在linux系统里,设备驱动以文件的方式出现,因此设备驱动的接口就是一个文件系统的接口,该接口由一个数据结构struct file_operations{}来定义,该数据结构是整个虚拟文件系统的标准接口。因此首先定义了pc104总线访问双口ram驱动程序文件系统的数据结构。
对于pc104内存段linux内核在启动时就建立了访问这些地址的页表,访问他们的虚拟地址
上一篇:PXI总线仪用模块的设计与实现