91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

璟琰乀 ? 來源:8號線攻城獅 ? 作者:8號線攻城獅 ? 2020-12-18 16:52 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

vqeU3a.png

串口傳輸?shù)倪^程

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

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

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

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

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

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

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

產(chǎn)生時鐘的一側稱為主機,另一側稱為從機??偸侵挥幸粋€主機(一般來說可以是微控制器/MCU),但是可以有多個從機(后面詳細介紹);

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

具體要看對SPI的配置;

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

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

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

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

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

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

具體如下圖所示;

BjAr2i.png

SPI的時序

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

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

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

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

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

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

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

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

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

NSS也可以是CE,CS或SSEL;

SCLK也可以是SCK;

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

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

qmyYVf.png

主從連接

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

藍色線為SCK時鐘信號;

具體如下圖所示;

qmmYNz.png

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

SPI ModeCPOLCPHA

0 [00]00

1 [01]01

2 [10]10

3 [11]11

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

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

第一種方法:多NSS

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

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

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

f6n2yu.png

多NSS連接

第二種方法:菊花鏈

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

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

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

具體的連接如下圖所示;

菊花鏈連接

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

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

z6ZFNv.png

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

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

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

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

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

全雙工串行通信;

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

簡單的軟件配置;

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

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

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

通常僅支持一個主設備;

需要更多的引腳(與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; //主機模式 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模式關閉 hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//CRC關閉 hspi1.Init.CRCPolynomial = 10; //默認值,無效 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);

責任編輯:haq

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

    關注

    18

    文章

    6391

    瀏覽量

    140037
  • SPI
    SPI
    +關注

    關注

    17

    文章

    1885

    瀏覽量

    101214
  • 串行通信
    +關注

    關注

    4

    文章

    608

    瀏覽量

    37133
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    沒有日本公司,如何完成 METI 備案

    很多出口日本的企業(yè)都會遇到同一個現(xiàn)實問題:產(chǎn)品已經(jīng)完成 PSE 認證,但公司在中國或其他國家,并沒有日本法人,這種情況下還能做 METI 備案嗎? 結論先給出:可以完成,但不能自行備案,必須通過日本責任主體。
    的頭像 發(fā)表于 02-10 11:58 ?132次閱讀
    <b class='flag-5'>沒有</b>日本公司,如何完成 METI 備案

    瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南之SPI通訊協(xié)議的物理層和協(xié)議層簡介

    RA芯片的SPI分為簡單SPI和普通SPI簡單SPI就是SCI模塊(Serial Commun
    的頭像 發(fā)表于 02-04 08:23 ?1.1w次閱讀
    瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南之<b class='flag-5'>SPI</b>通訊協(xié)議的物理層和協(xié)議層簡介

    SPI NOR Flash和SPI NAND Flash存儲芯片的區(qū)別

    SPI NOR Flash與SPI NAND Flash并非相互替代,而是互補關系。SPI NOR勝在讀取速度快、使用簡單、可靠性高,是代碼存儲的理想選擇。
    的頭像 發(fā)表于 01-29 16:58 ?454次閱讀
    <b class='flag-5'>SPI</b> NOR Flash和<b class='flag-5'>SPI</b> NAND Flash存儲芯片的區(qū)別

    C語言回調函數(shù)原來這么簡單

    ? 函數(shù)指針:函數(shù)指針是指向函數(shù)的指針變量。簡單理解是指向函數(shù)名的指針變量。 函數(shù)指針既然是指向函數(shù)的,那么它就可以像函數(shù)一樣,用于調用函數(shù)、傳遞參數(shù)等操作。函數(shù)指針的定義方式如下: 函數(shù)返回值類型
    發(fā)表于 12-30 06:45

    請問如何基于e203做自定義指令的開發(fā)?

    基于e203處理器進行指令集擴展,可是e203的EAI模塊并沒有開源,請問有沒有好的例子、教程或者代碼可以參考,因為如果自己寫的話感覺需要考慮的東西太多了,需要修改的代碼也太多了。謝謝!
    發(fā)表于 11-07 07:42

    ART-Pi中啟用外部flash是在哪里配置了qspi的引腳呢?

    。由于我是按照以芯片建立工程,并沒有使用ART-PI的工程。 2、我目前了解到在ART-PI工程中會有這個下載算法。 在這個鏈接文件要配置地址 3、于是我有個好奇的點是在工程中沒看到有QSPI的配置
    發(fā)表于 10-10 06:09

    使用RT-Thread+ST-link燒錄程序到STM32F4沒有報錯但是程序沒有燒錄進去,是哪里問題?

    前提:板子上的程序是自己學習的程序,會一直輸出hello 項目代碼是不會持續(xù)輸出hello的,項目代碼可以編譯通過,并且點擊下載也提示下載完成。 但是下載完成之后打開串口輸出,還是會一直有hello輸出出來,感覺系統(tǒng)并沒有被燒錄上去 這種是哪里的問題呢
    發(fā)表于 09-26 07:27

    bootloader和APP燒錄,能不能一次性分別燒錄到對應的位置?

    目前我是用STM32 ST-LINK Utility將bootloader和APP分別下載到對應的地址分區(qū),那么各位有什么更好的辦法可以一次性的將這兩個文件燒錄? 主要是解決量產(chǎn)的問題,我也想找對應的DLL庫自己開發(fā)一個上位機軟件來解決這個問題,但是并沒有找到有效的API
    發(fā)表于 09-25 06:34

    rt thread 的Finsh終端啟用后,怎樣才能在函數(shù)里讀取終端輸入的字符串?

    如題,AI的建議是使用rt_kscanf,但是并沒有查詢到實際有這個函數(shù)。 本意是校準一系列的值,在函數(shù)中通過終端輸入來,輸入校準值。 但shell.c文件里在shell線程中已經(jīng)調用了finsh_getchar()
    發(fā)表于 09-22 06:24

    HighTec編譯的HEX文件燒錄進去開發(fā)板時,程序并沒有在運行是怎么回事?

    我目前正在使用DAvE2 + HighTec + Memtools等工具正在對TC1796的開發(fā)版進行測試,但我發(fā)現(xiàn),HighTec編譯的HEX文件燒錄進去開發(fā)板時,程序并沒有在運行,RST指示燈
    發(fā)表于 08-01 07:46

    請問創(chuàng)樂博CanMV-K230-LP4 V3.0應該下載哪個固件?

    我在官網(wǎng)(https://www.kendryte.com/zh/resource?selected=0-0-3-0)下載的固件似乎全都用不了,燒錄好后板子連接電腦都顯示“無法識別”,似乎并沒有找到對應這塊板子的固件,所以到底應該下載哪個?我下載micropython的
    發(fā)表于 06-24 07:38

    rt thread的Finsh終端啟用后,怎樣才能在函數(shù)里讀取終端輸入的字符串?

    如題,AI的建議是使用rt_kscanf,但是并沒有查詢到實際有這個函數(shù)。 本意是校準一系列的值,在函數(shù)中通過終端輸入來,輸入校準值。 但shell.c文件里在shell線程中已經(jīng)調用了finsh_getchar()
    發(fā)表于 06-11 07:39

    客戶改了一個電阻就炸機?原因并沒有那么簡單

    客戶改了一個電阻就炸機?原因并沒有那么簡單【樣機芯片介紹】本次調試的樣機主控IC為思睿達主推的成都啟臣微的CR6853B,該IC為副邊控制IC,該IC是一款高集成度,低功耗的電流模PWM控制芯片,該
    的頭像 發(fā)表于 05-08 09:59 ?1059次閱讀
    客戶改了一個電阻就炸機?原因<b class='flag-5'>并沒有</b><b class='flag-5'>那么</b><b class='flag-5'>簡單</b>

    請問CubeMX配置STM32WBA55在utilities里選項ADV_trace具體功能體現(xiàn)在哪里?

    我使用開發(fā)板看了好幾個例程發(fā)現(xiàn)都打開了這個功能 于是我就去翻看參考手冊 結果并沒有發(fā)現(xiàn)對這一功能的具體介紹。 看英文名稱應該是用來調試 廣播傳輸數(shù)據(jù)包的這一功能的。那么這個功能是如何使用的呢?
    發(fā)表于 04-24 06:18

    看完這篇,SPI其實也很簡單嘛(可下載)

    首先我們來簡單介紹一下SPI,SPI是串行外設接口(SerialPeripheralInterface)簡單來講就是它一種高速的,全雙工,同步的通信總線被各種總線搞的暈頭轉向的人來說就
    發(fā)表于 03-26 14:29 ?2次下載