TC275及arm socketCAN硬件系统验证--Apple
2020-05-31 本文已影响0人
applecai
前一篇诊断系统Linux Server端架构验证--Apple的学习笔记已经验证了PC python和linux socket(以太网)通信。然后就是linux socketCAN和TC275 CAN通信。要把整个硬件通路先打通。因为TC275上是有传输器的,但是bb-black开发板上没有,所以我之前网购了一个1050小板带终端电阻的。昨晚到货,今天下午玩了下,现在底层硬件系统及驱动全部ready了。
之后只要玩通信系统设计及python界面和多线程设计了。
一,自己焊接了接插件,用杜邦线连接了下
二,TX脚波形测试
通过TC275向往发报文来验证硬件电路。TC275芯片TX脚-->TC275传输器(CANH和CANL)->1050小板(CANH和CANL)->1050小板丝印的RX。
此时由于bb-black没有上电,所以没有ACK拉低的波形。但是总体2us一个bit说明500kbps波形正确。

三,整体系统通信验证
一开始通信不成功,bb-black还会提示bus-error,于是devmem2先检查了下bb-black寄存器,功能引脚设置正确,然后检查can控制器是否normal模式。结果也设置正确,最后再检查bb-black的连线,发现rx和tx连接反了。最后通信成功。说明硬件电路搭建完成。

波形测试最后2个bit能看到ACK拉低。波形正确。

四,TC275 demo code修改
将TC275原can0仅发送,can1仅接收。改成删除can1,can0收到一帧8byte的0x123后,再通过can0发一帧0x555的8byte报文。通过TC275调试器打断点,确认进入了接收中断。验证通过。

五,socketCAN代码验证
硬件都搭建完成,需要验证socketCAN应用模块的API功能,实现自动发送一帧,然后等待接收后,再发送一帧。

/* socketcan应用code */
/* 1. 报文发送程序 */
#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 s, nbytes;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame[2] = {{0}};
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);//创建套接字
strcpy(ifr.ifr_name, "can0" );
ioctl(s, SIOCGIFINDEX, &ifr); //指定 can0 设备
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind(s, (struct sockaddr *)&addr, sizeof(addr));//将套接字与 can0 绑定
//过滤规则
struct can_filter rfilter[1];
rfilter[0].can_id = 0x555;
rfilter[0].can_mask = CAN_SFF_MASK;
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
frame[0].can_id = 0x123;
frame[0]. can_dlc = 8;
frame[0].data[0] = 0x1;
//循环发送报文
while(1)
{
nbytes = write(s, &frame[0], sizeof(frame[0])); //发送 frame[0]
if(nbytes != sizeof(frame[0]))
{
printf("Send Error frame[0]\n!");
break; //发送错误,退出
}
printf("sendok\n",frame[1].can_id); //debug 信息
nbytes = read(s, &frame[1], sizeof(struct can_frame));
printf("readID:%x\n",frame[1].can_id); //debug 信息
sleep(1);
}
close(s);
return 0;
}