文档章节

基于zynq的CAN接口移植

sspg
 sspg
发布于 2017/07/14 17:33
字数 641
阅读 15
收藏 0
点赞 0
评论 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
3.1K
4
RT-Thread 嵌入式操作系统 2.0.0 beta 发布

RT-Thread v2.0.0这个版本系列是RT-Thread嵌入式实时操作系统当前的开发分支,如果要上新项目,建议使用这个版本来进行,预计这个版本的正式版会在年底发布。欢迎对这个版本进行测试、并反馈...

午夜熊
2014/08/09
4.6K
8
基于Zynq的MIO与EMIO的区别和应用

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

feifansong
05/09
0
0
Zynq-Linux移植学习笔记之九-petalinux

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

jj12345jj198999
2017/02/26
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
Zynq_7000 sOC的初次使用

工具:vivado 2015、SDK 目的:初步掌握在Vivado集成开发环境下基于Zynq--7000 Soc实现嵌入式系统基本硬件和软件设计的方法和实现流程。 1、创建工程 注意:建议大家首先讲该文件zedboard复制...

lillian_trip
06/02
0
0
zynq中三种实现GPIO的方式

MIO和EMIO方式是使用PS部分的GPIO模块来实现GPIO功能的,支持54个MIO(可输出三态)、64个输入和128个输出(64个输出和64个输出使能)EMIO 而IP方式是在PL部分实现 GPIO功能,PS部分通过MAX...

u010830004
05/05
0
0
Vivado Zynq 入门学习之路

目标 --------------------------------------------------- 视图菜单 (Vivado SDK) 文件目录 文件格式 流程:工程 -> 非工程 -> 脚本 Create Hardware Design Create Hardware IP Use Hard......

ilmfmly
2017/05/20
0
0
可编程交换机--ONetSwitch

ONetSwitch是叠锶公司作为全球首款基于Zynq器件实现的OpenFlow Switch产品,作为理想的SDN教育科研平台,具备“软件可编程,逻辑可重构,硬件可扩展”能力,是面向SDN/OpenFlow的可编程交换机...

红薯
2015/04/17
633
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

记elasticdump 备份数据导出导入

版本: elasticsearch 5.5.2 elasticdump 2.2 系统 CentOS7.3 因项目需求 从生产导出一份索引到测试 帮助文档 https://github.com/taskrabbit/elasticsearch-dump?utm_source=dbweekly&utm_m......

雁南飞丶
6分钟前
0
0
saltstack配置目录管理

1.服务端配置 -接着编辑之前的 top.sls 文件 #vim /srv/salt/top.sls //修改为如下 base: 'slaver.test.com': - filedir -新建 filedir.sls 文件 # vim /srv/salt/filedir.sls file-dir: fi......

硅谷课堂
6分钟前
0
0
python日期时间

日期和时间 Python内建的datetime模块提供了datetime、date和time类型。datetime类型结合了date和time,是最常使用的: In [102]: from datetime import datetime, date, timeIn [103]:...

火力全開
13分钟前
0
0
你不了解的v-show

vue指令v-show的使用 1、判断谋个元素是否显示或隐藏 <el-button v-show="list.power == 1" @click="toUpload" class="toUpload" type="primary">去上传<i class="el-icon-upload el-icon--r......

不负好时光
15分钟前
0
0
网站从一万到亿级流量的全景描述

故事的开头 如果你一毕业参见工作就进入了大型互联网公司,那么恭喜你了,你将体验到大公司深厚的技术底蕴以及企业文化。 如果你进入到了一个初创的中小型企业,那么也恭喜你了,你将可能体会...

大大枣
15分钟前
0
0
Tomcat中JAVA JVM内存介绍、内存溢出及合理配置

一、Java JVM内存介绍 JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创...

學無止境
15分钟前
0
0
centOS7.4+nginx 1.12.2负载均衡

centOS7.4+nginx 1.12.2负载均衡 2018年04月10日 09:24:51 阅读数:58 1:参数信息 三台 centOS7.4 A,B,C A作为主服务器,B C作为分流的服务器 都搭建 nginx 1.12.2 一:安装 nginx 1:下载...

linjin200
21分钟前
0
0
分布式之抉择分布式锁

前言: 目前网上大部分的基于zookpeer,和redis的分布式锁的文章都不够全面。要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫。坦白说,这种老题材,很难写出新创意,博...

Java大蜗牛
26分钟前
1
0
rm: cannot remove `xxx’: Operation not permitted

rm: cannot remove `xxx': Operation not permitted可以先用lsattr xxx查看文件的隐藏属性。如果看到-----a-------的情况,可以用chattr -a xxx去除a属性,然后再进行删除就可以了....

殘留回憶
27分钟前
0
0
oracle 如何查看当前用户的表空间名称

如何查询当前用户的表空间名称?因为oracle建立索引,需要知道当前用户的表空间,查找了一下资料 --查询语法-- select default_tablespace from dba_users where username='登录用户' 如,...

youfen
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部