spi bitbang實現原理分析

2021-08-08 12:57:45 字數 2497 閱讀 8709

最近研究spi的bit bang,學自網路,不敢獨享,特做此文件。

此文件是關於spi的,讀者物件為對linux 驅動如spi作為platform有一定基礎的programer。

此文件基於linux2.6.32核心

spi bit bang是什麼?我把他理解成用gpio模擬spi口,跟普通微控制器沒什麼大的區別,下面我們將一步一步掀開bit bang的面紗.

一. spi介面時序詳細解

關於這部分,可以參考如下資料 ,

如下也摘抄於此,感謝博主 yuwenxin 分享如此好的一片文件

spi介面有四種不同的資料傳輸時序,取決於cpol和cphl這兩位的組合。圖1中表現了這四種時序,

時序與cpol、cphl的關係也可以從圖中看出。

注意:cpol是用來決定sck時鐘訊號空閒時的電平,cpol=0,空閒電平為低電平,cpol=1時,

空閒電平為高電平。cpha是用來決定取樣時刻的,cpha=0,在每個週期的第乙個時鐘沿取樣,

cpha=1,在每個週期的第二個時鐘沿取樣。

二, linux中的spi驅動模型

linux的spi模型中重要的有如下幾個結構體,位置include/linux/spi/spi.h

struct spi_device {}

struct spi_driver {}

struct spi_master {}

struct spi_transfer{}

在這幾個結構體中,我們只注意一下device結構體

struct spi_device

注意如上定義的 spi_cpha和spi_cpol

這個和一中的cpha,以及

cpol是對應的,

然後在次基礎上定義了mode?,到此,你是否能相像出spi介面的資料傳輸過程?

接著賣我嗎繼續研究

spi bitbang,也有乙個重要的結構體位置為inlcud/linux/spi/spi_bitbang.h

struct spi_bitbang

我們只對上面四個東西感興趣

struct work_struct work;

這個讓我們想入菲菲--bit bang是按照workqueue佇列的形式來工作的嗎?

worqueue這個是什麼?簡單地說,他就是乙個佇列,裡面的每乙個work節點代表著乙個需要排程的工作。

既然是worqueue,那麼我們可以猜想,spi是在每乙個work中實現bit bang的。

事實上確實如此,在/driver/spi/spi_bitbang.c#l267中,我們可以看到如下函式

static void bitbang_work(struct work_struct *work){},

在/driver/spi/spi_bitbang.c中,我們可以發現

int spi_bitbang_start(struct spi_bitbang *bitbang);

這個函式的主要工作是完成如下工作

workqueue的初始化init_work(&bitbang->work, bitbang_work);

類暫存器的賦值

資料傳送方法的初始化

bitbang->setup_transfer =spi_bitbang_setup_transfer;

注意這個函式(l=/driver/spi/spi_bitbang.c)

int spi_bitbang_setup_transfer(struct spi_device*spi, struct spi_transfer*t)

追蹤這個函式bitbang_txrx_xx,以為bitbang_txrx_16為例(l=ver/spi/spi_bitbang.c)

static unsigned bitbang_txrx_16(struct spi_device*spi,

u32 (

*txrx_word)

(struct spi_device*spi, unsigned nsecs, u32 word, u8 bits)

,unsigned ns,struct spi_transfer *t)

止於此,我們漸漸明朗:

spi_gpio_txrx_word_modex就是實現bitbang的基本,x對應上面定義的spi的哥哥模式

以spi_gpio_txrx_word_mode0為例研究這個函式

spi_gpio_txrx_word_mode0()呼叫了bitbang_txrx_be_cpha0 該函式位inlcude/linux/spi/spi_bitbang.h

static inline u32

bitbang_txrx_be_cpha0(struct spi_device *spi,unsigned nsecs, unsigned cpol,u32 word, u8 bits)

return word;}

注意其中的for迴圈,是不是微控制器下的串列埠模擬spi時序?

ThreadLocal實現原理與原始碼分析

threadlocal底層實現內部類 threadlocalmap 一 threadlocal的set方法原始碼分析 1 public void set t value thread t thread.currentthread threadlocalmap map getmap t if map ...

二分查詢演算法原理和實現

二分查詢是一種比較高效的搜尋演算法,是一種可以在有序陣列中搜尋到特定元素的演算法。例如,我們要在陣列中搜尋4 還是先找到陣列的中間位置,這次因為是偶數,我們就取1吧 這裡是按照自己取中間位置的演算法實際去取 4比1小,那麼要往右邊陣列搜尋,右邊陣列即為 那麼,陣列只有乙個元素,那麼中間位置肯定就是自...

ConcurrentHashMap原理分析

hashtable是乙個執行緒安全的類,它使用synchronized來鎖住整張hash表來實現執行緒安全,即每次鎖住整張表讓執行緒獨佔。concurrenthashmap允許多個修改操作併發進行,其關鍵在於使用了鎖分離技術。它使用了多個鎖來控制對hash表的不同部分進行的修改。concurrent...