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

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

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

嵌入式系統(tǒng)低速接口SPI講解

云深之無(wú)跡 ? 來(lái)源:云深之無(wú)跡 ? 2023-08-14 09:59 ? 次閱讀

我一直以為SPI比IIC難的,因?yàn)榭赡苁且驗(yàn)槭褂昧吮容^“重型”的傳感器才會(huì)搭配這個(gè)接口。

但是今天用FPGA寫了一個(gè)簡(jiǎn)單的移位寄存器,感覺(jué)不一樣,甚至是不對(duì)勁。

65d370e2-3904-11ee-9e74-dac502259ad0.png

移位寄存器按照移位方向可分為左移位寄存器、右移位寄存器、雙向移位寄存器。

65fa6076-3904-11ee-9e74-dac502259ad0.png

這個(gè)圖記住,菊花鏈也跑不了

660cb41a-3904-11ee-9e74-dac502259ad0.png

這個(gè)是STM32F103的主從設(shè)備的示意

MOSI腳相互連接,MISO腳相互連接。這樣,數(shù)據(jù)在主和從之間串行地傳輸(MSB位在前)。通信總是由主設(shè)備發(fā)起。主設(shè)備通過(guò)MOSI腳把數(shù)據(jù)發(fā)送給從設(shè)備,從設(shè)備通過(guò)MISO引腳回傳數(shù)據(jù)。這意味全雙工通信的數(shù)據(jù)輸出和數(shù)據(jù)輸入是用同一個(gè)時(shí)鐘信號(hào)同步的;時(shí)鐘信號(hào)由主設(shè)備通過(guò)SCK腳提供。

其實(shí)最近一段時(shí)間我頻繁在機(jī)器人系統(tǒng)里面,比如FPGA和ARM的控制核之間,發(fā)現(xiàn)它們之間的交互都是使用SPI。也就是說(shuō)設(shè)計(jì)人員需要具有簡(jiǎn)單的設(shè)備到設(shè)備數(shù)字接口的微控制器、外設(shè)和傳感器,以便可以高速處理任意長(zhǎng)度的數(shù)據(jù),并且省去與協(xié)議相關(guān)的復(fù)雜編程任務(wù)。

6625da9e-3904-11ee-9e74-dac502259ad0.png

基本SPI全雙工連接使用兩條數(shù)據(jù)線(MOSI、MISO)、一條時(shí)鐘線 (SCK) 和一條片選線 (CS)。從設(shè)備上的MOSI有時(shí)標(biāo)記為從設(shè)備數(shù)據(jù)輸入 (SDI)。MISO可標(biāo)記為從設(shè)備數(shù)據(jù)輸出 (SDO)。

6641936a-3904-11ee-9e74-dac502259ad0.png

兩種處理多個(gè)從設(shè)備連接的配置。直接連接方式下每個(gè)從設(shè)備需要一個(gè)片選信號(hào)。菊花鏈連接方式僅使用一個(gè)片選信號(hào),并將所有數(shù)據(jù)集中在一條線上。

6671c8e6-3904-11ee-9e74-dac502259ad0.png

主要看箭頭,多個(gè)從機(jī)

66912164-3904-11ee-9e74-dac502259ad0.png

菊花鏈

在菊花鏈模式下,所有從機(jī)的片選信號(hào)連接在一起,數(shù)據(jù)從一個(gè) 從機(jī)傳播到下一個(gè)從機(jī)。在此配置中,所有從機(jī)同時(shí)接收同一SPI 時(shí)鐘。

來(lái)自主機(jī)的數(shù)據(jù)直接送到第一個(gè)從機(jī),該從機(jī)將數(shù)據(jù)提供 給下一個(gè)從機(jī),依此類推。使用該方法時(shí),由于數(shù)據(jù)是從一個(gè)從機(jī)傳播到下一個(gè)從機(jī),所以 傳輸數(shù)據(jù)所需的時(shí)鐘周期數(shù)與菊花鏈中的從機(jī)位置成比例。

66cea4f8-3904-11ee-9e74-dac502259ad0.png

在圖所示的8位系統(tǒng)中,為使第3個(gè)從機(jī)能夠獲得數(shù)據(jù),需要24個(gè) 時(shí)鐘脈沖,而常規(guī)SPI模式下只需8個(gè)時(shí)鐘脈沖。

一般Master設(shè)備就是我們的MCU,Master 設(shè)備會(huì)根據(jù)將要交換的數(shù)據(jù)來(lái)產(chǎn)生相應(yīng)的時(shí)鐘脈沖(Clock Pulse),時(shí)鐘脈沖組成了時(shí)鐘信號(hào)(Clock Signal) ,時(shí)鐘信號(hào)通過(guò)時(shí)鐘極性 (CPOL) 和 時(shí)鐘相位 (CPHA) 控制著兩個(gè) SPI 設(shè)備間何時(shí)數(shù)據(jù)交換以及何時(shí)對(duì)接收到的數(shù)據(jù)進(jìn)行采樣,來(lái)保證數(shù)據(jù)在兩個(gè)設(shè)備之間是同步傳輸?shù)摹?/p>

SPI 設(shè)備間的數(shù)據(jù)傳輸之所以又被稱為數(shù)據(jù)交換,是因?yàn)?SPI 協(xié)議規(guī)定一個(gè) SPI 設(shè)備不能在數(shù)據(jù)通信過(guò)程中僅僅只充當(dāng)一個(gè) "發(fā)送者(Transmitter)" 或者 "接收者(Receiver)"。

在每個(gè) Clock 周期內(nèi),SPI 設(shè)備都會(huì)發(fā)送并接收一個(gè) bit 大小的數(shù)據(jù)(不管主設(shè)備好還是從設(shè)備),相當(dāng)于該設(shè)備有一個(gè) bit 大小的數(shù)據(jù)被交換了。一個(gè) Slave 設(shè)備要想能夠接收到 Master 發(fā)過(guò)來(lái)的控制信號(hào),必須在此之前能夠被 Master 設(shè)備進(jìn)行訪問(wèn) (Access)。所以,Master 設(shè)備必須首先通過(guò) SS/CS pin 對(duì) Slave 設(shè)備進(jìn)行片選, 把想要訪問(wèn)的 Slave 設(shè)備選上。

在數(shù)據(jù)傳輸?shù)倪^(guò)程中,每次接收到的數(shù)據(jù)必須在下一次數(shù)據(jù)傳輸之前被采樣。如果之前接收到的數(shù)據(jù)沒(méi)有被讀取,那么這些已經(jīng)接收完成的數(shù)據(jù)將有可能會(huì)被丟棄,導(dǎo)致 SPI 物理模塊最終失效。

因此,在程序中一般都會(huì)在 SPI 傳輸完數(shù)據(jù)后,去讀取 SPI 設(shè)備里的數(shù)據(jù), 即使這些數(shù)據(jù)(Dummy Data)在我們的程序里是無(wú)用的(雖然發(fā)送后緊接著的讀取是無(wú)意義的,但仍然需要從寄存器中讀出來(lái))。

在SPI通信期間,數(shù)據(jù)的發(fā)送(串行移出到MOSI/SDO總線上)和接收(采樣或讀入總線(MISO/ SDI)上的數(shù)據(jù))同時(shí)進(jìn)行。

所以捏SPI沒(méi)有讀和寫的說(shuō)法,因?yàn)閷?shí)質(zhì)上每次SPI是主從設(shè)備在交換數(shù)據(jù)。也就是說(shuō),你發(fā)一個(gè)數(shù)據(jù)必然會(huì)收到一個(gè)數(shù)據(jù);你要收一個(gè)數(shù)據(jù)必須也要先發(fā)一個(gè)數(shù)據(jù)。

就像IIC一樣,SPI也是需要找到誰(shuí)在通訊的,比較費(fèi)引腳,必須有一個(gè)片選的腳。來(lái)自主機(jī)的片選信號(hào)用于選擇從機(jī)。這通常是一個(gè)低電平有效信號(hào),拉高時(shí)從機(jī)與SPI總線斷開(kāi)連接。當(dāng)使用多個(gè)從機(jī)時(shí),主機(jī)需要為每個(gè)從機(jī)提供單獨(dú)的片選信號(hào)。

要開(kāi)始SPI通信,主機(jī)必須發(fā)送時(shí)鐘信號(hào),并通過(guò)使能CS信號(hào)選擇從機(jī)。片選通常是低電平有效信號(hào)。

因此,主機(jī)必須在該信號(hào)上發(fā)送邏輯0以選擇從機(jī)。SPI是全雙工接口,主機(jī)和從機(jī)可以分別 通過(guò)MOSI和MISO線路同時(shí)發(fā)送數(shù)據(jù)。

在SPI中,主機(jī)可以選擇時(shí)鐘極性和時(shí)鐘相位。

在空閑狀態(tài)期間,CPOL位設(shè)置時(shí)鐘信號(hào)的極性。空閑狀態(tài)是指?jìng)鬏旈_(kāi)始時(shí)CS為 高電平且在向低電平轉(zhuǎn)變的期間,以及傳輸結(jié)束時(shí)CS為低電平且 在向高電平轉(zhuǎn)變的期間。

CPHA位選擇時(shí)鐘相位。根據(jù)CPHA位的狀態(tài),使用時(shí)鐘上升沿或下降沿來(lái)采樣和/或移位數(shù)據(jù)。主機(jī)必須根據(jù)從機(jī)的要求選擇時(shí)鐘極性和時(shí)鐘相位。根據(jù)CPOL和CPHA位的選擇,有四種SPI模式可用。

66ecdff4-3904-11ee-9e74-dac502259ad0.png

數(shù)據(jù)顯示在MOSI和MISO線上。傳輸?shù)拈_(kāi)始和結(jié)束用綠色虛線表示,采樣邊沿用橙色虛線表示,移位邊沿用藍(lán)色虛線表示。

671a3ae4-3904-11ee-9e74-dac502259ad0.png

SPI模式0,CPOL = 0,CPHA = 0:CLK空閑狀態(tài) = 低電平,數(shù)據(jù)在上升沿采樣,并在下降沿移出。

一采樣,一移位。

由主設(shè)備控制并生成時(shí)鐘。時(shí)鐘的兩個(gè)屬性分別是時(shí)鐘極性 (CPOL) 和時(shí)鐘相位 (CPHA)。這些屬性控制從設(shè)備相對(duì)數(shù)據(jù)進(jìn)行計(jì)時(shí)的有效時(shí)鐘邊沿。CPOL = 0時(shí),將時(shí)鐘設(shè)為在邏輯0位置空閑。CPOL = 1時(shí),時(shí)鐘在邏輯1位置空閑。CPHA = 0時(shí),數(shù)據(jù)在上升沿計(jì)時(shí),CPHA = 1時(shí),數(shù)據(jù)在下降沿計(jì)時(shí)(圖3)。

67409dba-3904-11ee-9e74-dac502259ad0.png

SPI時(shí)鐘模式選擇確定了進(jìn)行數(shù)據(jù)采樣的有效時(shí)鐘邊沿。

主設(shè)備中的CPOL和CPHA線路設(shè)置決定了時(shí)鐘極性以及進(jìn)行數(shù)據(jù)計(jì)時(shí)的有效邊沿。模式1是最常用的模式,但設(shè)計(jì)人員同樣可以使用其他三種模式。

677d83ce-3904-11ee-9e74-dac502259ad0.png

上面的軌跡是數(shù)據(jù)線,中間的軌跡是時(shí)鐘,底部的軌跡是片選信號(hào)。數(shù)據(jù)軌跡上的藍(lán)色覆蓋區(qū)顯示的是十六進(jìn)制解碼內(nèi)容。

讓我來(lái)帶你看個(gè)MC的芯片手冊(cè),看看不一樣的SPI。

681eeb60-3904-11ee-9e74-dac502259ad0.png

一個(gè)SPI的溫度計(jì)

68458d4c-3904-11ee-9e74-dac502259ad0.png

別問(wèn)咋搞,直接街上

6855144c-3904-11ee-9e74-dac502259ad0.png

很多的時(shí)候,我們是使用傳感器直接寫,但是在機(jī)器人里面我們需要自己寫一個(gè)傳輸?shù)膮f(xié)議,這個(gè)是后話。

我們先看一個(gè)電氣層的參數(shù)。

6888000a-3904-11ee-9e74-dac502259ad0.png

首先建立這些的時(shí)間都是ns級(jí)別,怎么說(shuō)呢,俺說(shuō)不明白。

說(shuō)說(shuō)這些東西的意思,我覺(jué)得是滿足不同人的需求,比如我現(xiàn)在就拿出一塊51,我就能輸出個(gè)高低電平,你能咋。

68a04264-3904-11ee-9e74-dac502259ad0.png

所以這些寫模擬協(xié)議的時(shí)候就有用,因?yàn)閷?duì)于器件來(lái)說(shuō),我才不管什么東西插了我,反正說(shuō)的通就行。

片選 (Chip Enable, CE) 、串行時(shí)鐘 (Serial Clock, SCK) 、串行數(shù)據(jù)輸入 (Serial Data Input,SDI)以及串行數(shù)據(jù)輸出(Serial Data Output, SDO )信號(hào)線。

CE 輸入用于在有多個(gè)器件連接到串行時(shí)鐘和數(shù)據(jù)線時(shí)選擇器件。CE 為高電平有效,當(dāng) CE 等于邏輯高電平時(shí),數(shù)據(jù)可以寫入器件或從器件讀出。CE 為低電平 時(shí), SCK 輸入被禁止。

68fbc4ae-3904-11ee-9e74-dac502259ad0.png

抬高的時(shí)候,就是到我啦!

CE 線的上升沿啟動(dòng)讀或?qū)懖僮?,?CE 的下降沿結(jié)束讀或?qū)懖僮鳌?/p>

69109f5a-3904-11ee-9e74-dac502259ad0.png

SCK 輸入由外部單片機(jī)提供,用于同步 SDI 和 SDO 線 的數(shù)據(jù)。

692631c6-3904-11ee-9e74-dac502259ad0.png

SDI 輸入向傳感器的控制寄存器寫入數(shù)據(jù),而 SDO從溫度寄存器中輸出溫度數(shù)據(jù)和控制寄存器關(guān)斷位的狀態(tài)。

傳感器具有能在 SCK輸入信號(hào)為有效高電平或低電平時(shí)工作的能力。當(dāng) CE 信號(hào)變成高電平時(shí),檢測(cè)到 SCK 的 無(wú)效狀態(tài),而時(shí)鐘輸入 (CP)的極性決定數(shù)據(jù)是在系統(tǒng)時(shí)鐘的上升沿或下降沿移入或移出。

694bf640-3904-11ee-9e74-dac502259ad0.png

給出了用于傳送數(shù)據(jù)到寄存器和從寄存器移出數(shù) 據(jù)的相應(yīng)時(shí)鐘邊沿。每個(gè)時(shí)鐘脈沖傳送一位數(shù)據(jù),數(shù)據(jù)位以 8 位為一組傳送。

696b8ac8-3904-11ee-9e74-dac502259ad0.png

A就是地址

先發(fā)送地址字節(jié),隨后為數(shù)據(jù)。地址的最高位 A7 決定 要進(jìn)行讀操作還是寫操作。

如果 A7 =“0”,將進(jìn)行一個(gè)或多個(gè)讀操作;否則 A7 = “1”,進(jìn)行一個(gè)或多個(gè)寫操作。

69953c2e-3904-11ee-9e74-dac502259ad0.png

地址+L+M

數(shù)據(jù)可以采用單字節(jié)或多字節(jié)包的方式進(jìn)行傳送,如圖所示。在 3 字節(jié)包中,數(shù)據(jù)序列包括溫度數(shù)據(jù)的 MSb、溫度數(shù)據(jù)的 LSb 和緊接著的控制寄存器數(shù)據(jù)。通 過(guò)向寄存器寫入所需數(shù)據(jù)包的最高地址來(lái)啟動(dòng)多字節(jié)讀功能。

這段有問(wèn)題,我明天改正。

審核編輯:湯梓紅

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

    關(guān)注

    2545

    文章

    50453

    瀏覽量

    751099
  • FPGA
    +關(guān)注

    關(guān)注

    1625

    文章

    21625

    瀏覽量

    601245
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5295

    瀏覽量

    119824
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8450

    瀏覽量

    150726
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1688

    瀏覽量

    91215

原文標(biāo)題:嵌入式系統(tǒng)低速接口-SPI

文章出處:【微信號(hào):TT1827652464,微信公眾號(hào):云深之無(wú)跡】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    調(diào)試嵌入式系統(tǒng)設(shè)計(jì)中的低速串行總線

    調(diào)試嵌入式系統(tǒng)設(shè)計(jì)中的低速串行總線今天,嵌入式系統(tǒng)幾乎遍布在人類社會(huì)的每個(gè)角落。嵌入式
    發(fā)表于 11-26 09:33

    嵌入式硬件通信接口協(xié)議SPI講解

    嵌入式硬件通信接口協(xié)議-SPI(一)協(xié)議基礎(chǔ)
    發(fā)表于 07-19 09:03

    嵌入式系統(tǒng)接口應(yīng)用

    嵌入式系統(tǒng)原理與接口技術(shù)》——嵌入式系統(tǒng)接口應(yīng)用基礎(chǔ)本文為我負(fù)責(zé)編寫的電子工業(yè)出版社出版的《
    發(fā)表于 08-09 06:56

    嵌入式系統(tǒng)接口測(cè)試

    嵌入式系統(tǒng)接口測(cè)試策略嵌入式系統(tǒng)接口測(cè)試策略摘要:在日益廣泛應(yīng)用的
    發(fā)表于 10-27 08:41

    調(diào)試嵌入式系統(tǒng)設(shè)計(jì)中的低速串行總線(二)

    調(diào)試嵌入式系統(tǒng)設(shè)計(jì)中的低速串行總線(二)SPI背景知識(shí)串行外設(shè)接口總線(SPI)最初是摩托羅拉在
    發(fā)表于 11-26 21:39 ?1175次閱讀
    調(diào)試<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>設(shè)計(jì)中的<b class='flag-5'>低速</b>串行總線(二)

    DSP嵌入式系統(tǒng)人機(jī)接口設(shè)計(jì)

    DSP嵌入式系統(tǒng)人機(jī)接口設(shè)計(jì)  1 引言   人機(jī)接口嵌入式控制系統(tǒng)的重要組成部分,用于
    發(fā)表于 12-24 16:34 ?944次閱讀
    DSP<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>人機(jī)<b class='flag-5'>接口</b>設(shè)計(jì)

    基于嵌入式系統(tǒng)的Internet接口開(kāi)發(fā)

    基于嵌入式系統(tǒng)的Internet接口開(kāi)發(fā)
    發(fā)表于 02-07 17:25 ?11次下載

    低速數(shù)據(jù)采集系統(tǒng)設(shè)計(jì),DSP嵌入式系統(tǒng)開(kāi)發(fā)典型案例

    低速數(shù)據(jù)采集系統(tǒng)設(shè)計(jì),DSP嵌入式系統(tǒng)開(kāi)發(fā)典型案例
    發(fā)表于 10-19 10:28 ?17次下載
    中<b class='flag-5'>低速</b>數(shù)據(jù)采集<b class='flag-5'>系統(tǒng)</b>設(shè)計(jì),DSP<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>開(kāi)發(fā)典型案例

    嵌入式硬件通信接口協(xié)議中的串行通信接口-SPI

    本節(jié)繼續(xù)講嵌入式硬件通信接口協(xié)議中的另外一個(gè)串行通信接口-SPI。相比于UART串口協(xié)議,SPI又有著其獨(dú)特之處。
    發(fā)表于 02-05 11:35 ?1621次閱讀
    <b class='flag-5'>嵌入式</b>硬件通信<b class='flag-5'>接口</b>協(xié)議中的串行通信<b class='flag-5'>接口</b>-<b class='flag-5'>SPI</b>

    嵌入式系統(tǒng)嵌入式PLC

    嵌入式系統(tǒng)嵌入式PLC基礎(chǔ)知識(shí)講解
    發(fā)表于 04-20 16:30 ?27次下載

    基于RTOS的嵌入式系統(tǒng)軟件的設(shè)計(jì)講解

    基于RTOS的嵌入式系統(tǒng)軟件的設(shè)計(jì)講解(樹(shù)莓派嵌入式開(kāi)發(fā)板)-該文檔為基于RTOS的嵌入式系統(tǒng)
    發(fā)表于 07-30 10:03 ?8次下載
    基于RTOS的<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>軟件的設(shè)計(jì)<b class='flag-5'>講解</b>

    嵌入式系統(tǒng)基礎(chǔ)知識(shí)講解

    嵌入式系統(tǒng)基礎(chǔ)知識(shí)講解(嵌入式開(kāi)發(fā)知識(shí))-該文檔為嵌入式系統(tǒng)基礎(chǔ)知識(shí)
    發(fā)表于 07-30 10:32 ?13次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>基礎(chǔ)知識(shí)<b class='flag-5'>講解</b>

    嵌入式軟件接口怎么測(cè)試,嵌入式系統(tǒng)接口測(cè)試策略.doc

    嵌入式系統(tǒng)接口測(cè)試策略嵌入式系統(tǒng)接口測(cè)試策略摘要:在日益廣泛應(yīng)用的
    發(fā)表于 10-20 19:06 ?16次下載
    <b class='flag-5'>嵌入式</b>軟件<b class='flag-5'>接口</b>怎么測(cè)試,<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>接口</b>測(cè)試策略.doc

    嵌入式硬件通信接口協(xié)議-SPI(二)分層架構(gòu)設(shè)計(jì)模擬接口

    嵌入式硬件通信接口協(xié)議-SPI(二)分層架構(gòu)設(shè)計(jì)模擬接口
    發(fā)表于 12-09 12:36 ?19次下載
    <b class='flag-5'>嵌入式</b>硬件通信<b class='flag-5'>接口</b>協(xié)議-<b class='flag-5'>SPI</b>(二)分層架構(gòu)設(shè)計(jì)模擬<b class='flag-5'>接口</b>

    嵌入式系統(tǒng)低速接口SPI和UART的區(qū)別

    繼續(xù)說(shuō)SPI,SPI來(lái)說(shuō)就是沒(méi)有IIC那么固定。它就是設(shè)計(jì)了一種二進(jìn)制流的交互方式,所以這也是為什么它那么靈活的原因。它可以在任何兩個(gè)嵌入式的設(shè)備之間交換消息。
    的頭像 發(fā)表于 08-14 11:44 ?1394次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>低速</b><b class='flag-5'>接口</b><b class='flag-5'>SPI</b>和UART的區(qū)別