当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]基于Linux的PC104总线与CAN总线通信设计

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总线与IDT7134接口电路图如图2所示。

      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内核在启动时就建立了访问这些地址的页表,访问他们的虚拟地址与实际物理地址不同,因此需要使用ioremap将物理地址映射到虚拟地址,才能够对PC104总线进行访问,来读取双口RAM数据。ioremap函数定义为:

      Void*ioremap(unsigned long phy_addr,unsigned longsize)

      参数phys_addr为物理地址,size为物理地址的长度。ioremap函数的返回值是一个特殊的虚拟地址,可以用来访问指定的物理内存区域,这个虚拟地址最后要调用iounmap来释放掉。以下将详细介绍Linux驱动程序的各个函数的具体实现。

      3.2.1 初始化函数与卸载函数实现

      设备的配置和初始化函数init_module()中分别调用:

      register_chrdev():进行设备注册;

      request_irq():请求中断通道;

      request_mem_region():分配I/O内存区域;

      ioremap():物理地址映射到虚拟地址。

      程序源代码如下:

      这就完成了设备驱动的初始化。设备驱动的卸载部分与初始化程序相反,卸载是回收分配给设备驱动程序的各种资源。cleanup_module()中分别调用:

iounmap():释放虚址;

release_mem_region():释放内存区域;

free_irq():释放中断通道。

程序源代码如下:

      3.2.2 读函数实现

      读函数定义了对双口RAM的读取过程,源代码如下:

      其中copy_to_user将内核函数将虚拟地址pPxp-VirtStartAddr上的count个数据拷贝到buf指针指向的用户空间上。之前设备的配置和初始化函数ink_module()中的ioremap()函数已经将双口RAM物理地址映射到虚拟地址pPxpVirtStartAddr上,因此可以通过pxp_read()函数读取双口RAM。

      3.2.3 写函数实现

      写双口RAM时调用pxp201_write()函数,其原理与读双口RAM相似,只是pxp201_write()函数中调用了copy_from_user()内核函数。

      3.2.4 open函数与release函数实现

      pxp_open()函数的实现如下,其中使用MOD_INC_USE_COUNT递增设备的引用计数。

      pxp201_release()函数与pxp_open()过程相反,使用MOD_DEC_USE_COUNT递减设备的引用计数。

       自此Linux下,双口RAM的驱动模块就完成了,可以利用Insmod工具将驱动程序模块装入内核。这样就可以在PC104嵌入式工业计算机的Linux操作系统下访问双端口RAM了。

      4 结 语

      本文介绍了PC104总线与CAN总线通信的硬件实现,并且在PC104嵌入式计算机的Linux操作系统下开发了PC104总线对双端口RAM IDT7134访问的驱动程序。在IDT7134内开辟标志区,利用软握手的方法实现了PC104总线与CAN总线的数据通信。该转换卡运用在工业控制系统中经过实际测试表明可以稳定可靠地运行。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

学习Linux动态链接库是一个绕不开的话题,我们今天就一起来看一下什么是动态链接库、动态链接库有什么好处、如何编译出一个动态链接库等几个关于动态链接库的几个基本概念,废话少说咱们直接开始

关键字: Linux 静态链接库 动态链接库

在Linux内核中,提供了一个用来创建双向循环链表的结构 list_head。虽然linux内核是用C语言写的,但是list_head的引入,使得内核数据结构也可以拥有面向对象的特性,通过使用操作list_head 的通...

关键字: Linux 内核链表

(全球TMT2022年9月15日讯)IBM于美国东部时间9月13日发布其下一代LinuxONE服务器,这是一个具有高度扩展性的基于Linux和Kubernetes的平台,旨在为企业提供所需的可扩展性,使其能用一个单一系...

关键字: IBM Linux NET 可扩展性

下一代LinuxONE服务器扩展了IBM帮助行业客户实现可持续目标的能力,花旗银行就是很好的例子 北京2022年9月14日 /美通社/ -- IBM(纽约证券交易所:IBM)于美国东部时间9月13日发布其下一...

关键字: IBM Linux X86 数据中心

(全球TMT2022年9月15日讯)IBM发布其下一代LinuxONE服务器,这是一个具有高度扩展性的基于Linux和Kubernetes的平台,旨在为企业提供所需的可扩展性,使其用一个单一系统就能支持成千上万的工作负...

关键字: GROUND IBM Linux 亚马逊

为了使得多种设备能通过网络相互通信,和为了解决各种不同设备在网络互联中的兼容性问题。

关键字: Linux 网络包

北京2022年8月26日 /美通社/ -- 双碳目标的实现或许任重道远,但是低碳、可持续的理念已经渗透到我们生活工作的方方面面。持续整个夏季的异常高温,以及四川等地限电,让许...

关键字: IBM 可持续发展 AI Linux

摩尔线程MTT S系列GPU与浩辰CAD Linux 版V2022软件产品近日完成兼容性适配。在双方工程师的通力协作下,摩尔线程MTT S系列GPU能够为浩辰CAD Linux软件提供快速运行所需的性能,并在持久的高负载...

关键字: 摩尔线程 GPU Linux

近日,摩尔线程MTT S系列GPU与中望二三维CAD Linux版产品完成产品兼容性认证。经摩尔线程和中望软件双方团队的共同严格测试,中望CAD Linux、中望3D Linux、中望CAD机械版Linux、中望CAD建...

关键字: 摩尔线程 GPU Linux

(全球TMT2022年6月7日讯)近日,上海安势信息技术有限公司(安势信息)对外宣布正式成为DevSecOps领域中国首家OpenChain项目会员。安势信息将同高通、谷歌、微软等其他全球企业共建可信、安全的软件供应链...

关键字: Linux PEN AI 供应链

嵌入式软件

15715 篇文章

关注

发布文章

编辑精选

技术子站

关闭