文档章节

基于zynq的CAN接口移植

sspg
 sspg
发布于 2017/07/14 17:33
字数 641
阅读 120
收藏 0

主机:Ubuntu 16.04

目标板:zynq + Linux内核4.4

一 硬件设计

    采用zynq的CAN接口,外面用物理芯片SN65HVD23x,挂载到CAN总线。开始感觉不用物理芯片也可以向串口一样进行回环测试,发现是不可能,查看CAN的协议可以发现原因。

    vivado生成相关文件,不在累述。

二 向内核中添加xilinx的can的驱动模块
[*] Networking support --->
    <*> CAN bus subsystem support --->
            CAN Device Drivers --->
                <*> Xilinx CAN
三 修改设备树文件
zynq-7000.dtsi文件中,已经包含CAN的设备树文件,只是status设置为了disabled
    can0: can@e0008000 {
        compatible = "xlnx,zynq-can-1.0";
        status = "disabled";
        clocks = <&clkc 19>, <&clkc 36>;
        clock-names = "can_clk", "pclk";
        reg = <0xe0008000 0x1000>;
        interrupts = <0 28 4>;
        interrupt-parent = <&intc>;
        tx-fifo-depth = <0x40>;
        rx-fifo-depth = <0x40>;
    };

    can1: can@e0009000 {
        compatible = "xlnx,zynq-can-1.0";
        status = "disabled";
        clocks = <&clkc 20>, <&clkc 37>;
        clock-names = "can_clk", "pclk";
        reg = <0xe0009000 0x1000>;
        interrupts = <0 51 4>;
        interrupt-parent = <&intc>;
        tx-fifo-depth = <0x40>;
        rx-fifo-depth = <0x40>;
    };
为了保持一致性,在system.dts文件中修改can的状态设置
    &can0 {
        status = "okay";
    };
    &can1 {
        status = "okay";
    };
三 通过cantest.c程序测试
可以通过ipconfig -a查看can接口状态
配置can0和can1

ip link set can0 down                                                           
ip link set can1 down                                                           
ip link set can0 type can bitrate 500000                                        
ip link set can1 type can bitrate 500000                                                           
ip link set can0 up                                                             
ip link set can1 up

can0和can1都挂载在can总线上
 

./cantest -r can0
./cantest -s can1

附cantest.c代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>


int main(int argc, char *argv[])
{
	int s, nbytes;
    int i;
	char *array[2] = {"-r", "-s"};
	struct sockaddr_can addr;
	struct ifreq ifr;
	struct can_frame frame;
	struct can_filter rfilter[1];


	/* handle (optional) flags first */
	if(argc != 3) {
		fprintf(stderr, "Usage:  %s <-r> <can interface name> for receiving\nor <-s> <can interface name> for sending\n", argv[0]);
		exit(1);
	}
    /* create socket */
	if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
	{
	    perror("Create socket failed");
	    exit(-1);
	}

	/* set up can interface */
	strcpy(ifr.ifr_name, argv[2]);
	printf("can port is %s\n",ifr.ifr_name);
	/* assign can device */
	ioctl(s, SIOCGIFINDEX, &ifr);
    addr.can_family = AF_CAN;
	addr.can_ifindex = ifr.ifr_ifindex;
    /* bind can device */
	if(bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0)
	{
		perror("Bind can device failed\n");
		close(s);
		exit(-2);
	}

	/* configure receiving */
	if(!strcmp(argv[1],array[0]))
	{
	    /* set filter for only receiving packet with can id 0x1F */
	    rfilter[0].can_id = 0x1F;
	    rfilter[0].can_mask = CAN_SFF_MASK;
	    if(setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter)) < 0)
	    {
	    	perror("set receiving filter error\n");
	    	close(s);
	    	exit(-3);
	    }
	    /* keep reading */
	    while(1){
	        nbytes = read(s, &frame, sizeof(frame));
	        if(nbytes > 0)
	        {
	        	printf("%s ID=%#x data length=%d\n", ifr.ifr_name, frame.can_id, frame.can_dlc);
	        	for (i=0; i < frame.can_dlc; i++)
	        		printf("%#x ", frame.data[i]);
	        	printf("\n");
	        }
	    }
	}
	/* configure sending */
	else if(!strcmp(argv[1],array[1]))
	{
        /* configure can_id and can data length */
		frame.can_id = 0x1F;
        frame.can_dlc = 8;
        printf("%s ID=%#x data length=%d\n", ifr.ifr_name, frame.can_id, frame.can_dlc);
        /* prepare data for sending: 0x11,0x22...0x88 */
        for (i=0; i<8; i++)
        {
        	frame.data[i] = ((i+1)<<4) | (i+1);
        	printf("%#x ", frame.data[i]);
        }
        printf("Sent out\n");
        /* Sending data */
        if(write(s, &frame, sizeof(frame)) < 0)
		{
            perror("Send failed");
            close(s);
            exit(-4);
		}
    }
	/* wrong parameter input situation */
	else
	{
	    printf("wrong parameter input\n");
	}

	close(s);
    return 0;
}

 

© 著作权归作者所有

共有 人打赏支持
sspg
粉丝 0
博文 1
码字总数 641
作品 0
南京
私信 提问
LEDE 17.01.0 发布,基于 OpenWrt 的嵌入式 Linux 发行

LEDE 17.01.0 发布了,LEDE (Linux Embedded Development Environment) 是在 OpenWrt 的开发者之间出现分歧后的一个分支。目前有关于合并 OpenWrt 和 LEDE 的传闻,但还未具体落实。 LEDE 1...

王练
2017/02/25
4.1K
4
Zynq-Linux移植学习笔记之九-petalinux

在对zynq上进行linux操作系统移植时,除了使用传统的由用户编译u-boot,kernel,rootfs方法外,目前主流采用vivado+petalinux操作方式。该操作方式能够快速生成适配于zynq的linux镜像,下文中进...

jj12345jj198999
2017/02/26
0
0
基于Zynq的MIO与EMIO的区别和应用

MIO与EMIO的区别与应用 1 MIO与EMIO概念 MIO:多功能IO接口,属于Zynq的PS部分,在芯片外部有54个引脚。这些引脚可以用在GPIO、SPI、UART、TIMER、Ethernet、USB等功能上,每个引脚都同时具有...

feifansong
2018/05/09
0
0
RZJM/Miz702_VGA

基于ZYNQ的VGA驱动,显示静态彩色图像,像素640*480 开发平台:Miz702(兼容Zedboard) 软件开发环境:Vivado Design Suit 2015.2 VGA driver based on the ZYNQ, show static color image, 64...

RZJM
2016/03/15
0
0
SylixOS 基于ZYNQ的时钟频率修改详解

概述 本文档以ZYNQ7000平台为例,详细介绍如何去修改ZYNQ的时钟频率。 时钟频率修改流程 ZYNQ7000的时钟频率修改流程,如图 2.1所示。具体步骤如下: 步骤一:解除ZYNQ7000的寄存器写锁定; ...

wy_study
2017/09/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
8
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
2
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
3
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部