由於最近工作需要,需要用到can匯流排,自己以前又沒有用到過can匯流排,所以記錄下來自己的學習過程。
由於我是在linux下操作can匯流排的,所以一下內容主要是linux下的can操作過程。
首先,配置linux下can驅動,我所用的平台是am335x,am335x有兩個can介面,can0和can1,以下為can0的配置過程,can1類似
1:進入mach_omap2目錄修改mux33xx.c檔案,修改後:
_am33xx_muxentry(uart1_ctsn,0,
"uart1_ctsn",null, "d_can0_tx", "i2c2_sda",
"spi1_cs0", null, null,"gpio0_12"),
_am33xx_muxentry(uart1_rtsn,0,
"uart1_rtsn",null, "d_can0_rx", "i2c2_scl",
"spi1_cs1", null,null, "gpio0_13"),
2:修改board-am335xevm.c:
static structpinmux_config d_can_wxudong_pin_mux = ,,,
};static voidd_can_init(int evm_id, int profile)
}static struct evm_dev_cfg beaglebone_dev_cfg= ,,};
新增d_can_init函式
修改完之後重新編譯核心,燒錄核心到am335x平台上,在命令列中輸入ifconfig -a會發現can0裝置。
第二部,編寫can應用層demo,這裡要注意,can單裝置可以用示波器測量tx引腳,但是只能用回環模式,
在命令列輸入canconfig can0 ctrlmode loopback on,回環模式測試
測試程式:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"ioctl.h"
#include"can.h"
int signalquit;
void sighandler(intsig)
}static voidprint_usage(char *prg)
can_baudrate_tstring_to_baudrate(char *str)
int main(int argc,char *argv),,
,,};while((opt = getopt_long(argc, argv, "hb:b:",long_options, null)) != -1)
break;
case 'b':
ptr = optarg;
while (1)
if (bittime_count!= 6)
break;
default:
fprintf(stderr,"unknown option %c\n", opt);
break;}}
/* get can inte***ce name */
if (optind != argc - 1 &&optind != argc - 2)
strncpy(ifname,argv[optind], ifnamsiz);
strncpy(ifr.ifr_name,ifname, ifnamsiz);
can_fd= socket(pf_can, sock_raw, can_raw);
if(can_fd < 0)
ret= ioctl(can_fd, siocgifindex, &ifr);
if(ret)
addr.can_family = pf_can;
addr.can_ifindex = ifr.ifr_ifindex;
if(new_baudrate != -1)
}if(bittime_count)
}if(bind(can_fd,(struct sockaddr*)&addr,sizeof(addr)))
memset(&frame,0x0,sizeof(frame));
frame.can_id = 0x123;
frame.can_dlc =8;
strncpy(frame.data,"12345678",8);
while(!signalquit)
if(nbytes < sizeof(structcan_frame))
printf("write a canframe:can_id=0x%x,can_dlc=%d,data=%s\n",frame.can_id,frame.can_dlc,frame.data);
for(i=0;i<10000;i++);
}close(can_fd);
return0;
abort:
close(can_fd);
returnret;
}然後再用candump can0 或者示波器測量tx腳即可看到輸出波形。
參考文獻
以上就是linux can匯流排除錯學習記錄的全文介紹,希望對您學習和使用linux系統開發有所幫助.
from:
RS485匯流排除錯總結
原文 rs485匯流排除錯總結 這裡把這三天來除錯rs485匯流排所遇到的問題和經驗教訓總結一下,備忘。這兩天主要做的是把keller 30x系列工業用壓力變送器的rs485介面和stm32微控制器聯通,並將資料通過usb口 到pc上。我首先直接使用keller 30x連線電腦的rs485介面,這自...
FPGA Vtech 匯流排效能,FPGA除錯
今天我可以向你介紹verification technology,簡稱vtech。如果你搜尋它,可能會找到一家銷售嬰兒監視器和兒童玩具的公司。這不是那個公司。因此,請確保您具有正確的 是以或開頭的 大多數的eda公司都是通過以下三種方式之一建立起來的。目前最常見的第一種方式是被三大公司之一收購現有的...
汽車匯流排學習
馬上要換工作了 要去一家做汽車電子的公司,所以就馬上惡補汽車電子相關的知識。呵呵 因為實在是不了解這個行業,所以去圖書館借本低階的書 汽車匯流排 系統原理與檢修 先了解一下.說實在的書剛看了幾頁就後悔了,這本書是汽修中專生的教材,內容實在太差了,不過還可以簡單的了解相關知識。呵呵 言歸正傳說點知識性...