基于Linux的PC104总线与CAN总线通信设计

欢迎进入IT技术社区论坛,与200万技术人员互动交流 >>进入

 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():物理地址映射到虚拟地址。

  程序源代码如下:

[1][2][3][4]

当你成功得意的时候,最重要的是瞧得起别人。

基于Linux的PC104总线与CAN总线通信设计

相关文章:

你感兴趣的文章:

标签云: