文档章节

基于zynq的CAN接口移植

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

精选30+云产品,助力企业轻松上云!>>>

主机: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
南京
私信 提问
加载中
请先登录后再评论。
XILINX_zynq_详解(6)

今天开始划重点    PYNQ PYNQ=python+ZYNQ 先引用一下yf869778412的博文: --------------------------------------------引用开始-----------------------------------------------------......

osc_7nbbniav
2019/01/09
10
0
ZYNQ | 学习路线

本文分享自微信公众号 - 数字积木(ggreat-top)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。...

数字积木
04/30
0
0
ZYNQ学习简记

ZYNQ学习笔记 项目简述 ZYNQ学习笔记 总结 项目简述 ZYNQ是Xilinx公司比较具有特色的SOC芯片,内部分为PS与PL端。其中PS端包括ARM内核,PL端就是我们常说的FPGA部分。PS端的开发与嵌入式开发...

朽月
05/25
0
0
开源 zynq EBAZ4205矿卡 vivado U-boot kernel debian 源代码

看不少坛友收了 EBAZ4205 这个低价zynq板卡,但是苦于没资料入不了门,论坛上都是点灯的,复杂点的uboot kernel dts rootfs没有人做。 估计新手不会做,老手懒得做,所以我就花几天时间移植了...

whoisliang
04/07
305
0
PYNQ = Python + ZYNQ —— ZYNQ部分功能的Python化

PYNQ 优点: 1、 Python用于ZYNQ开发,Python库和FPGA硬件库可以直接调用,极大加快开发进程、缩短开发周期、降低开发难度,更方便、快捷; 2、 用PYNQ开发,当Python有更加有效的可用库时(...

osc_zrrg1637
2018/02/27
3
0

没有更多内容

加载失败,请刷新页面

加载更多

Hacker News 简讯 2020-07-14

更新时间: 2020-07-14 01:01 I Know What You Download on BitTorrent - (iknowwhatyoudownload.com) 我知道你在BitTorrent上下载了什么 得分:196 | 评论:159 Show HN: Primo – all-in-one......

FalconChen
今天
114
0
绕过移动端系统限制的 dlopen 库 byOpen

byOpen是一个绕过移动端系统限制的增强版dlfunctions库。 支持特性 Android 支持App中加载和使用Android系统库接口(即使maps中还没有被加载也支持)。 Android 7以上dlopen, System.load都是...

shzwork
昨天
25
0
Golang学习系列第二天:变量、常量、数据类型和流程语句

继golang第一天后,今天学习下golang的变量、常量、数据类型和控制流语句。 做过其他编程语言(比如JavaScript,java,python)项目的话,其实很好理解变量、常量、数据类型和控制流。 变量也...

董广明
昨天
48
0
redis系列之——一致性hash算法

一致性hash算法你了解吗?什么时候使用?解决什么问题?redis集群模式使用了一致性hash算法了吗? 数据分片(sharding) 分布式数据存储时,经常要考虑数据分片,避免将大量的数据放在单表或...

诸葛小猿
昨天
15
0
IMDB是否提供API? [关闭] - Does IMDB provide an API? [closed]

问题: I recently found a movie organizer application which fetches its data from the IMDB database . 最近,我发现了一个电影管理器应用程序,该应用程序从IMDB数据库中获取其数据。 ...

fyin1314
昨天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部