由于采用ramdisk文件系统,自带的ip工具版本太旧无法配置can,需要自行编译ip,具体参见参考文献2

1.vivado配置ps

2.设备树增加can0,一般开发板均已提供此配置

can@e0008000 {
compatible = "xlnx,zynq-can-1.0";
status = "okay";
clocks = <0x1 0x13 0x1 0x24>;
clock-names = "can_clk", "pclk";
reg = <0xe0008000 0x1000>;
interrupts = <0x0 0x1c 0x4>;
interrupt-parent = <0x3>;
tx-fifo-depth = <0x40>;
rx-fifo-depth = <0x40>;
};

3.kernel配置,一般已配好,具体参见参考文献1

4.测试

# ifconfig -a
can0 Link encap:UNSPEC HWaddr ---------------
NOARP MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (0.0 B) TX bytes: (0.0 B)
Interrupt: eth0 Link encap:Ethernet HWaddr :0A::::
inet addr:192.168.0.120 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (465.3 KiB) TX bytes: (18.1 KiB)
Interrupt: Base address:0xb000 lo Link encap:Local Loopback
LOOPBACK MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (0.0 B) TX bytes: (0.0 B)

设置can0的波特率,这里设置的是100k, ip程序一般需要自己编译生成,参见2
#./ip link set can0 up type can bitrate 100000
显示can0状态信息
#./ip -d -s link show can0

Z-turn# ./ip link set can0 type can bitrate
xilinx_can e0008000.can can0: bitrate error 0.0%
Z-turn#./ip link set can0 up
Z-turn#./ip -d -s link show can0
: can0: <NOARP,UP,LOWER_UP,ECHO> mtu qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen
link/can promiscuity
can state ERROR-ACTIVE (berr-counter tx rx ) restart-ms
bitrate sample-point 0.750
tq prop-seg phase-seg1 phase-seg2 sjw
xilinx_can: tseg1 .. tseg2 .. sjw .. brp .. brp-inc
clock
re-started bus-errors arbit-lost error-warn error-pass bus-off
numtxqueues numrxqueues
RX: bytes packets errors dropped overrun mcast TX: bytes packets errors dropped carrier collsns

5.下面程序为收发测试,也可参见参考文献3

/*****************************************************************************
* Copyright (c) 2014-2017 MYIR Tech Ltd.
* File: can-test.c
* Date: 2014/11/3
* Author: Kevin Su
* Description: A demo program to show how to transmit/receive data with
* socket can interface on CAN bus.
* Please note that, this demo needs two boards to run as
* transmitter and receiver.
* Before run "can-test", we need to config the bitrate with
* "ip" command:
* # ip link set can0 up type can bitrate 100000
*/ #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/can.h>
#include <linux/can/raw.h> #define DEBUG 1 #define ERR_MSG(fmt, args...) fprintf(stderr, fmt, ##args)
#ifdef DEBUG
#define DBG_MSG(fmt, args...) fprintf(stdout, fmt, ##args)
#else
#define DBG_MSG(fmt, args...)
#endif #ifndef PF_CAN
#define PF_CAN 29
#endif #ifndef AF_CAN
#define AF_CAN PF_CAN
#endif int main(int argc, char *argv[])
{
int fd, ret, flag, len;
char senddata[] = "test";
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
socklen_t socket_len = sizeof(struct sockaddr_can); /* Create a socket with PF_CAN family, SOCK_RAW and CAN_RAW protocol */
fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);
if (fd < ) {
ERR_MSG("Open socket failed!\n");
return fd;
} /* Use can0 */
strcpy((char *)(ifr.ifr_name), "can0"); /* Get information */
ret = ioctl(fd, SIOCGIFINDEX, &ifr);
if (ret != ) {
ERR_MSG("SIOCGIFINDEX failed! ret:%d\n", ret);
close(fd);
return ret;
}
DBG_MSG("can0 can_ifindex = %x\n",ifr.ifr_ifindex); /* Disable loopback */
flag = ;
ret = setsockopt(fd, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &flag, sizeof(flag));
if (ret != ) {
ERR_MSG("Set loopback disable failed! ret:%d\n", ret);
close(fd);
return ret;
}
DBG_MSG("Set can0 loopback disable\n"); /* Disable receiving own message */
flag = ;
ret = setsockopt(fd, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS,
&flag, sizeof(flag));
if (ret != ) {
ERR_MSG("Disable receiving own message failed! ret:%d\n", ret);
close(fd);
return ret;
}
DBG_MSG("Disable receiving own message\n"); /* Use AF_CAN protocol family */
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex; /* Binding socket */
ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
if (ret != ) {
ERR_MSG("Bind socket failed! ret:%d\n", ret);
close(fd);
return ret;
}
DBG_MSG("Bind can0 socket\n"); frame.can_id = 0x123;
len = strlen(senddata); while () {
strncpy((char *)frame.data, senddata, len);
frame.can_dlc = len;
ret = sendto(fd, &frame, sizeof(struct can_frame), , (struct sockaddr*)&addr, sizeof(addr));
if (ret > ) {
DBG_MSG("Send success: [%s], ret=%d\n", senddata, ret);
ret = recvfrom(fd, &frame, sizeof(struct can_frame), , (struct sockaddr *)&addr, &socket_len);
if (ret > ) {
DBG_MSG("Recv message: [%s], ret=%d\n", frame.data, ret);
}
}
usleep();
} return ;
}

超时设置(参考文献4):

struct timeval timeout = {,}; //1.0s
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));

对于offline节点处理:

如果该控制器没有连接到can网络上,调用send会返回成功,但只是发送至kernel的缓冲区,并非发送至can网络。kernel会一直尝试重发,即使关闭socket或结束进程都不会取消重  发操作,此时如果将控制器连接到can网络上则会一次性将缓冲区内所有内容发出,有时这并非所要结果。如果想要清空发送和接收缓冲区,只能重启can接口

ifconfig can0 down
ifconfig can0 up

在程序中可使用system调用。

有两点注意就是:
1)recv ()的第四个参数需为MSG_WAITALL,在阻塞模式下不等到指定数目的数据不会返回,除非超时时间到。

2)即使等待超时时间值未到,但对方已经关闭了socket, 则此时recv()会立即返回,并收到多少数据返回多少数据。

参考文献:

1.http://xilinx.eetrend.com/blog/12062

2.http://www.cnblogs.com/hujianhua/p/8446291.html

3.https://wenku.baidu.com/view/65baea51bb68a98271fefaa7.html

4.https://blog.csdn.net/newger/article/details/2459113

zynq+linux+ramdisk can调试的更多相关文章

  1. Linux systemd 打开调试终端、添加开机自运行程序

    /************************************************************************* * Linux systemd 打开调试终端.添加 ...

  2. linux + ffmpeg + eclipse 调试

    使用linux + ffmpeg + eclipse调试步骤OS : ubuntu 12.04Eclipse : 3.7.2 为Eclipse安装cdt插件,使其支持c/c++ 导入ffmpeg项目 ...

  3. pycharm远程linux开发和调试代码

    pycharm是一个非常强大的python开发工具,现在很多代码最终在线上跑的环境都是linux,而开发环境可能还是windows下开发,这就需要经常在linux上进行调试,或者在linux对代码进行 ...

  4. zynq linux驱动之PL-PS中断【转】

    转自:https://blog.csdn.net/h244259402/article/details/83993524 PC:Windows 10 虚拟机:ubuntu 16.04 vivado:2 ...

  5. Linux驱动开发调试 -- 打开dev_dbg()【转】

    本文转载自:https://blog.csdn.net/kunkliu/article/details/78048618 转载地址:http://blog.chinaunix.net/uid-2284 ...

  6. Linux 系统内核的调试

    http://www.ibm.com/developerworks/cn/linux/l-kdb/index.html 本文将首先介绍 Linux 内核上的一些内核代码监视和错误跟踪技术,这些调试和跟 ...

  7. 嵌入式linux应用程序调试方法

    嵌入式linux应用程序调试方法 四 内存工具 五 C/C++代码覆盖.性能profiling工具 四 内存工具 您肯定不想陷入类似在几千次调用之后发生分配溢出这样的情形. 许多小组花了许许多多时间来 ...

  8. Linux Shell 程序调试

    Linux Shell 程序调试 Shell程序的调试是通过运行程序时加入相关调试选项或在脚本程序中加入相关语句,让shell程序在执行过程中显示出一些可供参考的“调试信息”.当然,用户也可以在she ...

  9. Linux知识(5)----LINUX下GDB调试

    命令 解释 示例   file 加载被调试的可执行程序文件.因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径. (gdb) file gdb-sample     r c Run的简 ...

随机推荐

  1. POJ 1989 贪心

    题意: 思路: 从前到后扫一遍 如果k个数都出现过了 ans++ 从当前接着判断 最后答案就是ans+1 //By SiriusRen #include <cstdio> using na ...

  2. POJ 3172 (认真读题的题)

    题目: 思路: 题目很有意思 首先 题里说:N<=1000 题里又说 诶呦 woc? 这不自相矛盾嘛 最坏情况也就是个 斐波那契数列 几十个数 暴搜+剪枝不就好了嘛 剪枝:从大往小搜,如果前缀和 ...

  3. Linux 交换分区swap

    Linux 交换分区swap 一.创建和启用swap交换区 如果你的服务器的总是报告内存不足,并且时常因为内存不足而引发服务被强制kill的话,在不增加物理内存的情况下,启用swap交换区作为虚拟内存 ...

  4. 数据库事务及其EF中如何处理事务

    一.基础知识 1)         使用事务级别ReadUnCommited 会产生脏读现像,意味着读取到的为UnCommited(未提交)的数据.怎么理解呢?在使用该隔离级别的事务开始后.更新了数据 ...

  5. Oracle 10g 10.2.0.1 在Oracle Linux 5.4 32Bit RAC安装手冊(一抹曦阳)

    Oracle 10g 10.2.0.1 在Oracle Linux 5.4 32Bit RAC安装手冊(一抹曦阳).pdf下载地址 ,step by step http://download.csdn ...

  6. 运行 CMD 时,參数加引號常见问题

    在调用 CMD 时.如脚本中用 WScript.Shell 调用. 假设參数中有包括空格的长路径名时,必需要加引號才干正确被识别. 是的,大家都知道要加引號.但怎么加却easy被误解.这个问题,不时地 ...

  7. [51Nod]NOIP2018提高组省一冲奖班模测训练(四)翻车记+题解

    链接 下午5点的时候,突然想起来有这个比赛,看看还有一个小时,打算来AK一下,结果因为最近智商越来越低,翻车了,我还是太菜了.上来10分钟先切掉了C和A,结果卡在了B题,唉. A.砍树 一眼题,两遍树 ...

  8. Android学习笔记进阶14之像素操作

    在我们玩的游戏中我们会经常见到一些图像的特效,比如半透明等效果.要实现这种半透明效果其实并不难,需要我们懂得图像像素的操作. 不要怕,其实在Android中Bitmap为我们提供了操作像素的基本方法. ...

  9. java三元表达式编程规范问题

    package day01; public class Program { public static void main(String[] args) {        // TODO Auto-g ...

  10. 18.Node.js 事件循环

    转自:http://www.runoob.com/nodejs/nodejs-tutorial.html Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node ...