色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

英創信息技術EM9287 Linux Socket CAN驅動簡介

英創信息技術 ? 來源:英創信息技術 ? 作者:英創信息技術 ? 2020-01-16 10:12 ? 次閱讀

一、簡述

EM9287工控主板CPU為Freescale 的iMX287,主頻454MHz,以具有豐富的通訊接口為特色,可同時支持雙網口、7路串口、32路GPIO、SPI、I2C以及CAN通訊等接口。CAN是一種在世界范圍內廣泛用于自動控制、嵌入式設備和汽車領域的網絡技術,EM9287 的CAN通訊接口是通過FlexCAN模塊來實現控制局域網絡協議(CAN)通信的,FlexCAN模塊同時支持CAN協議規范2.0,包括協議所規定的標準幀和擴展幀。

Linux下最早使用CAN的方法是基于字符設備來實現的,在EM9287上移植的Linux-3.9.7內核中FlexCAN模塊驅動實現的是Socket CAN方式,Scoket CAN使用了socket接口和Linux網絡協議棧,這種方法使得CAN設備驅動可以通過網絡接口函數來調用,這樣大大地方便了熟悉Linux網絡編程程序員,由于調用的都是標準的socket 函數,也使得應用程序便于移植,而不會因為硬件的調整而修改應用程序,這樣加強了應用程序的可維護性。關于Socket CAN在Linux內核文檔中有更為詳細的介紹(/Linux-3.9.7/Documentation/networtking/can.txt)。

本文將簡要介紹EM9287在Linux-3.9.7內核上如何實現CAN驅動以及如何在應用程序中使用Socket CAN。

二、Linux內核配置

內核配置中增加以下選項(make menuconfig):

Networking support --->
<*> CAN bus subsystem support --->
<*> Raw CAN Protocol (raw access with CAN-ID filtering)
<*> Broadcast Manger CAN Protocol (with content filtering)
<*> CAN Gateway/Router (with netlink configuration)
CAN Device Drivers --->
<*> Platform CAN drivers with Netlink support
[*] CAN bit-timing calculation
<*> Support for Freescale FLEXCAN based chips

EM9287移植的是Linux-3.9.7版本,對于硬件的描述和配置都是通過device tree相關文件進行傳遞,除了內核的配置外,還需要在相應的dst文件中增加can0節點。如:

can0: can@80032000 {
compatible = 'fsl,imx28-flexcan', 'fsl,p1010-flexcan';
reg = <0x80032000 0x2000>;
interrupts = <8>;
clocks = <&clks 58>, <&clks 58>;
clock-names = 'ipg', 'per';
pinctrl-names = 'default';
pinctrl-0 = <&can0_pins_a>;
};

內核編譯成功后,板卡啟動顯示即表示flexcan驅動加載成功。

[ 2.022398] CAN device driver interface
[ 2.031257] flexcan 80032000.can: device registered (reg_base=f5032000, irq=190)

三、Socket CAN的測試

Socket CAN 的使用會用到ip命令工具,由于busybox中的ip沒有支持 socket can,所以需要重新移植ip工具,iproute2中的ip可以支持socket can。

1、移植iproute2
從iproute2官方網站上下載源碼,我們這里用到的是iproute2-3.10.0.
1) tar jxvf iproute2-3.10.0
2) 修改Makefie
CC=arm-none-linux-gnueabi-gcc
由于只用到ip工具,所以將別編譯目錄屏蔽:
#SUBDIRS=lib ip tc bridge misc netem genl man
SUBDIRS=lib ip
3) make編譯成功后生成 “ip”
4) 將ip復制到EM9287的文件系統中,替換原來busybox中的ip

這樣ip命令工具就算是移植好了。

2、使用ip命令配置can0接口。
// 關閉can0接口,以便進行配置
ifconfig can0 down
// 方法一:配置can0的波特率為250Kbps
ip link set can0 type can bitrate 250000
// 方法二:配置can0的波特率為250Kbps
ip link set can0 type can tp 250 prog-seg 5 phase-seg1 8 phase-seg2 2 sjw 2
// 啟動can0接口
ifconfig can0 up

EM9287的FLEXCAN時鐘選用的是24MHz的外部晶體振蕩時鐘。為了適應各種不同的采樣率,我們采用方法二來對can的波特率進行設置,以CiA推薦的采樣點在bit的87.5%處,作為基準來計算:

波特率 PRESDIV
-> fTq
TSEG1 TSEG2 TQ 采樣點
PROPSEG+PSEG1+2 PSEG2+1
1000 1 -> 12MHz (0 + 7 + 2)= 9 (1+1)= 2 12 83.3%
800 1 -> 12MHz (3 + 7 + 2)= 12 (1+1)= 2 15 86.6%
500 2 -> 8MHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%
250 5 -> 4MHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%
125 11 -> 2MHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%
100 14 -> 1.6MHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%
60 24 -> 960KHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%
50 29 -> 800KHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%
20 74 -> 320KHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%
10 149 -> 160KHz (4 + 7 + 2)= 13 (1+1)= 2 16 87.5%

3、Scoket CAN測試代碼

就像TCP/IP協議一樣,在使用CAN網絡之前首先需要打開一個套接字。CAN的套接字使用到了一個新的協議族PF_CAN,所以在調用socket( )這個系統函數的時候需要將PF_CAN作為第一個參數。當前有兩個CAN的協議可以選擇,一個是原始套接字協議( raw socket protocol),另一個是廣播管理協議BCM(broadcast manager)。作為一般的工業應用我們選用原始套接字協議:

s = socket(PF_CAN, SOCK_RAW, CAN_RAW);

在成功創建一個套接字之后,通常需要使用bind( )函數將套接字綁定在某個CAN接口上。在綁定 (CAN_RAW)套接字之后,就可以在套接字上使用read( )/write( )進行數據收發的操作。

基本的CAN幀結構體和套接字地址結構體定義在include/linux/can.h

/*
* 擴展格式識別符由 29 位組成。其格式包含兩個部分:11 位基本 ID、18 位擴展 ID。
* Controller Area Network Identifier structure
*
* bit 0-28 : CAN識別符 (11/29 bit)
* bit 29 : 錯誤幀標志 (0 = data frame, 1 = error frame)
* bit 30 : 遠程發送請求標志 (1 = rtr frame)
* bit 31 :幀格式標志 (0 = standard 11 bit, 1 = extended 29 bit)
*/
typedef __u32 canid_t;
struct can_frame {
canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
__u8 can_dlc; /* 數據長度: 0 .. 8 */
__u8 data[8] __attribute__((aligned(8)));
};

以下為相關的測試代碼:

int main( int argc,char* argv[] )
{
int i1, ret;
int nbytes, baudrate;
int s;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
printf( 'SocketCAN Test V1.0\n' );
// 解析命令行參數, CAN波特率
if( argc > 1 )
{
baudrate = atoi( argv[1] );
}
else
{
baudrate = 250000;
}
printf( 'bitrate is %d\n', baudrate );
set_can_bittiming( baudrate );
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
printf( 'SOCK_RAW can sockfd:%d\n', s );
if( s < 0 )
{
return -1;
}
int loopback = 0; /* 0 = disabled, 1 = enabled (default) */
setsockopt(s, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &loopback, sizeof(loopback));
strcpy(ifr.ifr_name, 'can0' );
ret = ioctl(s, SIOCGIFINDEX, &ifr);
if( ret < 0 )
{
return -1;
}
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind(s, (struct sockaddr *)&addr, sizeof(addr));
for( i1=0; i1<10; i1++ )
{
nbytes = read(s, &frame, sizeof(struct can_frame));
if (nbytes < 0) {
perror('can raw socket read');
return 1;
}
if( nbytes < (int)sizeof(struct can_frame))
{
perror('read: incomplete CAN frame\n');
return 1;
}
/* do something with the received CAN frame: send back */
nbytes = write(s, &frame, sizeof(struct can_frame));
printf( '%d sendbytes: %d\n', i1+1, nbytes );
}
close( s );
return 0;
}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11320

    瀏覽量

    209849
  • 嵌入式主板
    +關注

    關注

    7

    文章

    6085

    瀏覽量

    35439
收藏 人收藏

    評論

    相關推薦

    飛騰助力首屆教育信息技術應用創新大賽圓滿落幕

    近日,由中國教育技術協會主辦,教育部教育管理信息中心教育信實驗室、公安部第三研究所、中國電子工業標準化技術協會信工委會支持,北京航空航天
    的頭像 發表于 12-24 09:57 ?155次閱讀

    有方科技參編的信息技術團體標準發布

    近日,有方科技參編的《信息技術產品供應鏈成熟度 共性指標 第1部分:企業背景評價》《信息技術產品供應鏈成熟度 共性指標 第2部分:技術掌控評價》《信息技術產品供應鏈成熟度 共性指標 第
    的頭像 發表于 12-23 10:44 ?167次閱讀

    龍芯中科助力2024首屆教育信息技術應用創新大賽成功舉辦

    近日,2024首屆教育信息技術應用創新大賽在北京航空航天大學成功舉辦。本次大賽由中國教育技術協會主辦,教育信實驗室、公安部第三研究所、中國電子工業標準化技術協會信
    的頭像 發表于 12-19 17:02 ?251次閱讀

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-CAN編程示例之socket CAN

    和汽車領域的網絡技術Linux下最早使用CAN的方法是基于字符設備來實現的,與之不同的是Socket CAN使用伯克利的
    發表于 11-15 09:25

    飛凌嵌入式ElfBoard ELF 1板卡-CAN編程示例之socket CAN編程步驟

    創建socket使用CAN通信協議簇,需要在創建socket時將PF_CAN作為第一個參數;同時選定原始套接字協議(SOCK_RAW)。綁定can
    發表于 11-15 09:23

    飛凌嵌入式ElfBoard ELF 1板卡-CAN編程示例之socket CAN

    和汽車領域的網絡技術Linux下最早使用CAN的方法是基于字符設備來實現的,與之不同的是Socket CAN使用伯克利的
    發表于 11-14 08:51

    socket在實時通訊中的應用

    實時通訊技術是現代互聯網應用中的重要組成部分,它允許用戶之間進行即時的信息交換。在這些應用中,Socket(套接字)技術扮演著至關重要的角色。 1.
    的頭像 發表于 11-01 17:54 ?803次閱讀

    C語言中的socket編程基礎

    Socket編程簡介 Socket是一種通信機制,允許程序之間進行通信。在C語言中,socket編程是網絡編程的基礎。通過使用socket
    的頭像 發表于 11-01 16:51 ?378次閱讀

    中科達榮獲2024年軟件和信息技術服務優秀企業

    及前百家企業”名單。中科達憑借非凡的技術實力與持續的創新能力,成功入選“2024年度軟件和信息技術服務競爭力百強企業”以及“2024年軟件和信息技術服務優秀企業”。
    的頭像 發表于 10-30 11:44 ?506次閱讀

    北京迅為RK3568開發板嵌入式學習之Linux驅動全新更新-CAN+

    北京迅為RK3568開發板嵌入式學習之Linux驅動全新更新-CAN+
    的頭像 發表于 09-04 15:29 ?545次閱讀
    北京迅為RK3568開發板嵌入式學習之<b class='flag-5'>Linux</b><b class='flag-5'>驅動</b>全新更新-<b class='flag-5'>CAN</b>+

    虹科技術 全新Linux環境PCAN驅動程序發布!CAN/CAN FD通信體驗全面升級!

    全新8.17.0版本的PCAN-Linux驅動程序正式發布,專為CANCAN FD接口量身打造。無論是CAN 2.0 a/b還是
    的頭像 發表于 08-29 09:36 ?459次閱讀
    虹科<b class='flag-5'>技術</b> 全新<b class='flag-5'>Linux</b>環境PCAN<b class='flag-5'>驅動</b>程序發布!<b class='flag-5'>CAN</b>/<b class='flag-5'>CAN</b> FD通信體驗全面升級!

    全新Linux環境PCAN驅動程序發布!CAN/CAN FD通信體驗全面升級!

    全新8.17.0版本的PCAN-Linux驅動程序正式發布,專為CANCAN FD接口量身打造。無論是CAN 2.0 a/b還是
    的頭像 發表于 04-19 10:38 ?964次閱讀

    龍芯中科三項信方案入圍工信部2023年信息技術應用創新應用示范案例名單

    近日,工業和信息化部通報了2023年信息技術應用創新解決方案征集遴選結果,本次共評選出典型解決方案173個、應用示范案例83個、單項創新案例64個。
    的頭像 發表于 03-07 16:45 ?963次閱讀
    龍芯中科三項信<b class='flag-5'>創</b>方案入圍工信部2023年<b class='flag-5'>信息技術</b>應用創新應用示范案例名單

    CAN和CANFD協議簡介(下)

    CAN和CANFD協議簡介(下)
    的頭像 發表于 02-19 12:08 ?1171次閱讀
    <b class='flag-5'>CAN</b>和CANFD協議<b class='flag-5'>簡介</b>(下)

    CAN和CANFD協議簡介(上)

    CAN和CANFD協議簡介(上)
    的頭像 發表于 01-26 08:06 ?1460次閱讀
    <b class='flag-5'>CAN</b>和CANFD協議<b class='flag-5'>簡介</b>(上)
    主站蜘蛛池模板: 外国三级片名| 亚洲日韩欧美国产中文在线| 2021精品乱码多人收藏| 久久亚洲精品成人综合| 91popny蜜桃臀| 日韩大胆视频| 国产在线观看成人| 做暖免费观看日本| 日本浴室日产在线系列| 果冻传媒在线观看高清完整免费 | 艳妇臀荡乳欲伦岳TXT下载| 久久久精品久久| 边吃胸边膜下床震免费版视频| 无码天堂亚洲国产AV久久 | 国内卡一卡二卡三免费网站| 18禁在线无遮挡羞羞漫画 | 好男人资源免费观看1| 91chinesevideo| 午夜精品久久久久久久爽牛战| 老湿司午夜爽爽影院榴莲视频| 把腿张开再深点好爽宝贝动态图| 亚洲国产精品免费线观看视频| 蜜桃传媒在线播放| 国产女人视频免费观看| 99视频精品全部免费观看| 亚洲精品第二页| 日本黄色成年人免费观看| 久久免费精品视频| 国产精品视频人人做人人爽| 97视频在线观看视频最新| 亚洲国产在线精品国自产拍五月| 欧洲vs美洲完整视频| 久久黄视频| 国产精品永久免费视频观看| np高h肉文| 2022年国产精品久久久久| 亚洲国产精品综合久久一线| 日本十八禁无遮拦啪啪漫画| 久久亚洲AV成人无码动态图| 国产午夜精品一区二区| 成人午夜精品无码区久久漫画日本|