<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式uClinux下的CAN總線(xiàn)設備驅動(dòng)程序設計

嵌入式uClinux下的CAN總線(xiàn)設備驅動(dòng)程序設計

作者: 時(shí)間:2013-03-30 來(lái)源:網(wǎng)絡(luò ) 收藏

1、操作系統概述

  是Linux2.0的一個(gè)分支,它被設計用于沒(méi)有MMU的微控制器領(lǐng)域,即被廣泛應用于嵌入式Linux領(lǐng)域。的最大特征就是沒(méi)有MMU(內存管理單元模塊)。它很適合那些沒(méi)有MMU的處理器,如ARM7TDMI,m68ez328等。

  uClinux具有完全的TCP/IP協(xié)議棧,同時(shí)對其他許多的網(wǎng)絡(luò )協(xié)議都提供支持。這些網(wǎng)絡(luò )協(xié)議都在uClinux上得到了很好的實(shí)現。uClinux可以稱(chēng)作是一個(gè)針對嵌入式系統的優(yōu)秀網(wǎng)絡(luò )操作系統。

2、Linux驅動(dòng)程序設計概述

  Linux系統內核通過(guò)程序與外圍設備交互,程序是Linux內核的一部分,它是一組數據結構和函數,這些數據結構和函數通過(guò)定義的接口控制一個(gè)或多個(gè)設備。

  和UNIX一樣,Linux中所有的設備均作為文件來(lái)對待,這些文件一般稱(chēng)為特殊文件,這樣做的一個(gè)好處是使用戶(hù)或應用程序可按操縱普通文件的方式進(jìn)行訪(fǎng)問(wèn)控制硬件設備。

  Linux內核有三種類(lèi)型的程序:字符設備驅動(dòng)程序、塊設備驅動(dòng)程序和網(wǎng)絡(luò )設備驅動(dòng)程序。Linux的設備由一個(gè)主設備號(major)和一個(gè)次設備號(minor)標識。主設備號唯一標識了設備類(lèi)型,它是塊設備表或字符設備表中設備表的索引。次設備號僅由設備驅動(dòng)程序解釋?zhuān)糜谧R別同類(lèi)設備中,I/O請求所涉及到的那個(gè)設備。設備驅動(dòng)程序可以分為3個(gè)主要組成部分:

 ?。╨)自動(dòng)配置和初始化子程序,負責檢測所要驅動(dòng)的硬件設備是否能正常工作。

 ?。?)服務(wù)于I/O請求的子程序,又稱(chēng)為驅動(dòng)程序的上半部分。

 ?。?)中斷服務(wù)子程序,又稱(chēng)為驅動(dòng)程序的下半部分。

3、uClinux下CAN設備的驅動(dòng)程序編寫(xiě)

  根據上文對LINUX下設備驅動(dòng)程序的描述,以及參考相關(guān)的實(shí)例分析,下面對CAN總線(xiàn)設備SJA1000的驅動(dòng)程序進(jìn)行編寫(xiě)。

  CAN設備驅動(dòng)程序實(shí)際上是linux內核直接對sja1000器件的初始化與讀寫(xiě)操作。經(jīng)分析,sja1000 CAN驅動(dòng)程序構成包括如下幾個(gè)部分:

  1)定義sja1000芯片內所有寄存器的訪(fǎng)問(wèn)地址,用于完成對其內部寄存器以及緩沖區的讀寫(xiě)訪(fǎng)問(wèn)。例如:

  #define IO_PMOD (*(volatile unsigned *)0x3ff5000)

  #define IO_PDATA (*(volatile unsigned *)0x3ff5008)

  #define IO_PCON (*(volatile unsigned *)0x3ff5004)

  #define SJA_MOD (0x2700000) #define SJA_CMR (0x2700004)

  …………………

  #define SJA_CANRXB7 (0x270006c) #define SJA_CANRXB8 (0x2700070)

  因為在我們的系統中,對sja1000的讀寫(xiě)是采用的部分模擬時(shí)序的方式,所以用到了S3C4510的IO端口。下面對sja1000地址的定義進(jìn)行分析。因為uClinux運行的時(shí)候,采用的是32位方式,即兩個(gè)相鄰地址間相隔4個(gè)字節,而在sja1000內部的地址間的間隔只有1個(gè)字節。雖然可以對S3C4510的內部寄存器定義為在訪(fǎng)問(wèn)sja1000的時(shí)候,將位寬度定義為8位,但這樣會(huì )與linux系統運行不匹配,經(jīng)測試發(fā)現讀寫(xiě)不正常。所以將sja1000的地址定義為32位寬度。于是各個(gè)寄存器地址為(基址+sja1000內部地址×4)。這里將sja1000的基址定義為0x2700000。

2)編寫(xiě)對SJA1000內部寄存器訪(fǎng)問(wèn)的讀寫(xiě)函數

  因為處理器的地址和數據總線(xiàn)是分開(kāi)的,而SJA1000的地址與數據總線(xiàn)是8位分時(shí)復用的。所以我們只有采用先向sja1000的8位地址數據總線(xiàn)上送出地址,然后再送數據或者讀數據的方式。片選信號/CS,讀信號/RD,寫(xiě)信號/WR仍由自己產(chǎn)生。需要模擬的是鎖存信號ALE、地址數據總線(xiàn)AD0-AD7。參照sja1000時(shí)序圖,具體的操作步驟見(jiàn)下面程序和注釋。

寫(xiě)子程序如下:

  void sja_write(unsigned int data, unsigned int addr)

  { unsigned char tmp;

  tmp=(addr)>>2;//將32位地址右移2位,tmp的低8位即為sja1000實(shí)際地址。

  outl(tmp,addr);//將地址信息作為數據送往SJA1000數據總線(xiàn)

  IO_PDATA=0x32;//ALE=0,讓SJA1000將該地址鎖存

  outl(data,addr);//將數據信息送往SJA1000數據總線(xiàn)

  O_PDATA=0x33; } //將ALE置高電平,74HC245的/OE置高位

讀子程序如下:

  unsigned char sja_read(unsigned int addr)

  { unsigned char data;

  volatile unsigned int data1;

  unsigned char tmp;

  tmp=(addr)>>2; //將32位地址右移2位,tmp的低8位即為sja1000實(shí)際地址S3C2410

  outl(tmp,addr); //將地址信息作為數據送往SJA1000數據總線(xiàn)

  IO_PDATA=0x32; //p0-ALE=0,鎖存地址信息

  IO_PDATA=0x12; //p5-245dir=0,將74HC245的方向置為CPU輸入方向

  data1=inl(addr); //讀出所需的數據

  IO_PDATA=0x33; //ALE置高,74HC245置為不工作狀態(tài)

  data=data1; return(data); }//返回數據

  后面對sja1000的初始化、CAN發(fā)送與CAN接收函數中需要對寄存器操作均調用sja_write()和sja_read()函數進(jìn)行。


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>