由于采用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 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00NOARP  MTU:16  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:10RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)Interrupt:22eth0      Link encap:Ethernet  HWaddr 00:0A:35:00:01:22inet addr:192.168.0.120  Bcast:192.168.0.255  Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:397 errors:0 dropped:0 overruns:0 frame:0TX packets:242 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:476490 (465.3 KiB)  TX bytes:18536 (18.1 KiB)Interrupt:148 Base address:0xb000lo        Link encap:Local LoopbackLOOPBACK  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0RX bytes:0 (0.0 B)  TX bytes:0 (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 100000
xilinx_can e0008000.can can0: bitrate error 0.0%
Z-turn#./ip link set can0 up
Z-turn#./ip -d -s link show can0
2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10link/can  promiscuity 0can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0bitrate 99999 sample-point 0.750tq 2500 prop-seg 1 phase-seg1 1 phase-seg2 1 sjw 1xilinx_can: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..256 brp-inc 1clock 99999999re-started bus-errors arbit-lost error-warn error-pass bus-off0          0          0          0          0          0         numtxqueues 1 numrxqueues 1RX: bytes  packets  errors  dropped overrun mcast0          0        0       0       0       0TX: bytes  packets  errors  dropped carrier collsns0          0        0       0       0       0

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
#endifint main(int argc, char *argv[])
{int fd, ret, flag, len;char senddata[32] = "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 < 0) {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 != 0) {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 = 0;ret = setsockopt(fd, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &flag, sizeof(flag));if (ret != 0) {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 = 0;ret = setsockopt(fd, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS, &flag, sizeof(flag));if (ret != 0) {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 != 0) {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 (1) {strncpy((char *)frame.data, senddata, len);frame.can_dlc = len;ret = sendto(fd, &frame, sizeof(struct can_frame), 0, (struct sockaddr*)&addr, sizeof(addr));if (ret > 0) {DBG_MSG("Send success: [%s], ret=%d\n", senddata, ret);ret = recvfrom(fd, &frame, sizeof(struct can_frame), 0, (struct sockaddr *)&addr, &socket_len);if (ret > 0) {DBG_MSG("Recv message: [%s], ret=%d\n", frame.data, ret);}}usleep(500000);}return 0;
}

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

struct timeval timeout = {1,0}; //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

转载于:https://www.cnblogs.com/hujianhua/p/8446344.html

zynq+linux+ramdisk can调试相关推荐

  1. 转载:ZYNQ+linux网口调试笔记(1)PS-GEM0

    ZYNQ+linux网口调试笔记(1)PS-GEM0 转载原文:https://www.jianshu.com/p/a4e25e8b2f5e 开发环境 Windows SDK 2017.4 Ubunt ...

  2. ZYNQ + Linux

    ZYNQ Linux操作系统移植说明文档 http://xilinx.eetrend.com/content/2019/100018437.html 1,组成 ZYNQ上面移植Linux操作系统包括四 ...

  3. ZYNQ Linux 添加I2C-RTC驱动

    原文链接:ZYNQ:Linux添加I2C-RTC驱动 硬件情况 使用的是DS1338这款RTC时钟芯片,I2C总线对应到PS端的I2C1. 配置 内核 添加有关的驱动: 因为DS1338用的驱动与DS ...

  4. linux + ffmpeg + eclipse 调试

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

  5. [Linux]core文件调试方法

    来源: shaovey的专栏 在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息).使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行 ...

  6. linux下gdb调试方法和技巧详解

    linux下gdb调试方法和技巧整理 简介 UNIX或者UNIX-like下调试工具 启动gdb # 1. 在可执行程序不需要输入参数时,我们可以使用 gdb + 可执行程序 gdb ./typeid ...

  7. linux内核printk调试

    linux内核printk调试(摘录<Linux安全体系分析与编程>) 1  printk及控制台的日志级别 函数printk的使用方法和printf相似,用于内核打印消息.printk根 ...

  8. Android Linux内核编译调试

    对于在Windows上写代码写习惯的人,调试是必不可少的手段,但是转到Android以后,发现调试手段异常简陋,跟Windows简直不是一个级别,特别是Android的内核调试,网上资料也相对较少,不 ...

  9. vs2017搭建Linux的开发调试环境(VisualGDB)

    在Linux下调试工程是一件很苦逼的事情,不像在Windows下用Visual Studio那样简便,但是最近发现一件神器可以让Linux下的程序一样可以在Windows下的Viusal Studio ...

最新文章

  1. dae模型如何合并_FBX、DAE模型的格式、导入与骨骼动画
  2. 背包问题(动态规划)
  3. Springboot集成ES启动报错
  4. 决策树学习笔记整理【转】
  5. 项目评测(共27组)
  6. 前景看淡,移动医疗九成或将成炮灰
  7. 转] 两种自定义表单设计方案
  8. Visual Studio 2012正式版官方下载地址
  9. 世上哪有那么多的怀才不遇
  10. JavaSpring菜鸟教程,附Java面经
  11. h5页面禁用手机识别
  12. #学习笔记 使用c语言来制作一个计算器
  13. Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(6) POI检索, 根据地址输入提示检索 Sug
  14. STM32F4—Flash读写
  15. python3爬虫伪装代理IP
  16. .NET基础篇:解决VS2017引用无效问题。
  17. 收钱吧-轻POS接口
  18. 专门画像素图的软件_有哪几种简便的做像素画的软件?
  19. Day4-----subnavMeau
  20. 为什么负责任的技术始于数据治理

热门文章

  1. Java——将一个正整数分解质因数
  2. 计算机单片机实训报告,计算器单片机实训报告.doc
  3. Matlab 矩阵的表示
  4. XXL-JOB原理--任务调度中心执行器注册(三)
  5. 每周工作总结-记录总结自己遇到问题及学习内容,及时分析,找到不足,让自己不断进步
  6. 前端面试题整理(会不断更新哦!~~~~~)
  7. C语言入门之【C语言 “ 函数 “】
  8. 解决低版本matlab打开高版本Matlab的.m文件时,出现中文乱码的问题。
  9. 手牵手教你写代码,从入门到精通
  10. 蓝桥杯python试题 基础练习 Fibonacci数列