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

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

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

SPI協(xié)議解析

嵌入式單片機MCU開發(fā) ? 來源:嵌入式單片機MCU開發(fā) ? 作者:嵌入式單片機MCU開 ? 2022-11-14 17:01 ? 次閱讀

概述

SPI是串行外設(shè)接口(Serial Peripheral Interface)的縮寫,是一種 高速的 , 全雙工 ,同步通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時為PCB的布局上節(jié)省空間,提供方便,正是出于這種簡單易用的特性,越來越多的芯片集成了這種通信協(xié)議,比如AT91RM9200。 SPI是一種高速、高效率的串行接口技術(shù)。通常由一個主模塊和一個或多個從模塊組成,主模塊選擇一個從模塊進行同步通信,從而完成數(shù)據(jù)的交換。SPI是一個環(huán)形結(jié)構(gòu),通信時需要至少4根線(事實上在單向傳輸時3根線也可以)。

接口

SPI的通信原理很簡單,它以主從方式工作,這種模式通常有一個主設(shè)備和一個或多個從設(shè)備,需要至少4根線,事實上3根也可以(單向傳輸時)。也是所有基于SPI的設(shè)備共有的,它們是MISO(主設(shè)備數(shù)據(jù)輸入)、MOSI(主設(shè)備數(shù)據(jù)輸出)、SCLK(時鐘)、CS(片選)。

  • MISO– Master Input Slave Output,主設(shè)備數(shù)據(jù)輸入,從設(shè)備數(shù)據(jù)輸出;
  • MOSI– Master Output Slave Input,主設(shè)備數(shù)據(jù)輸出,從設(shè)備數(shù)據(jù)輸入;
  • SCLK – Serial Clock,時鐘信號,由主設(shè)備產(chǎn)生;
  • CS – Chip Select,從設(shè)備使能信號,由主設(shè)備控制。

其中,CS是從芯片是否被主芯片選中的控制信號,也就是說只有片選信號為預(yù)先規(guī)定的使能信號時(高電位或低電位),主芯片對此從芯片的操作才有效。這就使在同一條總線上連接多個SPI設(shè)備成為可能。 接下來就負(fù)責(zé)通訊的3根線了。通訊是通過數(shù)據(jù)交換完成的,這里先要知道SPI是串行通訊協(xié)議,也就是說數(shù)據(jù)是一位一位的傳輸?shù)?。這就是SCLK時鐘線存在的原因,由SCLK提供時鐘脈沖,SDISDO則基于此脈沖完成數(shù)據(jù)傳輸。數(shù)據(jù)輸出通過 SDO線,數(shù)據(jù)在時鐘上升沿或下降沿時改變,在緊接著的下降沿或上升沿被讀取。完成一位數(shù)據(jù)傳輸,輸入也使用同樣原理。因此,至少需要8次時鐘信號的改變(上沿和下沿為一次),才能完成8位數(shù)據(jù)的傳輸。 時鐘信號線SCLK只能由主設(shè)備控制,從設(shè)備不能控制。同樣,在一個基于SPI的設(shè)備中,至少有一個主設(shè)備。這樣的傳輸方式有一個優(yōu)點,在數(shù)據(jù)位的傳輸過程中可以暫停,也就是時鐘的周期可以為不等寬,因為時鐘線由主設(shè)備控制,當(dāng)沒有時鐘跳變時,從設(shè)備不采集或傳送數(shù)據(jù)。SPI還是一個數(shù)據(jù)交換協(xié)議:因為SPI的數(shù)據(jù)輸入和輸出線獨立,所以允許同時完成數(shù)據(jù)的輸入和輸出。芯片集成的SPI串行同步時鐘極性和相位可以通過寄存器配置,IO模擬的SPI串行同步時鐘需要根據(jù)從設(shè)備支持的時鐘極性和相位來通訊。 最后,SPI接口的一個缺點:沒有指定的流控制,沒有應(yīng)答機制確認(rèn)是否接收到數(shù)據(jù)。 在這里插入圖片描述

SPI四種通信模式

不同的從設(shè)備可能在出廠是就是配置為某種模式,這是不能改變的;但我們的通信雙方必須是工作在同一模式下,所以我們可以對我們的主設(shè)備的SPI模式進行配置,通過CPOL(時鐘極性)和CPHA(時鐘相位)來 控制我們主設(shè)備的通信模式,具體如下: 時鐘極性(CPOL)定義了時鐘空閑狀態(tài)電平: CPOL=0,表示當(dāng)SCLK=0時處于空閑態(tài),所以有效狀態(tài)就是SCLK處于高電平時 CPOL=1,表示當(dāng)SCLK=1時處于空閑態(tài),所以有效狀態(tài)就是SCLK處于低電平時 時鐘相位(CPHA)定義數(shù)據(jù)的采集時間。 CPHA=0,在時鐘的第一個跳變沿(上升沿或下降沿)進行數(shù)據(jù)采樣。,在第2個邊沿發(fā)送數(shù)據(jù) CPHA=1,在時鐘的第二個跳變沿(上升沿或下降沿)進行數(shù)據(jù)采樣。,在第1個邊沿發(fā)送數(shù)據(jù) 例如: Mode0:CPOL=0,CPHA=0:此時空閑態(tài)時,SCLK處于低電平,數(shù)據(jù)采樣是在第1個邊沿,也就是SCLK由低電平到高電平的跳變,所以數(shù)據(jù)采樣是在上升沿(準(zhǔn)備數(shù)據(jù)),(發(fā)送數(shù)據(jù))數(shù)據(jù)發(fā)送是在下降沿。 在這里插入圖片描述

Mode1:CPOL=0,CPHA=1:此時空閑態(tài)時,SCLK處于低電平,數(shù)據(jù)發(fā)送是在第1個邊沿,也就是SCLK由低電平到高電平的跳變,所以數(shù)據(jù)采樣是在下降沿,數(shù)據(jù)發(fā)送是在上升沿。 在這里插入圖片描述

Mode2:CPOL=1,CPHA=0:此時空閑態(tài)時,SCLK處于高電平,數(shù)據(jù)采集是在第1個邊沿,也就是SCLK由高電平到低電平的跳變,所以數(shù)據(jù)采集是在下降沿,數(shù)據(jù)發(fā)送是在上升沿。 在這里插入圖片描述

Mode3:CPOL=1,CPHA=1:此時空閑態(tài)時,SCLK處于高電平,數(shù)據(jù)發(fā)送是在第1個邊沿,也就是SCLK由高電平到低電平的跳變,所以數(shù)據(jù)采集是在上升沿,數(shù)據(jù)發(fā)送是在下降沿。 在這里插入圖片描述

SPI模式 CPOL CPOA 空閑時SCK時鐘 采樣時刻
0 0 0 低電平 奇數(shù)邊沿
1 0 1 低電平 偶數(shù)邊沿
2 1 0 高電平 奇數(shù)邊沿
3 1 1 高電平 偶數(shù)邊沿

這樣兩兩組合就出現(xiàn)了4種通訊模式,但是通信原理是一樣的。

示例

使用之前的文章作為案例:STM32CUBEMX(13)--SPI,W25Q128外部Flash移植。 https://editor.csdn.net/md/?articleId=117756829 使用BSP_W25Qx_Init進行初始化,BSP_W25Qx_Read_ID進行讀取設(shè)備ID。

uint8_t BSP_W25Qx_Init(void)
{ 
    /* Reset W25Qxxx */
    BSP_W25Qx_Reset();

    return BSP_W25Qx_GetStatus();
}

/**
  * @brief  This function reset the W25Qx.
  * @retval None
  */
static void    BSP_W25Qx_Reset(void)
{
    uint8_t cmd[2] = {RESET_ENABLE_CMD,RESET_MEMORY_CMD};

    W25Qx_Enable();
    /* Send the reset command */
    HAL_SPI_Transmit(&hspi1, cmd, 2, W25Qx_TIMEOUT_VALUE);    
    W25Qx_Disable();

}

/**
  * @brief  Reads current status of the W25Q128FV.
  * @retval W25Q128FV memory status
  */
static uint8_t BSP_W25Qx_GetStatus(void)
{
    uint8_t cmd[] = {READ_STATUS_REG1_CMD};
    uint8_t status;

    W25Qx_Enable();
    /* Send the read status command */
    HAL_SPI_Transmit(&hspi1, cmd, 1, W25Qx_TIMEOUT_VALUE);    
    /* Reception of the data */
    HAL_SPI_Receive(&hspi1,&status, 1, W25Qx_TIMEOUT_VALUE);
    W25Qx_Disable();

    /* Check the value of the register */
  if((status & W25Q128FV_FSR_BUSY) != 0)
  {
    return W25Qx_BUSY;
  }
    else
    {
        return W25Qx_OK;
    }        
}
/**
  * @brief  Read Manufacture/Device ID.
    * @param  return value address
  * @retval None
  */
void BSP_W25Qx_Read_ID(uint8_t *ID)
{
    uint8_t cmd[4] = {READ_ID_CMD,0x00,0x00,0x00};

    W25Qx_Enable();
    /* Send the read ID command */
    HAL_SPI_Transmit(&hspi1, cmd, 4, W25Qx_TIMEOUT_VALUE);    
    /* Reception of the data */
    HAL_SPI_Receive(&hspi1,ID, 2, W25Qx_TIMEOUT_VALUE);
    W25Qx_Disable();

}

定義如下。

/* Reset Operations */
#define RESET_ENABLE_CMD                     0x66
#define RESET_MEMORY_CMD                     0x99
/* Identification Operations */
#define READ_ID_CMD                          0x90

首先進行初始化,函數(shù)為BSP_W25Qx_Init(),其中含有2個函數(shù),分別是BSP_W25Qx_Reset()和BSP_W25Qx_GetStatus();在BSP_W25Qx_Reset()中為發(fā)生0x66和0x99,在BSP_W25Qx_GetStatus()中為發(fā)生0x05,之后獲取一個uint8_t類型的數(shù)據(jù)。 之后進行讀取ID,函數(shù)為BSP_W25Qx_Read_ID(),首先發(fā)送4個字節(jié)的數(shù)據(jù),分別是0x90,0x00,0x00,0x00,之后讀取設(shè)備ID,為2個字節(jié)的數(shù)據(jù),W25Q128的ID為0XEF17。 HAL_SPI_Transmit,HAL_SPI_Received都是半工通信,HAL_SPI_Transmits使用的時候MOSI上有數(shù)據(jù),忽略MISO,HAL_SPI_Received反之,HAL_SPI_TransmitReceive是全雙工通信,發(fā)送數(shù)據(jù)的同時也在接收數(shù)據(jù),故在HAL_SPI_Receive讀取的時候,雖然也有發(fā)送數(shù)據(jù),但是忽略。 通過示波器抓取的波形如下所示。 在這里插入圖片描述 首先查看初始化設(shè)備發(fā)送的0x66和0x99的波形。 在這里插入圖片描述 在查看讀取設(shè)備ID發(fā)送的0x90,0x00,0x00,0x00的波形。 在這里插入圖片描述 在查看設(shè)備發(fā)送給主機的ID波形。 HAL_SPI_Transmit,HAL_SPI_Received都是半工通信,故在HAL_SPI_Receive讀取的時候,雖然也有發(fā)送數(shù)據(jù),但是忽略。 在這里插入圖片描述

審核編輯:湯梓紅

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

    關(guān)注

    28

    文章

    808

    瀏覽量

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

    關(guān)注

    33

    文章

    8249

    瀏覽量

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

    關(guān)注

    17

    文章

    1665

    瀏覽量

    90710
收藏 人收藏

    評論

    相關(guān)推薦

    eSPI協(xié)議抓包分析

    eSPI 協(xié)議在物理層是遵循 SPI 通訊規(guī)范的,但是協(xié)議層有差異,因此不能使用 SPI 協(xié)議解析
    的頭像 發(fā)表于 11-18 15:29 ?2603次閱讀
    eSPI<b class='flag-5'>協(xié)議</b>抓包分析

    SPI通信協(xié)議

    SPI,是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳。SPI以主從方式工作模式被廣泛應(yīng)用于電路系統(tǒng)中,我結(jié)合自己的項目情況對SPI協(xié)議進行
    發(fā)表于 08-09 07:49

    SPI協(xié)議進行解析

    SPI是什么?SPI協(xié)議是如何進行通信的?
    發(fā)表于 11-05 08:19

    SPI通信協(xié)議的基礎(chǔ)知識解析

    SPI通信協(xié)議詳解寫在最前: 本文講述了SPI通信協(xié)議的基本內(nèi)容包括如下SPI的基礎(chǔ)知識SPI
    發(fā)表于 12-13 08:05

    地址解析協(xié)議(ARP),地址解析協(xié)議(ARP)是什么意思

    地址解析協(xié)議(ARP),地址解析協(xié)議(ARP)是什么意思 地址解析協(xié)議 (ARP) “地址
    發(fā)表于 04-06 09:07 ?2065次閱讀

    基于SPI協(xié)議的SD卡讀寫

    基于SPI協(xié)議的SD卡讀寫,SD卡的協(xié)議分析。
    發(fā)表于 01-06 14:24 ?0次下載

    SPI總線協(xié)議介紹

    這是SPI協(xié)議的介紹,很有用的哦,歡迎大家下載。
    發(fā)表于 04-13 14:21 ?17次下載

    基于FPGA與MCU通信的SPI協(xié)議設(shè)計

    typora-copy-images-to: typora_picture基于FPGA與MCU通信的SPI協(xié)議設(shè)計1. SPI總線協(xié)議介紹及硬件設(shè)計1.1
    發(fā)表于 11-05 15:35 ?14次下載
    基于FPGA與MCU通信的<b class='flag-5'>SPI</b><b class='flag-5'>協(xié)議</b>設(shè)計

    基于FPGA的SPI協(xié)議及設(shè)計實現(xiàn)

    基于FPGA的SPI協(xié)議及設(shè)計實現(xiàn)博主微信:flm13724054952,不懂的有疑惑的也可以加微信咨詢,歡迎大家前來投稿,謝謝!引言介紹在電子通信領(lǐng)域里采用的通信協(xié)議有IIC,SPI
    發(fā)表于 11-05 19:05 ?23次下載
    基于FPGA的<b class='flag-5'>SPI</b><b class='flag-5'>協(xié)議</b>及設(shè)計實現(xiàn)

    SPI協(xié)議詳解

    1.SPI協(xié)議簡介1.1.SPI協(xié)議概括  SPI,是英語Serial Peripheral interface的縮寫,顧名思義就是串行外圍
    發(fā)表于 11-29 12:06 ?16次下載
    <b class='flag-5'>SPI</b><b class='flag-5'>協(xié)議</b>詳解

    SPI協(xié)議

    目錄SPI協(xié)議簡介SPI物理層SPI協(xié)議SPI協(xié)議
    發(fā)表于 12-22 19:17 ?32次下載
    <b class='flag-5'>SPI</b><b class='flag-5'>協(xié)議</b>

    spi協(xié)議介紹

    文章目錄前言一、SPI介紹1.SPI總線2.尋址方式二、通信原理1.通信過程2.極性和相位3.四種工作模式三、SPI與I2C的異同1.相同點2.不同點總結(jié)前言spi
    發(fā)表于 12-22 19:21 ?19次下載
    <b class='flag-5'>spi</b><b class='flag-5'>協(xié)議</b>介紹

    SPI協(xié)議解析

    SPI協(xié)議解析概述指針概述指針也就是內(nèi)存地址,指針變量是用來存放內(nèi)存地址的變量,不同類型的指針變量所占用的存儲單元長度是相同的,而存放數(shù)據(jù)的變量因數(shù)據(jù)的類型不同,所占用的存儲空間長度也不同。有了指針
    發(fā)表于 12-22 19:32 ?9次下載
    <b class='flag-5'>SPI</b><b class='flag-5'>協(xié)議</b><b class='flag-5'>解析</b>

    一文看懂SPI協(xié)議

    作者:王超首發(fā):電子電路開發(fā)學(xué)習(xí)都有哪些內(nèi)容?SPI協(xié)議簡介4線還是3線?4種工作模式多種傳輸速率SPI協(xié)議的時序SPI
    發(fā)表于 01-25 18:35 ?38次下載
    一文看懂<b class='flag-5'>SPI</b><b class='flag-5'>協(xié)議</b>

    SPI協(xié)議相關(guān)的內(nèi)容

    今天分享SPI協(xié)議相關(guān)的內(nèi)容。
    的頭像 發(fā)表于 09-05 10:50 ?1004次閱讀