linux下can通信代码,Linux环境下实现基于ARM9的CAN总线通信

⑵服务于I/O请求的子程序

这部分程序又被称为是驱动程序的上半部分。调用这部分程序是由于系统调用的结果。当该部分程序执行时,系统仍认为是与进行调用的进程属于同一个进程,只是由用户态变成了核心态。由于此部分程序是驱动程序与应用程序的接口,所以必须通过Linux下的一个关键的数据结构file_operations来实现该文件操作接口。file_operations结构中的成员几乎全是函数指针,实质上是一个函数跳转表。例如can_open入口点用来打开CAN设备准备进行I/O操作;can_read入口点用来实现接收CAN数据帧;can_write入口点用来实现发送CAN数据帧;can_ioctl入口点提供了一种执行CAN设备特定操作的方法,通过ioctl来实现对SJA1000寄存器的读写操作,使用户根据需要方便的配置SJA1000状态等等。

⑶中断服务子程序

这部分程序又被称为是驱动程序的下半部分。Linux系统负责接收硬件中断,再由系统调用中断服务子程序,而不是直接从ARM的中断向量表中调用这部分程序。在模块初始化时已经利用request_irq( )函数注册了设备中断,所以当IRQ(中断请求)产生时,ISR(中断服务例程)运行。在中断服务程序中,首先要读取SJA1000的中断寄存器IR的值,识别中断源,比如当接收中断位RI为1则说明是接收中断,进而调用接收函数来接收数据。当CPU读取这个只读存储器时,除了RI位外的所有位都被复位。

⑷缓冲区操作

SJA1000内部设有发送缓冲器TXB(13个字节),接收缓冲器RXB(13个字节)和RXFIFO(64个字节)。其中TXB是CPU和BSP(位流处理器)之间的接口,存储发送到CAN网络上的完整报文。接收缓冲器是接收过滤器和CPU之间的接口,用来接收和存储CAN总线上的报文,RXB是RXFIFO的一个窗口,可被CPU访问。为了提高收发效率,在驱动中开辟软件缓冲区,大小可以根据需要设置,将大量数据经过软件缓冲区后再进行处理。在操作软件缓冲区时,采用生产者/消费者模型,分别设定数据存入与读出的指针,并且利用memcopy函数完成对帧数据的操作。比如读取数据时,首先在操作模式下将SJA1000中起始地址为16的RXB数据读入一个数组,经过一些必要判断,再将此数组中的数据由memcopy函数传入指定的软件缓冲区。硬件缓冲与软件缓冲间一次传递一帧数据,帧有标准帧与扩展帧之分。

3.2  Shell应用程序的实现

Shell应用程序主要是为用户提供一系列方便直观的接口,使得用户不必了解硬件工作的细节,不必研究驱动的具体实现,而仅仅根据自身的需要,通过一些简单明了的命令来完成所要求的任务。本文就将在Shell应用程序中实现以下命令功能:

init初始化寄存器,rsja读取寄存器值,wsja写寄存器,gfrm收数据帧,sfrm发数据帧,conf配置滤波器,help帮助,exit退出。

在主函数main中,通过int open(const char * filename, int mode)函数打开CAN设备,得到一个文件句柄fd,将此句柄传递给shell函数,这样就可以在各个命令函数中对CAN设备进行操作,比如可以在函数int write_sja1000(int fd,unsigned char addr, unsigned char value)中使用ioctl(fd,SJA_WRITE,&reg_data)来实现对SJA1000寄存器的写操作。

在shell应用程序中,可以设定一个字符数组char cmd[5],通过fgets(cmd,5,stdin)来接收用户键入的命令,再经过strcmp函数辨认出用户的命令类型,执行相关操作。为避免输入缓冲区出现垃圾导致命令识别出现错误,需要及时清空输入缓冲,而当gcc中fflush函数无效的情况下,则可以通过while((c=getchar())!='n'&&c!=EOF){ }来清空输入缓冲。

完成了所有驱动以及应用程序的编写后,用Makfile文件制定编译规则,然后根据规则进行编译,调试成功后可将二进制代码通过超级终端下载到板子运行,至此结束所有工作。

4. 结语

本文提供了一种EP9315与CAN控制器SJA1000的接口方案,详细分析了Linux操作系统下驱动与应用程序的原理及开发流程,实现了CAN设备通信,并在实际应用和测试中证明了该设计的正确性和可靠性。由于嵌入式Linux的众多优势以及CAN的实时性,易用性,可靠性等优点,它们将在工业控制及生活的各个领域具有更广泛的应用前景。

本文作者创新点:利用EP9315与SJA1000实现CAN总线通信,完成了由硬件连接,底层驱动以致上层应用软件的所有工作,利用软件方便稳定的控制CAN通信。

c2c9ed493cd281aa86d8a6f5178c4c01.gif [1] [2] 610626052e95c7fbe3d254abc769d9ad.gif

本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值