0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术EM9287 Linux Socket CAN驱动简介

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-01-16 10:12 次阅读

一、简述

EM9287工控主板CPU为Freescale 的iMX287,主频454MHz,以具有丰富的通讯接口为特色,可同时支持双网口、7路串口、32路GPIO、SPI、I2C以及CAN通讯等接口。CAN是一种在世界范围内广泛用于自动控制、嵌入式设备和汽车领域的网络技术,EM9287 的CAN通讯接口是通过FlexCAN模块来实现控制局域网络协议(CAN)通信的,FlexCAN模块同时支持CAN协议规范2.0,包括协议所规定的标准帧和扩展帧。

Linux下最早使用CAN的方法是基于字符设备来实现的,在EM9287上移植的Linux-3.9.7内核中FlexCAN模块驱动实现的是Socket CAN方式,Scoket CAN使用了socket接口和Linux网络协议栈,这种方法使得CAN设备驱动可以通过网络接口函数来调用,这样大大地方便了熟悉Linux网络编程程序员,由于调用的都是标准的socket 函数,也使得应用程序便于移植,而不会因为硬件的调整而修改应用程序,这样加强了应用程序的可维护性。关于Socket CAN在Linux内核文档中有更为详细的介绍(/Linux-3.9.7/Documentation/networtking/can.txt)。

本文将简要介绍EM9287在Linux-3.9.7内核上如何实现CAN驱动以及如何在应用程序中使用Socket CAN。

二、Linux内核配置

内核配置中增加以下选项(make menuconfig):

Networking support --->
<*> CAN bus subsystem support --->
<*> Raw CAN Protocol (raw access with CAN-ID filtering)
<*> Broadcast Manger CAN Protocol (with content filtering)
<*> CAN Gateway/Router (with netlink configuration)
CAN Device Drivers --->
<*> Platform CAN drivers with Netlink support
[*] CAN bit-timing calculation
<*> Support for Freescale FLEXCAN based chips

EM9287移植的是Linux-3.9.7版本,对于硬件的描述和配置都是通过device tree相关文件进行传递,除了内核的配置外,还需要在相应的dst文件中增加can0节点。如:

can0: can@80032000 {
compatible = 'fsl,imx28-flexcan', 'fsl,p1010-flexcan';
reg = <0x80032000 0x2000>;
interrupts = <8>;
clocks = <&clks 58>, <&clks 58>;
clock-names = 'ipg', 'per';
pinctrl-names = 'default';
pinctrl-0 = <&can0_pins_a>;
};

内核编译成功后,板卡启动显示即表示flexcan驱动加载成功。

[ 2.022398] CAN device driver interface
[ 2.031257] flexcan 80032000.can: device registered (reg_base=f5032000, irq=190)

三、Socket CAN的测试

Socket CAN 的使用会用到ip命令工具,由于busybox中的ip没有支持 socket can,所以需要重新移植ip工具,iproute2中的ip可以支持socket can。

1、移植iproute2
从iproute2官方网站上下载源码,我们这里用到的是iproute2-3.10.0.
1) tar jxvf iproute2-3.10.0
2) 修改Makefie
CC=arm-none-linux-gnueabi-gcc
由于只用到ip工具,所以将别编译目录屏蔽:
#SUBDIRS=lib ip tc bridge misc netem genl man
SUBDIRS=lib ip
3) make编译成功后生成 “ip”
4) 将ip复制到EM9287的文件系统中,替换原来busybox中的ip

这样ip命令工具就算是移植好了。

2、使用ip命令配置can0接口。
// 关闭can0接口,以便进行配置
ifconfig can0 down
// 方法一:配置can0的波特率为250Kbps
ip link set can0 type can bitrate 250000
// 方法二:配置can0的波特率为250Kbps
ip link set can0 type can tp 250 prog-seg 5 phase-seg1 8 phase-seg2 2 sjw 2
// 启动can0接口
ifconfig can0 up

EM9287的FLEXCAN时钟选用的是24MHz的外部晶体振荡时钟。为了适应各种不同的采样率,我们采用方法二来对can的波特率进行设置,以CiA推荐的采样点在bit的87.5%处,作为基准来计算:

波特率 PRESDIV
-> fTq
TSEG1 TSEG2 TQ 采样点
PROPSEG+PSEG1+2 PSEG2+1
1000 1 -> 12MHz (0 + 7 + 2)= 9 (1+1)= 2 12 83.3%
800 1 -> 12MHz (3 + 7 + 2)= 12 (1+1)= 2 15 86.6%
500 2 -> 8MHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%
250 5 -> 4MHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%
125 11 -> 2MHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%
100 14 -> 1.6MHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%
60 24 -> 960KHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%
50 29 -> 800KHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%
20 74 -> 320KHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%
10 149 -> 160KHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%

3、Scoket CAN测试代码

就像TCP/IP协议一样,在使用CAN网络之前首先需要打开一个套接字。CAN的套接字使用到了一个新的协议族PF_CAN,所以在调用socket( )这个系统函数的时候需要将PF_CAN作为第一个参数。当前有两个CAN的协议可以选择,一个是原始套接字协议( raw socket protocol),另一个是广播管理协议BCM(broadcast manager)。作为一般的工业应用我们选用原始套接字协议:

s = socket(PF_CAN, SOCK_RAW, CAN_RAW);

在成功创建一个套接字之后,通常需要使用bind( )函数将套接字绑定在某个CAN接口上。在绑定 (CAN_RAW)套接字之后,就可以在套接字上使用read( )/write( )进行数据收发的操作。

基本的CAN帧结构体和套接字地址结构体定义在include/linux/can.h

/*
* 扩展格式识别符由 29 位组成。其格式包含两个部分:11 位基本 ID、18 位扩展 ID。
* Controller Area Network Identifier structure
*
* bit 0-28 : CAN识别符 (11/29 bit)
* bit 29 : 错误帧标志 (0 = data frame, 1 = error frame)
* bit 30 : 远程发送请求标志 (1 = rtr frame)
* bit 31 :帧格式标志 (0 = standard 11 bit, 1 = extended 29 bit)
*/
typedef __u32 canid_t;
struct can_frame {
canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
__u8 can_dlc; /* 数据长度: 0 .. 8 */
__u8 data[8] __attribute__((aligned(8)));
};

以下为相关的测试代码:

int main( int argc,char* argv[] )
{
int i1, ret;
int nbytes, baudrate;
int s;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
printf( 'SocketCAN Test V1.0\n' );
// 解析命令行参数, CAN波特率
if( argc > 1 )
{
baudrate = atoi( argv[1] );
}
else
{
baudrate = 250000;
}
printf( 'bitrate is %d\n', baudrate );
set_can_bittiming( baudrate );
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
printf( 'SOCK_RAW can sockfd:%d\n', s );
if( s < 0 )
{
return -1;
}
int loopback = 0; /* 0 = disabled, 1 = enabled (default) */
setsockopt(s, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &loopback, sizeof(loopback));
strcpy(ifr.ifr_name, 'can0' );
ret = ioctl(s, SIOCGIFINDEX, &ifr);
if( ret < 0 )
{
return -1;
}
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind(s, (struct sockaddr *)&addr, sizeof(addr));
for( i1=0; i1<10; i1++ )
{
nbytes = read(s, &frame, sizeof(struct can_frame));
if (nbytes < 0) {
perror('can raw socket read');
return 1;
}
if( nbytes < (int)sizeof(struct can_frame))
{
perror('read: incomplete CAN frame\n');
return 1;
}
/* do something with the received CAN frame: send back */
nbytes = write(s, &frame, sizeof(struct can_frame));
printf( '%d sendbytes: %d\n', i1+1, nbytes );
}
close( s );
return 0;
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10992

    浏览量

    206744
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6064

    浏览量

    34616
收藏 人收藏

    评论

    相关推荐

    全新Linux环境PCAN驱动程序发布!CAN/CAN FD通信体验全面升级!

    全新8.17.0版本的PCAN-Linux驱动程序正式发布,专为CANCAN FD接口量身打造。无论是CAN 2.0 a/b还是
    的头像 发表于 04-19 10:38 135次阅读

    亿道信息新三防平板EM-I10J,性能和价格成最大亮点

    亿道信息近期推出了一款新三防平板电脑名为EM-I10J,这款设备上市的初衷是为了在满足客户作业需求的同时为其提供更合适的价格选择,但这并不意味着EM-I10J的实力可以被小觑。
    的头像 发表于 02-28 10:54 137次阅读

    linux安装网卡驱动教程

    支持情况。一般来说,大部分常见的网卡型号都有对应的Linux驱动,可以在Linux官方的驱动支持列表中找到相关信息。如果你的网卡型号在列表中
    的头像 发表于 11-17 11:11 1647次阅读

    Socket 网络编程框架介绍

    Socket 网络编程框架 Socket(套接字)是一个网络编程概念,描述了一个通信端点(Endpoint),用于建立网络连接(Connection)并传输数据。 Linux Kernel 提供
    的头像 发表于 11-09 14:19 349次阅读
    <b class='flag-5'>Socket</b> 网络编程框架介绍

    信息技术是干什么?

    广播电子技术信息技术
    橙群微电子
    发布于 :2023年09月22日 09:17:48

    集成电路是现代电子信息技术的基础

    集成电路是现代电子信息技术的基础 随着科技的不断发展,集成电路技术已成为现代电子信息技术的基础之一。它的应用范围已经涉及到电子、通信、计算机、军事等行业,已经为人们的生活和工作带来了极大的便利
    的头像 发表于 08-29 16:25 1275次阅读

    信息技术促使轨道交通全面升级

    有别于传统的铁公路系统,新型基础建设强调的是将新一代的信息技术纳入基建领域,在未来的交通系统中,智能化、信息化的轨道交通系统网络,搭配5G等技术的发展,将是实现智能城市轨道交通的主要驱动
    的头像 发表于 08-21 11:11 481次阅读

    华秋硬联合安加速器,加速和创新赋能技术驱动型创业者

    167亿,获2轮及以上融资的企业占比达54%。 02****生态伙伴介绍:安加速器 **安加速器作为Arm全球唯一加速器,依托于Arm全球庞大的生态系统资源及行业领先的技术,**通过创业加速和创新赋
    发表于 08-18 14:37

    CAN和CANFD协议简介(下)

    前篇内容请点击查看: RA MCU CAN和CANFD IP介绍 CAN和CANFD协议简介(上) 2. CAN协议 2.2 协议层 前文 讲述了C
    的头像 发表于 08-02 12:15 1475次阅读
    <b class='flag-5'>CAN</b>和CANFD协议<b class='flag-5'>简介</b>(下)

    2023年国家级高职学校信息技术教师能力培训会圆满举行

    2023年国家级高职学校信息技术教师能力培训会圆满举行
    的头像 发表于 07-31 22:56 391次阅读
    2023年国家级高职学校<b class='flag-5'>信息技术</b>教师能力培训会圆满举行

    中科驭数成为证券基金行业信息技术应用创新知识库首批合作厂商!

    7月20日,证券基金行业信息技术应用 创新中心与中国信息通信研究院携手合作,正式上线了行业信息技术应用创新知识库, 旨在做好对行业信息技术应用创新工作的支撑,加强产业侧和行业机构之间的
    的头像 发表于 07-21 18:50 325次阅读
    中科驭数成为证券基金行业<b class='flag-5'>信息技术</b>应用创新知识库首批合作厂商!

    2023年中海达星推官系列直播再度启航,与您一起探讨空间信息技术

    人工智能、5G、云计算、物联网等新兴技术逐步融入生活,驱动生产、生活和治理方式的不断变革。而在北斗三号全球组网的背景下,空间信息技术也在催生变化,拓宽应用场景,深化行业应用,筑造行业未来。 2022
    的头像 发表于 06-26 14:22 288次阅读
    2023年中海达星推官系列直播再度启航,与您一起探讨空间<b class='flag-5'>信息技术</b>

    2023年中海达星推官系列直播再度启航,与您一起探讨空间信息技术

    信息技术
    中海达
    发布于 :2023年06月21日 11:45:49

    中科曙光参建国内首个信息技术领域产教融合共同体

    “新一代信息技术产业产教融合共同体”在京成立(简称“共同体”)。**该共同体是由中国电子学会联合国内信息技术行业重点职业院校与重点企业成立的。首批成员单位的11家新一代信息技术领域领先职业院校校长,以及9家行业知名企业领导共同出
    的头像 发表于 06-13 12:38 442次阅读

    权威榜单发布!“2022-2023信息技术应用创新榜”隆重揭晓

    2023年5月8日,由信息化观察网、信息技术应用创新榜组委会组织发起的“2022-2023信息技术应用创新榜”评审结果正式公示。本次榜单征集旨在全面展示信创发展最新成果,遴选出信创细分领域创新
    的头像 发表于 05-09 09:40 850次阅读