SPI Bit banging方法的實現

2021-10-04 04:03:50 字數 2533 閱讀 1950

spi(serial peripheral inte***ce)是一種應用廣泛的通訊匯流排,通常微處理器上會整合spi模組以支援該通訊協議,輸出正確的訊號的時序,並保證時序間同步,實現與外部spi裝置正常通訊。當需要使用微處理器上spi模組,但發現引腳被占用時,那麼可以通過spi bit-banging這個方法,通過gpio埠模擬spi介面引腳(cs、mosi、miso、clk)上的時序訊號來實現spi協議,與對應spi裝置進行通訊。以下為mt7688晶元的spi讀寫時序圖。本文主要介紹如何在嵌入式linux發行版平台上實現spi bit-banging功能。

嵌入式linux系統引入了裝置樹(device tree)機制,採用這種資料結構將硬體資訊組織成dts(device tree source)檔案用於描述板級裝置。裝置樹由基本單元——節點(node)組織成樹狀結構,乙個裝置樹只有乙個根節點(root node),根節點中可包含若干子節點,每個子節點可以同時包含若干屬性和下一級子節點,屬性用於描述了節點的具體特徵。

以下為.dts檔案中最基本的樹結構,「/」表示根節點,根節點下的兩個子節點分別為「node1」和「node2」,「node1」和「node2」又各自包含了子節點,如「child-node1」和「child-node2」。檔案中若干鍵-值對,為分散在裝置樹中的屬性。

/ ;child-node2 ;

};node2 ;

};};

由於以上的.dts檔案並沒有描述任何硬體裝置的特徵,下面以openwrt發行版上的mt7628dts檔案為例對裝置樹進行具體說明。每個節點以「《名稱》[@《裝置位址》]」形式命名,當該節點描述的裝置存在裝置位址時需在名稱後加上主位址,同時節點中以reg=《位址1 長度1] [位址2 長度2] [位址3 長度3] ... >方式列出裝置使用的位址範圍,父節點的 #address-cells 和 #size-cells 屬性宣告reg中各字段的數量。節點中的compatible屬性表示使用哪個裝置驅動繫結到當前節點描述的裝置上。

mt7628an.dtsi檔案部分**:

/ ;};

chosen ;

......

palmbus: palmbus@

10000000 ;

gpio@

600 ;

gpio1: bank@

1 ;gpio2: bank@

2 ;};

spi0: spi@b00 ;

......

};pinctrl: pinctrl ;

spi_pins: spi ;

};spi_cs1_pins: spi_cs1 ;

};......

};};

嵌入式linux核心中已提供spi bit-banging驅動**,只需進行對應的配置即可使用。

首先在openwrt_widora-master/target/linux/ramips/dts路徑下修改widora.dts檔案,將配置**加入根節點中,並且在pinctrl中將spis功能的引腳申明為gpio引腳,驅動檔案為drivers/spi路徑下的spi-gpio.c,函式中註冊的驅動名稱為spi_gpio,與 compatible屬性對應。

dts檔案部分**:

gpio-spi

spi-gpio.c檔案部分**:

#define driver_name "spi_gpio"

static

struct

platform_driver

spi_gpio_driver = ,

.probe = spi_gpio_probe,

.remove = spi_gpio_remove,

};module_platform_driver(spi_gpio_driver);

其次在openwrt的配置介面中選擇kernel modules–> spi support –>kmod-spi-gpio,選中後會自動關聯 kmod-spi-bitbang模組。

最後編譯核心並燒錄韌體。核心啟動後通過lsmod命令檢視已經載入到核心中的模組的狀態資訊,可發現核心已經載入了spi_bitbang和spi_gpio模組。

在spi-gpio.c檔案的spi_gpio_probe函式加入printk語句觀察可獲悉到spi-gpio驅動在啟動時被載入執行,並且從dts檔案中獲取到定義為spi bit-banging功能的gpio引腳。

spi的bit-bang方式實現spi協議雖然可以不依賴於控制器上的spi外設模組,但是需要**完成時序邏輯和同步要求,相對來說效能低於控制器自身的spi模組,因此僅適用於低速要求的應用場合。

方法的呼叫 this方法 構造方法

1 呼叫者和被呼叫者方法位於同一類中,呼叫形式如下 this 方法名 在大多數情況下,關鍵字this可以忽略 呼叫者位於被呼叫方法所在類的外部 物件名.方法名或者類名.方法名 抽象類只能作為父類,不能例項化。只能被繼承 抽象方法是一種只有方法宣告而沒有方法體定義的特殊方法,最後有乙個分號 而沒有方法...

例項方法 靜態方法 類方法

首先新建乙個日期date類,屬性為年,月,日,tomorrow 是例項方法,這個最常見,比較簡單,例項方法的第乙個引數是例項物件self 當我們傳入的年月日是2018 6 4這樣的形式,我們就需要先進行字串處理,在這裡使用了元組的拆包 這是最基本的方式,但是這樣寫會有乙個問題,每次傳參都需要進行字串...

類方法 物件方法 原型方法

js類方法,物件方法,原型的理解 function people name 類方法 people.run function 原型方法 people.prototype.introducechinese function 測試 var p1 new people windking p1.introdu...