Linux-CPU与CAN设备
Linux下 CAN Bus协议的实现,有一部分是由硬件来实现,有一部分是软件实现。
CAN协议的实现,在不同平台上有不同的内核软件实现方式,在linux内核和MCU上的协议软件实现部分应该是不同的,大家的硬件实现部分不知道是否是相同的。
突然想到,给一个裸的MCU,是怎么把这些CAN之类的内核软件实现代码放进去的。 CPU有指令解释器。
CAN的硬件部分需要 CAN控制器 和 CAN收发器
像TX2、Xavier,以及STM32F103,都是只带CAN控制器,所以还需要外加 CAN收发器
Linux内核
Linux内核
动态内核:Linux 还是一个动态内核,支持动态添加或删除软件组件。被称为动态可加载内核模块,它们可以在引导时根据需要(当前特定设备需要这个模块)或在任何时候由用户插入。(百度百科)
你为什么学习 Linux 内核? - 嵌入式Linux的回答 - 知乎 感觉很有意思,对计算机运行又有了更深入的理解。
内核管理应用程序,也管理硬件(包含很多硬件驱动代码)
> 使用insmod安装内核模块: insmod hello.ko
> 使用lsmod查看已安装内核模块: lsmod
Socket CAN是Linux内核的一部分
Jetson TX2——CAN口的使用 可以参考一下这篇的步骤,使用can-utils工具测试TX2的CAN收发功能
canbus属性配置好像也得看一下,看到评论有人因为配置属性错误导致了一些问题。
SYSTECH USB-CAN总线分析仪Linux驱动安装篇(树莓派)
检查kernel里CAN相关的配置是否打开(默认已打开)
编译Linux驱动:
Load USB-CANmodul driver
$ sudo insmod systec_can.ko由于树莓派本身并不支持CAN总线,因此使用SPI接口的CAN控制器,搭配一个收发器完成CAN功能。
淘宝上有许多商家在售MCP2515 SPI转CAN的控制器通信模块,并且这些模块大都集成了CAN收发器。这些模块可能看起来样式不同,但是基本的针脚接法是一致的。
安装 SocketCAN工具 Can-utils Can-utils是基于SocketCAN的调试工具,类似串口调试助手的
Linux内核中的SocketCAN部分(API)
Linux内核Socket CAN中文文档 这篇来源比较贴近官方,提到内核中Socket CAN的文档(应该好好看看)
动机--为什么使用socket API接口?
在Socket CAN之前Linux中已经有了一些CAN的实现方法,那为什么还要启动Socket CAN这个项目呢?大多数已经存在的实现方法仅仅作为某个具体硬件的设备驱动,它们往往基于字符设备并且提供的功能很少。那些方案通常是由一个针对具体硬件的设备驱动提供的字符设备接口来实现原始can帧的发送和接收,并且直接和控制器硬件打交道。帧队列和ISO-TP这样的高层协议必须在用户空间来实现。就像串口设备接口一样,大多数基于字符设备的实现在同一时刻仅仅支持一个进程的访问。如果更换了CAN控制器,那么同时也要更换另一个设备驱动,并且需要大多数应用程序重新调整以适应新驱动的API。
Socket CAN被设计用来克服以上种种不足。这种新的协议族实现了用户空间的socket接口,它构建于Linux网络层之上,因此可以直接使用已有的队列功能。CAN控制器的设备驱动将自己作为一个网络设备注册进Linux的网络层,CAN控制器收到的CAN帧可以传输给高层的网络协议和CAN协议族,反之,发送的帧也会通过高层给CAN控制器。
The Linux Kernel-SocketCAN - Controller Area Network linux内核源码的网站,里面的Readme部分对SocketCAN的介绍和上面提到的更早版本的Linux内核的文档内容基本一样。
Linux CAN编程详解 介绍了几个关键的收发函数
由于系统将 CAN 设备作为网络设备进行管理,因此在 CAN 总线应用开发方面, Linux 提供了SocketCAN 接口,使得 CAN 总线通信近似于和以太网的通信,应用程序开发接口 更加通用, 也更加灵活。
在 Linux 系统中, CAN 总线接口设备作为网络设备被系统进行统一管理。在控制台下, CAN 总线的配置和以太网的配置使用相同的命令。
在控制台上输入命令:
ifconfig –a可以得到以下结果:
在上面的结果中, eth0 设备为以太网接口, can0和can1 设备为两个 CAN 总线接口。
Socket编程
Linux Socket编程 实验报告 Socket编程和TCP/IP网络通信比较相关
菜鸟教程——基于TCP协议的Socket通信(1) 做了一个简易聊天室,有点意思。
socket编程到底是什么? - hoodlum1980的回答 - 知乎
就是两个进程,跨计算机,他俩需要通讯的话,需要通过网络对接起来。
这就是 socket 的作用。打个比方吧,两个进程在两个计算机上,需要有一个进程做被动方,叫做服务器。另一个做主动方,叫做客户端。他们位于某个计算机上,叫做主机 host ,在网络上有自己的 ip 地址。一个计算机上可以有多个进程作为服务器,但是 ip 每个机器只有一个,所以通过不同的 port 数字加以区分。
因此,服务器程序需要绑定在本机的某个端口号上。客户端需要声明自己连接哪个地址的那个端口。两个进程通过网络建立起通讯渠道,然后就可以通过 recv send 来收发一些信息,完成通讯。所以 socket 就是指代承载这种通讯的系统资源的标识。
socket是什么?套接字是什么? socket编程全面讲解,很全面
我们所说的 socket 编程,是站在传输层的基础上,所以可以使用 TCP/UDP 协议,但是不能干「访问网页」这样的事情,因为访问网页所需要的 http 协议位于应用层。
Socket编程完成TCP/IP通信 比如 UR5机械臂的TCP/IP控制 ,上下位机的网口通信
socket编程:简单TCP服务器/客户端编程 三次握手属于TCP/IP协议的内容