色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

原來SPI并沒有想的那么簡單

璟琰乀 ? 來源:8號線攻城獅 ? 作者:8號線攻城獅 ? 2020-12-18 16:52 ? 次閱讀

先說串口之前寫過一篇UART,通用串行異步通訊協(xié)議,感興趣可以參考一下《我打賭!你還不會UART》;因為UART沒有時鐘信號,無法控制何時發(fā)送數(shù)據(jù),也無法保證雙發(fā)按照完全相同的速度接收數(shù)據(jù)。因此,雙方以不同的速度進(jìn)行數(shù)據(jù)接收和發(fā)送,就會出現(xiàn)問題。

如果要解決這個問題,UART為每個字節(jié)添加額外的起始位和停止位,以幫助接收器在數(shù)據(jù)到達(dá)時進(jìn)行同步;

雙方還必須事先就傳輸速度達(dá)成共識(設(shè)置相同的波特率,例如每秒9600位)。

傳輸速率如果有微小差異不是問題,因為接收器會在每個字節(jié)的開頭重新同步。相應(yīng)的協(xié)議如下圖所示;

vqeU3a.png

串口傳輸?shù)倪^程

如果您注意到上圖中的11001010不等于0x53,這是一個細(xì)節(jié)。串口協(xié)議通常會首先發(fā)送最低有效位,因此最小位在最左邊LSB。低四位字節(jié)實際上是0011 = 0x3,高四位字節(jié)是0101 = 0x5。

異步串行工作得很好,但是在每個字節(jié)發(fā)送的時候都需要額外的起始位和停止位以及在發(fā)送和接收數(shù)據(jù)所需的復(fù)雜硬件方面都有很多開銷。

不難發(fā)現(xiàn),如果接收端和發(fā)送端設(shè)置的速度都不一致,那么接收到的數(shù)據(jù)將是垃圾(亂碼)。

下面開始講一下SPI協(xié)議,會有哪些優(yōu)點。

SPI通訊協(xié)議于是我們想有沒有更好一點的串行通訊方式;相比較于UART,SPI的工作方式略有不同。

SPI是一個同步的數(shù)據(jù)總線,也就是說它是用單獨的數(shù)據(jù)線和一個單獨的時鐘信號來保證發(fā)送端和接收端的完美同步。

時鐘是一個振蕩信號,它告訴接收端在確切的時機(jī)對數(shù)據(jù)線上的信號進(jìn)行采樣。

產(chǎn)生時鐘的一側(cè)稱為主機(jī),另一側(cè)稱為從機(jī)。總是只有一個主機(jī)(一般來說可以是微控制器/MCU),但是可以有多個從機(jī)(后面詳細(xì)介紹);

數(shù)據(jù)的采集時機(jī)可能是時鐘信號的上升沿(從低到高)或下降沿(從高到低)。

具體要看對SPI的配置;

整體的傳輸大概可以分為以下幾個過程:

主機(jī)先將NSS信號拉低,這樣保證開始接收數(shù)據(jù);

當(dāng)接收端檢測到時鐘的邊沿信號時,它將立即讀取數(shù)據(jù)線上的信號,這樣就得到了一位數(shù)據(jù)(1bit);

由于時鐘是隨數(shù)據(jù)一起發(fā)送的,因此指定數(shù)據(jù)的傳輸速度并不重要,盡管設(shè)備將具有可以運(yùn)行的最高速度(稍后我們將討論選擇合適的時鐘邊沿和速度)。

主機(jī)發(fā)送到從機(jī)時:主機(jī)產(chǎn)生相應(yīng)的時鐘信號,然后數(shù)據(jù)一位一位地將從MOSI信號線上進(jìn)行發(fā)送到從機(jī);

主機(jī)接收從機(jī)數(shù)據(jù):如果從機(jī)需要將數(shù)據(jù)發(fā)送回主機(jī),則主機(jī)將繼續(xù)生成預(yù)定數(shù)量的時鐘信號,并且從機(jī)會將數(shù)據(jù)通過MISO信號線發(fā)送;

具體如下圖所示;

BjAr2i.png

SPI的時序

注意,SPI是“全雙工”(具有單獨的發(fā)送和接收線路),因此可以在同一時間發(fā)送和接收數(shù)據(jù),另外SPI的接收硬件可以是一個簡單的移位寄存器。這比異步串行通信所需的完整UART要簡單得多,并且更加便宜;

SPI特性SPI總線包括4條邏輯線,定義如下:

MISO:Master input slave output 主機(jī)輸入,從機(jī)輸出(數(shù)據(jù)來自從機(jī));

MOSI:Master output slave input 主機(jī)輸出,從機(jī)輸入(數(shù)據(jù)來自主機(jī));

SCLK :Serial Clock 串行時鐘信號,由主機(jī)產(chǎn)生發(fā)送給從機(jī);

SS:Slave Select 片選信號,由主機(jī)發(fā)送,以控制與哪個從機(jī)通信,通常是低電平有效信號。

其他制造商可能會遵循其他命名規(guī)則,但是最終他們指的相同的含義。以下是一些常用術(shù)語;

MISO也可以是SIMO,DOUT,DO,SDO或SO(在主機(jī)端);

MOSI也可以是SOMI,DIN,DI,SDI或SI(在主機(jī)端);

NSS也可以是CE,CS或SSEL;

SCLK也可以是SCK;

本文將按照以下命名進(jìn)行講解[MISO, MOSI, SCK,NSS]

下圖顯示了單個主機(jī)和單個從機(jī)之間的典型SPI連接。

qmyYVf.png

主從連接

時鐘頻率SPI總線上的主機(jī)必須在通信開始時候配置并生成相應(yīng)的時鐘信號。在每個SPI時鐘周期內(nèi),都會發(fā)生全雙工數(shù)據(jù)傳輸。

主機(jī)在MOSI線上發(fā)送一位數(shù)據(jù),從機(jī)讀取它,而從機(jī)在MISO線上發(fā)送一位數(shù)據(jù),主機(jī)讀取它。

就算只進(jìn)行單向的數(shù)據(jù)傳輸,也要保持這樣的順序。這就意味著無論接收任何數(shù)據(jù),必須實際發(fā)送一些東西!在這種情況下,我們稱其為虛擬數(shù)據(jù);

從理論上講,只要實際可行,時鐘速率就可以是您想要的任何速率,當(dāng)然這個速率受限于每個系統(tǒng)能提供多大的系統(tǒng)時鐘頻率,以及最大的SPI傳輸速率。

時鐘極性 CKP/Clock Polarity除了配置串行時鐘速率(頻率)外,SPI主設(shè)備還需要配置時鐘極性。

根據(jù)硬件制造商的命名規(guī)則不同,時鐘極性通常寫為CKP或CPOL。時鐘極性和相位共同決定讀取數(shù)據(jù)的方式,比如信號上升沿讀取數(shù)據(jù)還是信號下降沿讀取數(shù)據(jù);

CKP可以配置為1或0。這意味著您可以根據(jù)需要將時鐘的默認(rèn)狀態(tài)(IDLE)設(shè)置為高或低。極性反轉(zhuǎn)可以通過簡單的邏輯逆變器實現(xiàn)。您必須參考設(shè)備的數(shù)據(jù)手冊才能正確設(shè)置CKP和CKE。

CKP = 0:時鐘空閑 IDLE為低電平 0;

CKP = 1:時鐘空閑 IDLE為高電平 1;

時鐘相位 CKE /Clock Phase (Edge)除配置串行時鐘速率和極性外,SPI主設(shè)備還應(yīng)配置時鐘相位(或邊沿)。根據(jù)硬件制造商的不同,時鐘相位通常寫為CKE或CPHA;

顧名思義,時鐘相位/邊沿,也就是采集數(shù)據(jù)時是在時鐘信號的具體相位或者邊沿;

CKE = 0:在時鐘信號 SCK的第一個跳變沿采樣;

CKE = 1:在時鐘信號 SCK的第二個跳變沿采樣;

時鐘配置總結(jié)綜上幾種情況,下圖總結(jié)了所有時鐘配置組合,并突出顯示了實際采樣數(shù)據(jù)的時刻;

其中黑色線為采樣數(shù)據(jù)的時刻;

藍(lán)色線為SCK時鐘信號;

具體如下圖所示;

qmmYNz.png

模式編號SPI的時鐘極性和相位的配置通常稱為 SPI模式,所有可能的模式都遵循以下約定;具體如下表所示;

SPI ModeCPOLCPHA

0 [00]00

1 [01]01

2 [10]10

3 [11]11

除此之外,我們還應(yīng)該仔細(xì)檢查微控制器數(shù)據(jù)手冊中包含的模式表,以確保一切正常。

多從機(jī)模式前面說到SPI總線必須有一個主機(jī),可以有多個從機(jī),那么具體連接到SPI總線的方法有以下兩種:

第一種方法:多NSS

通常,每個從機(jī)都需要一條單獨的SS線。

如果要和特定的從機(jī)進(jìn)行通訊,可以將相應(yīng)的 NSS信號線拉低,并保持其他 NSS信號線的狀態(tài)為高電平;如果同時將兩個 NSS信號線拉低,則可能會出現(xiàn)亂碼,因為從機(jī)可能都試圖在同一條 MISO線上傳輸數(shù)據(jù),最終導(dǎo)致接收數(shù)據(jù)亂碼。

具體連接方式如下圖所示;

f6n2yu.png

多NSS連接

第二種方法:菊花鏈

在數(shù)字通信世界中,在設(shè)備信號(總線信號或中斷信號)以串行的方式從一 個設(shè)備依次傳到下一個設(shè)備,不斷循環(huán)直到數(shù)據(jù)到達(dá)目標(biāo)設(shè)備的方式被稱為菊花鏈。

菊花鏈的最大缺點是因為是信號串行傳輸,所以一旦數(shù)據(jù)鏈路中的某設(shè)備發(fā)生故障的時候,它下面優(yōu)先級較低的設(shè)備就不可能得到服務(wù)了;

另一方面,距離主機(jī)越遠(yuǎn)的從機(jī),獲得服務(wù)的優(yōu)先級越低,所以需要安排好從機(jī)的優(yōu)先級,并且設(shè)置總線檢測器,如果某個從機(jī)超時,則對該從機(jī)進(jìn)行短路,防止單個從機(jī)損壞造成整個鏈路崩潰的情況;

具體的連接如下圖所示;

菊花鏈連接

其中紅線加粗為數(shù)據(jù)的流向;

所以最終的數(shù)據(jù)流向圖可以表示為:

z6ZFNv.png

數(shù)據(jù)流圖

SCK為時鐘信號,8clks表示8個邊沿信號;

其中D為數(shù)據(jù),X為無效數(shù)據(jù);

所以不難發(fā)現(xiàn),菊花鏈模式充分使用了SPI其移位寄存器的功能,整個鏈充當(dāng)通信移位寄存器,每個從機(jī)在下一個時鐘周期將輸入數(shù)據(jù)復(fù)制到輸出。

優(yōu)缺點SPI通訊的優(yōu)勢使SPI作為串行通信接口脫穎而出的原因很多;

全雙工串行通信;

高速數(shù)據(jù)傳輸速率。

簡單的軟件配置;

極其靈活的數(shù)據(jù)傳輸,不限于8位,它可以是任意大小的字;

非常簡單的硬件結(jié)構(gòu)。從站不需要唯一地址(與I2C不同)。從機(jī)使用主機(jī)時鐘,不需要精密時鐘振蕩器/晶振(與UART不同)。不需要收發(fā)器(與CAN不同)。

SPI的缺點沒有硬件從機(jī)應(yīng)答信號(主機(jī)可能在不知情的情況下無處發(fā)送);

通常僅支持一個主設(shè)備;

需要更多的引腳(與I2C不同);

沒有定義硬件級別的錯誤檢查協(xié)議;

RS-232和CAN總線相比,只能支持非常短的距離;

編程實現(xiàn)下面是通過STM32的cubemx自動生成的HAL庫代碼,比較簡單,截取了其中一部分,具體如下;

static void MX_SPI1_Init(void){ hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; //主機(jī)模式 hspi1.Init.Direction = SPI_DIRECTION_2LINES; //全雙工 hspi1.Init.DataSize = SPI_DATASIZE_8BIT; //數(shù)據(jù)位為8位 hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; //CPOL=0 hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; //CPHA為數(shù)據(jù)線的第一個變化沿 hspi1.Init.NSS = SPI_NSS_SOFT; //軟件控制NSS hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;//2分頻,32M/2=16MHz hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; //最高位先發(fā)送 hspi1.Init.TIMode = SPI_TIMODE_DISABLE; //TIMODE模式關(guān)閉 hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//CRC關(guān)閉 hspi1.Init.CRCPolynomial = 10; //默認(rèn)值,無效 if (HAL_SPI_Init(&hspi1) != HAL_OK) //初始化 { _Error_Handler(__FILE__, __LINE__); }} //發(fā)送數(shù)據(jù)HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//接收數(shù)據(jù)HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);

責(zé)任編輯:haq

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

    關(guān)注

    18

    文章

    6069

    瀏覽量

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

    關(guān)注

    17

    文章

    1721

    瀏覽量

    91964
  • 串行通信
    +關(guān)注

    關(guān)注

    4

    文章

    577

    瀏覽量

    35534
收藏 人收藏

    評論

    相關(guān)推薦

    請問有沒有ADS1293的SPI的各個寄存器的介紹?

    請問有沒有ADS1293的SPI的各個寄存器的介紹,數(shù)據(jù)手冊中并沒有詳細(xì)介紹,TI給的官方歷程中涉及到很多與開發(fā)板相關(guān)的引腳,所以不太理解給出的例程。
    發(fā)表于 01-15 07:05

    ADS58B18通過SPI控制將其test pattern寄存器設(shè)置為001或010,為什么輸出并沒有全為0或1而是變化的?

    ADS58B18通過SPI控制將其 test pattern 寄存器設(shè)置為001或010,但其輸出并沒有全為 0或1,而是變化的。我通過SPI讀該寄存器,ovr_sdout輸出顯示該寄存器已經(jīng)
    發(fā)表于 01-15 07:04

    DAC5687沒有設(shè)置差分,采用的等效單端,那么內(nèi)部PLL可以工作嗎?

    時鐘模式采用PLL模式,datasheet要求輸入時鐘采用差分,但是我并沒有設(shè)置差分,而是采用的等效單端,那么內(nèi)部PLL可以工作嗎? 如今情況是可以測到滿偏電流,但是輸出端一直是高電平,有個小波動,這是為什么啊?
    發(fā)表于 01-09 08:17

    編寫好ADS1148讀寫數(shù)據(jù)的驅(qū)動時候,發(fā)現(xiàn)SPI總線上的數(shù)據(jù)并沒有被讀回來,是什么原因呢?

    在編寫好ADS1148 讀寫數(shù)據(jù)的驅(qū)動時候,發(fā)現(xiàn)SPI總線上的數(shù)據(jù)并沒有被讀回來,從示波器上,可以發(fā)現(xiàn)SPI的read命令是沒有問題的,可是SDO上面沒數(shù)據(jù),后來進(jìn)一步查看是ADS11
    發(fā)表于 12-06 07:13

    使用ADS5281時,ADCLKN/P,CLKP/N的輸出是高電平并沒有1X,6X的正弦信號,為什么?

    在使用ADS5281時,輸入電壓正常,Vcm輸出電壓為1.48V,REFT和REFB輸入如下: 但是ADCLKN/P,CLKP/N的輸出是高電平,并沒有1X,6X的正弦信號,非常期待解答,感謝!
    發(fā)表于 11-14 07:58

    進(jìn)行ads1299短接噪聲測試時,增益更改后短接噪聲并沒有發(fā)生變化,為什么?

    在進(jìn)行ads1299短接噪聲測試時,ads1299的增益更改,短接噪聲并沒有發(fā)生變化,而且在使用內(nèi)部方波測試時,方波不對成,在增益為1時,短接噪聲為0.35mV左右,這是為什么呢
    發(fā)表于 11-14 07:46

    TPA2005為什么實際測量輸出波形根輸入一樣,并沒有放大阿?

    我選用的TPA2005D1芯片,輸入電容3300pF,輸入電阻150K。輸出33uH(160mA)電感,1uF電容。 為什么實際測量輸出波形根輸入一樣,并沒有放大阿? 輸入波形:1k,1V的音頻信號。
    發(fā)表于 10-12 08:46

    THS7530增益控制電壓加到0.9V并沒有放大到40多dB,為什么?

    按照數(shù)據(jù)手冊上FIG.21的接法,輸入100mV VPP以下的信號,增益控制電壓加到0.9V并沒有放大到40多dB,只放大到700mV VPP;下圖是TINA里面的仿真模型,為什么增益控制電壓
    發(fā)表于 09-06 08:18

    為什么INA188的GBW并沒有1Mhz?

    請問下,為什么INA188的GBW并沒有1Mhz, 但是在官方推薦的應(yīng)用(TIDA-01063)中卻可以適用于20Mhz的傳感器的檢測?
    發(fā)表于 08-02 10:39

    單獨使用AFE031芯片并沒有任何輸出怎么解決?

    你好,在使用AFE031芯片與非C2000系列芯片連接時,按照C2000Ware中boostxl_afe031_f28379d_dacmode示例中初始化完成后,使用SPI任意向AFE031芯片發(fā)送一個數(shù)據(jù),示波器中并沒有數(shù)據(jù)變化,請問這種情況怎么解決呢?
    發(fā)表于 07-30 06:48

    編譯運(yùn)行ESP8266_RTOS_SDK-master,發(fā)現(xiàn)程序并沒有正確執(zhí)行,為什么?

    ,eagle.irom0text.bin---->0x20000燒寫到相應(yīng)地址,程序運(yùn)行后,發(fā)現(xiàn)并沒有正確執(zhí)行,請問是否燒寫地址錯誤,或者是配置FLASH錯誤
    發(fā)表于 07-12 08:21

    靜態(tài)庫中定義的INIT_DEVICE_EXPORT函數(shù)并沒有被系統(tǒng)調(diào)用,為什么?

    1,將一段代碼編譯成靜態(tài)庫 2,主工程鏈接這個靜態(tài)庫 3,靜態(tài)庫里的函數(shù)并沒有被主工程調(diào)用 4,靜態(tài)庫中定義了一些 INIT_DEVICE_EXPORT 函數(shù) 問題: 靜態(tài)庫中定義的 INIT_DEVICE_EXPORT 函數(shù)并沒有被系統(tǒng)調(diào)用,百思不得其解,求各位大佬指
    發(fā)表于 07-04 06:49

    用一塊fpga板通過杜邦線以SPI的方式控制AD5504,連接后發(fā)現(xiàn)并沒有控制上AD5504,為什么?

    我使用一塊fpga板通過杜邦線以SPI的方式控制AD5504,但是我連接后發(fā)現(xiàn)并沒有控制上AD5504。我的程序是:一開始發(fā)送一次control寄存器的控制數(shù)據(jù),然后就一直發(fā)送input寄存器的控制
    發(fā)表于 05-31 06:24

    在進(jìn)行ad9626的配置后,測試DCO并沒有時鐘的輸出的原因?

    在進(jìn)行ad9626的配置后,測試DCO并沒有時鐘的輸出,然后進(jìn)行寄存器ID數(shù)據(jù)的讀出,讀出了ID地址的數(shù)據(jù),然后再次進(jìn)行了配置寄存器,DCO還是沒有時鐘的輸出。
    發(fā)表于 02-27 07:25

    在Sense Tuner中并沒有找到相關(guān)的I2C設(shè)置,請問真么設(shè)置才能將UART變?yōu)镮2C?

    在Sense Tuner中并沒有找到相關(guān)的I2C設(shè)置,請問真么設(shè)置才能將UART變?yōu)镮2C?
    發(fā)表于 02-02 08:59
    主站蜘蛛池模板: JIZZ学生13| 亚洲国产三级在线观看 | 欧美日韩精品不卡在线观看 | 伊人久99久女女视频精品免 | 久久免费视频在线观看6 | 亚洲国产在线观看免费视频 | 2020最新国产自产精品 | 日韩 亚洲 欧美 中文 高清 | 国产免费人成在线视频有码 | 97人妻AV天天澡夜夜爽 | 日韩AV成人无码久久精品老人 | a视频免费在线 | 老王午夜69精品影院 | 国产色婷婷亚洲99精品 | 91久久精一区二区三区大全 | 在线视频久久只有精品第一日韩 | 亚洲精品在线播放视频 | 男女疯狂一边摸一边做羞羞视频 | 国产精品久久久精品a级小说 | 国产成人一区二区三区在线观看 | 乐乐亚洲精品综合影院 | 久草视频在线观看免费4 | 国产亚洲精品久久久久久入口 | 狠狠狠色丁香婷婷综合久久 | 中文字幕本庄优花喂奶 | qvod 韩国| 旧里番ovaの催○セイ活指导 | 国产精品九九九久久九九 | 老师湿乎乎两半嫩 | 久久国产精品久久国产精品 | 爱豆剧果冻传媒在线播放 | 午夜国产精品影院在线观看 | 免费视频不卡 | 老师真棒无遮瑕版漫画免费 | 国产69精品久久久久人妻刘玥 | 飘雪韩国在线观看免费高清完整版 | 內射XXX韩国在线观看 | 色综合久久五月 | 日本xxx护士与黑人 日本xxxx裸体xxxx | 精品一二三区久久AAA片 | 芳草地在线观看免费视频 |