0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度解析Linux SPI總線和設(shè)備驅(qū)動(dòng)架構(gòu)

Q4MP_gh_c472c21 ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2018-02-07 08:16 ? 次閱讀

SPI是"Serial Peripheral Interface" 的縮寫,是一種四線制的同步串行通信接口,用來連接微控制器傳感器、存儲(chǔ)設(shè)備,SPI設(shè)備分為主設(shè)備和從設(shè)備兩種,用于通信和控制的四根線分別是:

·CS 片選信號(hào)

·SCK 時(shí)鐘信號(hào)

·MISO 主設(shè)備的數(shù)據(jù)輸入、從設(shè)備的數(shù)據(jù)輸出腳

·MOSI 主設(shè)備的數(shù)據(jù)輸出、從設(shè)備的數(shù)據(jù)輸入腳

硬件結(jié)構(gòu)

通常,負(fù)責(zé)發(fā)出時(shí)鐘信號(hào)的設(shè)備我們稱之為主設(shè)備,另一方則作為從設(shè)備,下圖是一個(gè)SPI系統(tǒng)的硬件連接示例:

深度解析Linux SPI總線和設(shè)備驅(qū)動(dòng)架構(gòu)

圖1.1 SPI硬件結(jié)構(gòu)圖

如上圖所示,主設(shè)備對(duì)應(yīng)SOC芯片中的SPI控制器,通常,一個(gè)SOC中可能存在多個(gè)SPI控制器,像上面的例子所示,SOC芯片中有3個(gè)SPI控制器。每個(gè)控制器下可以連接多個(gè)SPI從設(shè)備,每個(gè)從設(shè)備有各自獨(dú)立的CS引腳。每個(gè)從設(shè)備共享另外3個(gè)信號(hào)引腳:SCK、MISO、MOSI。任何時(shí)刻,只有一個(gè)CS引腳處于有效狀態(tài),與該有效CS引腳連接的設(shè)備此時(shí)可以與主設(shè)備(SPI控制器)通信,其它的從設(shè)備處于等待狀態(tài),并且它們的3個(gè)引腳必須處于高阻狀態(tài)。

工作時(shí)序

按照時(shí)鐘信號(hào)和數(shù)據(jù)信號(hào)之間的相位關(guān)系,SPI有4種工作時(shí)序模式:

我們用CPOL表示時(shí)鐘信號(hào)的初始電平的狀態(tài),CPOL為0表示時(shí)鐘信號(hào)初始狀態(tài)為低電平,為1表示時(shí)鐘信號(hào)的初始電平是高電平。另外,我們用CPHA來表示在那個(gè)時(shí)鐘沿采樣數(shù)據(jù),CPHA為0表示在首個(gè)時(shí)鐘變化沿采樣數(shù)據(jù),而CPHA為1則表示要在第二個(gè)時(shí)鐘變化沿來采樣數(shù)據(jù)。內(nèi)核用CPOL和CPHA的組合來表示當(dāng)前SPI需要的工作模式:

·CPOL=0,CPHA=1 模式0

·CPOL=0,CPHA=1 模式1

·CPOL=1,CPHA=0 模式2

·CPOL=1,CPHA=1 模式3

軟件架構(gòu)

在內(nèi)核的SPI驅(qū)動(dòng)的軟件架構(gòu)中,進(jìn)行了合理的分層和抽象,如下圖所示:

圖2.1 SPI驅(qū)動(dòng)的軟件架構(gòu)

SPI控制器驅(qū)動(dòng)程序

SPI控制器不用關(guān)心設(shè)備的具體功能,它只負(fù)責(zé)把上層協(xié)議驅(qū)動(dòng)準(zhǔn)備好的數(shù)據(jù)按SPI總線的時(shí)序要求發(fā)送給SPI設(shè)備,同時(shí)把從設(shè)備收到的數(shù)據(jù)返回給上層的協(xié)議驅(qū)動(dòng),因此,內(nèi)核把SPI控制器的驅(qū)動(dòng)程序獨(dú)立出來。SPI控制器驅(qū)動(dòng)負(fù)責(zé)控制具體的控制器硬件,諸如DMA和中斷操作等等,因?yàn)槎鄠€(gè)上層的協(xié)議驅(qū)動(dòng)可能會(huì)通過控制器請(qǐng)求數(shù)據(jù)傳輸操作,所以,SPI控制器驅(qū)動(dòng)同時(shí)也要負(fù)責(zé)對(duì)這些請(qǐng)求進(jìn)行隊(duì)列管理,保證先進(jìn)先出的原則。

SPI通用接口封裝層

為了簡化SPI驅(qū)動(dòng)程序的編程工作,同時(shí)也為了降低協(xié)議驅(qū)動(dòng)程序和控制器驅(qū)動(dòng)程序的耦合程度,內(nèi)核把控制器驅(qū)動(dòng)和協(xié)議驅(qū)動(dòng)的一些通用操作封裝成標(biāo)準(zhǔn)的接口,加上一些通用的邏輯處理操作,組成了SPI通用接口封裝層。這樣的好處是,對(duì)于控制器驅(qū)動(dòng)程序,只要實(shí)現(xiàn)標(biāo)準(zhǔn)的接口回調(diào)API,并把它注冊到通用接口層即可,無需直接和協(xié)議層驅(qū)動(dòng)程序進(jìn)行交互。而對(duì)于協(xié)議層驅(qū)動(dòng)來說,只需通過通用接口層提供的API即可完成設(shè)備和驅(qū)動(dòng)的注冊,并通過通用接口層的API完成數(shù)據(jù)的傳輸,無需關(guān)注SPI控制器驅(qū)動(dòng)的實(shí)現(xiàn)細(xì)節(jié)。

SPI協(xié)議驅(qū)動(dòng)程序

上面我們提到,控制器驅(qū)動(dòng)程序并不清楚和關(guān)注設(shè)備的具體功能,SPI設(shè)備的具體功能是由SPI協(xié)議驅(qū)動(dòng)程序完成的,SPI協(xié)議驅(qū)動(dòng)程序了解設(shè)備的功能和通信數(shù)據(jù)的協(xié)議格式。向下,協(xié)議驅(qū)動(dòng)通過通用接口層和控制器交換數(shù)據(jù),向上,協(xié)議驅(qū)動(dòng)通常會(huì)根據(jù)設(shè)備具體的功能和內(nèi)核的其它子系統(tǒng)進(jìn)行交互,例如,和MTD層交互以便把SPI接口的存儲(chǔ)設(shè)備實(shí)現(xiàn)為某個(gè)文件系統(tǒng),和TTY子系統(tǒng)交互把SPI設(shè)備實(shí)現(xiàn)為一個(gè)TTY設(shè)備,和網(wǎng)絡(luò)子系統(tǒng)交互以便把一個(gè)SPI設(shè)備實(shí)現(xiàn)為一個(gè)網(wǎng)絡(luò)設(shè)備,等等。當(dāng)然,如果是一個(gè)專有的SPI設(shè)備,我們也可以按設(shè)備的協(xié)議要求,實(shí)現(xiàn)自己的專有協(xié)議驅(qū)動(dòng)。

SPI通用設(shè)備驅(qū)動(dòng)程序

有時(shí)候,考慮到連接在SPI控制器上的設(shè)備的可變性,在內(nèi)核沒有配備相應(yīng)的協(xié)議驅(qū)動(dòng)程序,對(duì)于這種情況,內(nèi)核為我們準(zhǔn)備了通用的SPI設(shè)備驅(qū)動(dòng)程序,該通用設(shè)備驅(qū)動(dòng)程序向用戶空間提供了控制SPI控制的控制接口,具體的協(xié)議控制和數(shù)據(jù)傳輸工作交由用戶空間根據(jù)具體的設(shè)備來完成,在這種方式中,只能采用同步的方式和SPI設(shè)備進(jìn)行通信,所以通常用于一些數(shù)據(jù)量較少的簡單SPI設(shè)備。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11177

    瀏覽量

    208498
  • SPI總線
    +關(guān)注

    關(guān)注

    4

    文章

    102

    瀏覽量

    27553
  • 設(shè)備驅(qū)動(dòng)

    關(guān)注

    0

    文章

    67

    瀏覽量

    10869

原文標(biāo)題:Linux SPI總線和設(shè)備驅(qū)動(dòng)架構(gòu)你都懂了嗎?

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    深度解析linux時(shí)鐘子系統(tǒng)

    linux內(nèi)核中實(shí)現(xiàn)了一個(gè)CLK子系統(tǒng),用于對(duì)上層提供各模塊(例如需要時(shí)鐘信號(hào)的外設(shè),USB等)的時(shí)鐘驅(qū)動(dòng)接口,對(duì)下層提供具體SOC的時(shí)鐘操作細(xì)節(jié)。
    的頭像 發(fā)表于 09-29 16:46 ?165次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>解析</b><b class='flag-5'>linux</b>時(shí)鐘子系統(tǒng)

    自動(dòng)售貨機(jī)MDB總線周邊設(shè)備地址中文解析(三)

    自動(dòng)售貨機(jī)MDB協(xié)議中文解析(三)MDB總線周邊設(shè)備地址
    發(fā)表于 09-09 10:43 ?0次下載

    SPI總線的定義和特點(diǎn)

    SPI總線(Serial Peripheral Interface),全稱為串行外圍設(shè)備接口,是由Motorola公司提出并定義的一種同步、串行、高速的通信總線。
    的頭像 發(fā)表于 09-03 14:05 ?340次閱讀

    linux系統(tǒng)的設(shè)備驅(qū)動(dòng)一般分幾類

    Linux系統(tǒng)的設(shè)備驅(qū)動(dòng)是操作系統(tǒng)與硬件設(shè)備之間的橋梁,負(fù)責(zé)實(shí)現(xiàn)操作系統(tǒng)與硬件設(shè)備之間的通信和控制。Li
    的頭像 發(fā)表于 08-30 15:13 ?290次閱讀

    Linux設(shè)備驅(qū)動(dòng)程序分類有哪些

    Linux設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)與硬件設(shè)備之間的橋梁,負(fù)責(zé)實(shí)現(xiàn)硬件設(shè)備與操作系統(tǒng)之間的通信和控制。Lin
    的頭像 發(fā)表于 08-30 15:11 ?323次閱讀

    linux驅(qū)動(dòng)程序如何加載進(jìn)內(nèi)核

    Linux系統(tǒng)中,驅(qū)動(dòng)程序是內(nèi)核與硬件設(shè)備之間的橋梁。它們允許內(nèi)核與硬件設(shè)備進(jìn)行通信,從而實(shí)現(xiàn)對(duì)硬件設(shè)備的控制和管理。
    的頭像 發(fā)表于 08-30 15:02 ?288次閱讀

    Linux 驅(qū)動(dòng)開發(fā)與應(yīng)用開發(fā),你知道多少?

    一、Linux驅(qū)動(dòng)開發(fā)與應(yīng)用開發(fā)的區(qū)別開發(fā)層次不同:Linux驅(qū)動(dòng)開發(fā)主要是針對(duì)硬件設(shè)備進(jìn)行編程,處于操作系統(tǒng)內(nèi)核層,直接與硬件交互,為上層
    的頭像 發(fā)表于 08-30 12:16 ?366次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>驅(qū)動(dòng)</b>開發(fā)與應(yīng)用開發(fā),你知道多少?

    深度神經(jīng)網(wǎng)絡(luò)(DNN)架構(gòu)解析與優(yōu)化策略

    堆疊多個(gè)隱藏層,逐步提取和轉(zhuǎn)化輸入數(shù)據(jù)的特征,最終實(shí)現(xiàn)復(fù)雜的預(yù)測和分類任務(wù)。本文將對(duì)DNN的架構(gòu)進(jìn)行詳細(xì)解析,并探討其優(yōu)化策略,以期為相關(guān)研究和應(yīng)用提供參考。
    的頭像 發(fā)表于 07-09 11:00 ?1119次閱讀

    ESP32S3 Wroom SPI總線上掛載多個(gè)設(shè)備怎么驅(qū)動(dòng)

    SPI總線上掛載多個(gè)設(shè)備怎么驅(qū)動(dòng) 有沒有demo可以提供?
    發(fā)表于 06-11 07:23

    淺析i2c總線spi總線的區(qū)別

    SPI總線需要4根(最少)或更多的線路,包括主設(shè)備的主時(shí)鐘(SCK),主設(shè)備發(fā)送數(shù)據(jù)的主輸出(MOSI),主設(shè)備接收數(shù)據(jù)的主輸入(MISO)
    發(fā)表于 02-02 16:24 ?2906次閱讀
    淺析i2c<b class='flag-5'>總線</b>和<b class='flag-5'>spi</b><b class='flag-5'>總線</b>的區(qū)別

    總線上的音頻設(shè)備驅(qū)動(dòng)怎么安裝

    安裝總線上的音頻設(shè)備驅(qū)動(dòng)是確保計(jì)算機(jī)聲音正常工作的關(guān)鍵步驟。本文將從安裝的必要性和步驟、常見問題和解決方法以及一些技巧方面詳細(xì)介紹總線上音頻設(shè)備
    的頭像 發(fā)表于 01-24 13:44 ?871次閱讀

    Linux內(nèi)核內(nèi)存管理架構(gòu)解析

    內(nèi)存管理子系統(tǒng)可能是linux內(nèi)核中最為復(fù)雜的一個(gè)子系統(tǒng),其支持的功能需求眾多,如頁面映射、頁面分配、頁面回收、頁面交換、冷熱頁面、緊急頁面、頁面碎片管理、頁面緩存、頁面統(tǒng)計(jì)等,而且對(duì)性能也有很高
    的頭像 發(fā)表于 01-04 09:24 ?594次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核內(nèi)存管理<b class='flag-5'>架構(gòu)</b><b class='flag-5'>解析</b>

    linux內(nèi)核中的SPI框架及SPI核心的初始化簡析

    在嵌入式linux開發(fā)中,SPI是一種常見的通信方式
    的頭像 發(fā)表于 12-11 09:10 ?1831次閱讀
    <b class='flag-5'>linux</b>內(nèi)核中的<b class='flag-5'>SPI</b>框架及<b class='flag-5'>SPI</b>核心的初始化簡析

    linux驅(qū)動(dòng)程序的主要流程和功能

    驅(qū)動(dòng)程序是用于控制和管理硬件設(shè)備的軟件模塊,它主要負(fù)責(zé)與設(shè)備進(jìn)行交互,通過操作設(shè)備的寄存器和接口,實(shí)現(xiàn)對(duì)硬件的控制和訪問。在Linux系統(tǒng)中
    的頭像 發(fā)表于 12-08 14:56 ?2064次閱讀

    Linux內(nèi)核驅(qū)動(dòng)與單個(gè)PCI設(shè)備的綁定和解綁定

    Linux內(nèi)核2.6.13-rc3以前,驅(qū)動(dòng)設(shè)備之間的綁定和解綁只能通過insmod(modprobe)和rmmod來實(shí)現(xiàn),但是這種實(shí)現(xiàn)方法有一個(gè)弊端,就是一旦綁定或者解綁定都是針對(duì)驅(qū)動(dòng)
    的頭像 發(fā)表于 11-17 17:11 ?1455次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核<b class='flag-5'>驅(qū)動(dòng)</b>與單個(gè)PCI<b class='flag-5'>設(shè)備</b>的綁定和解綁定