新聞中心

        EEPW首頁 > 模擬技術 > 設計應用 > 基于MCP2515的多路CAN總線接口及驅動程序設計

        基于MCP2515的多路CAN總線接口及驅動程序設計

        作者:北京交通大學 徐曉東 路紅英 張寧 時間:2008-05-23 來源:《單片機與嵌入式系統應用》 收藏

          3 設計

        本文引用地址:http://www.104case.com/article/82980.htm

          是應用程序與硬件之間的中間軟件層,它完全隱蔽了設備工作的細節。Linux操作系統根據設備中信息傳送方式的不同,將設備分成3種類型:字符設備、塊設備和網絡設備。9200與的通信都是通過SPI以字節為單位進行的,因此屬于字符設備。由于5個共享9200的一個SPI,因此采用一個來管理所有的MCP2515,這樣做有利于對所有設備進行統一管理。

          3.1 驅動程序中定義的主要數據結構

          通信是基于報文幀的,在驅動程序中,無論發送數據還是接收數據都是基于報文幀的操作,因此需要設計合適的數據結構以滿足數據操作的需要。

          3.1.1 接收與發送報文幀結構體

               

          其中,node_num為MCP2515的節點號(0~4),id為報文幀的標識符,dlc為數據長度(0~8),data為CAN報文幀的數據緩沖區,ext_flag用于標識CAN報文幀是否為擴展幀,rtr_flag用于標識CAN報文幀是否為遠程幀。

          3.1.2 設備配置結構體

          (1)波特率和報文濾波配置結構體

               

          其中,node_num為MCP2515的節點號(0~4),baudrate為CAN通信速率,filter為報文濾波配置結構,br_flag用于標識波特率配置是否有效,fi_flag用于標識報文濾波配置是否有效。baudrate和filter的數據結構類型定義如下:

                

          (2)工作模式配置結構體

               

          其中,node_num意義同上,oper_mode表示該節點的工作模式。MCP2515共有5種工作模式,分別是配置模式、休眠模式、僅監聽模式、回環模式和正常模式。一般設備都工作在正常模式。

          3.1.3 環形數據接收緩沖區結構體

                

          其中,can_recv_buf為接收CAN報文幀環形數據緩沖區,recv_pos和read_pos分別表示數據存入和讀出緩沖區的位置;wq定義的是一個等待隊列,用于實現阻塞型read操作。

          3.2 驅動程序

          驅動程序的接口主要分為3個部分:初始化與退出函數接口,完成設備安裝和卸載等操作;文件系統接口,由file_operations數據結構來完成;與設備的接口,完成對設備的讀/寫等操作。

          3.2.1 初始化與退出函數

          在安裝驅動程序時,操作系統會調用初始化函數進行設備注冊、設備初始化以及安裝中斷處理例程等操作。參考文獻[3]詳細論述了設備注冊的方法,而這里主要討論設備初始化時的配置方法。在本驅動程序中,設備初始化分兩步:一是對9200的SPI控制器初始化,二是對5個MCP2515初始化。

          在卸載設備驅動程序時會調用退出函數,退出函數主要完成設備的注銷和中斷釋放。

          參考文獻[3]詳細論述了中斷處理例程的安裝、設備注銷和中斷釋放的方法,此處不再詳述。

          3.2.2 中斷接收服務例程

          MCP2515收到CAN報文幀后,產生中斷并將INT引腳置低。9200響應外部中斷,并調用和外部中斷相對應的中斷處理例程。中斷處理例程共有3個:  at91_mcp2515_irq_handler_0響應IRQ0的中斷,  at91_mcp2515_irq_handler_1_2響應IRQ1的中斷,  at91_mcp2515_irq_handler_3_4響應IRQ2的中斷。其中IRQ0只和一個MCP2515相連,而IRQ1和IRQ2分別被兩個MCP2515所共享。IRQ0和IRQ1的中斷處理流程分別如圖5和圖6所示,IRQ2與IRQ1的中斷處理流程相同。

               

          需要注意的是,在圖5的處理流程中并沒有清中斷操作。這是因為采用了RX讀緩沖區指令讀取MCP2515RX緩沖區中的數據。該指令操作結束后,MCP2515會自動清除相應的接收中斷標志位。

          3.2.3 文件系統接口定義

          文件系統接口struct file_operations的成員全部是函數指針,這些指針指出了設備驅動程序所提供的入口點位置。本驅動程序所定義的file_operations為:

               

          3.2.4 ioctl函數

          ioctl函數用于對設備進行配置。我們在ioctl函數中實現了兩個命令:IOCTRL_CONFIG_CAN_DEV用于配置節點的CAN波特率和報文濾波,IOCTRL_SET_OPER_MODE用于配置節點的工作模式。這兩種配置命令所對應的配置參數都是指向應用層相應數據結構的指針,兩個配置結構在3.1.2小節已經介紹過了。

          用IOCTRL_CONFIG_CAN_DEV命令配置波特率和報文濾波時,在配置完成后,如果節點處于INACTIVE狀態,則需要使能節點內部的接收中斷,使能節點所對應的外部中斷,并將節點狀態設置為ACTIVE。在通常情況下,通過ioctl函數對需要配置的節點執行完IOCTRL_CONFIG_CAN_DEV命令后,還要再對配置過的節點執行IOCTRL_SET_OPER_MODE命令,使節點處于正常的工作模式。

          3.2.5 關于競爭問題
         
          本系統是單CPU系統,采用Linux 2.4.19內核,且是非搶占式的;同時,此設計的驅動程序也只允許一個進程打開并操作該設備。在這種情況下,驅動程序中所涉及的競爭問題主要就是中斷處理程序內核代碼和其他設備操作的內核代碼之間的資源競爭。在上文中所提到的所有設備操作中,都要通過9200的SPI接口與MCP2515進行通信。9200與MCP2515進行通信都是以命令字節開始的,并且在一個命令操作過程中(一般會連續傳輸多個字節),片選和時鐘是不能被禁用的,否則操作就會失敗。因此,MCP2515的一個完整的命令操作就是一個臨界區域,在對MCP2515進行一個命令操作的過程中必須禁用所有的中斷,以保證命令操作的正常執行。在驅動程序中,采用local_irq_save和local_irq_restore函數對中斷禁用和恢復,在這兩個函數調用之間,就是對MCP2515執行一個命令操作的代碼。

          結 語

          本文針對特有的應用需求提出的多路CAN總線接口和驅動程序設計,經過測試,可以穩定正常地運行。關于驅動程序的編譯和運行方法,參考文獻[3]有很好的說明。上層的測試程序編寫也比較簡單,但要注意數據結構的定義和底層驅動程序的一致性。本文側重介紹設計的基本方法和實現基本的功能。MCP2515本身提供了許多的功能,在實現基本功能的基礎上,也可以根據自己的應用需要再進行功能擴展。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 印江| 金川县| 桦川县| 桃江县| 宁夏| 连平县| 綦江县| 临潭县| 柞水县| 盈江县| 宁津县| 浦东新区| 东安县| 灵璧县| 阳城县| 永胜县| 南京市| 安龙县| 象山县| 额敏县| 辽阳县| 白朗县| 五台县| 贵港市| 蒲城县| 靖宇县| 辉县市| 景洪市| 萨嘎县| 金平| 贵德县| 裕民县| 明星| 清涧县| 兰坪| 筠连县| 新郑市| 赣榆县| 沧源| 巴塘县| 桐庐县|