STM32中的SPI

SPI協議簡介:網絡

  SPI是摩托羅拉公司提出的一種通訊協議,運用了全雙工的通訊方式。其通信速率能夠達到Mbps的數量級,是一種普遍使用,優秀的通訊協議。在STM32的開發中,常常被用來進行Flash存儲器的通訊,也被用做向一些小的液晶屏幕發送數據。spa


物理層:code

  在SPI的通訊中,信號線有兩條,MOSI,MISO,對應的兩個通訊方向,即主機》從機。從機》主機,在一些狀況下,咱們只使用主到從的這條信號線(例如控制液晶屏的顯示,液晶屏不返回信息),時鐘信號線有一條,即SCK。而後即是若干條片選信號線(SS)。對象

  片選信號線是SPI通訊的特色之一,SPI通訊總線上有幾個設備,就存在幾條片選信號線。當某一個片選信號線的電平被拉低,這個設備就被選中,即被選爲通訊對象。(圖源網絡)blog

  


協議層:ip

  在協議層中,SPI經過SCK時鐘信號線來統一時間基準。具體通訊流程有三步:(圖源網絡)開發

  

  開始:SS信號線拉低,通訊開始。it

  傳輸數據:MOSI\MISO在每一個時鐘週期都會傳輸一位數據。io

  結束:SS信號拉高,傳輸結束。ast

  須要注意的是,在SPI中,存在着幾個不一樣的傳輸數據模式:首先,SCK在空閒時,有高電平和低電平兩種狀態(圖中爲空閒高電平)。其次,信號線會在時鐘信號對的邊緣進行採樣(虛線位置),而採樣的邊緣選擇有兩種:奇數邊緣和偶數邊緣(圖中爲偶數邊緣)。一般,咱們使用SCK空閒高電平,偶數邊緣採樣。或者SCK空閒低電平,奇數邊緣採樣。


 

STM32中的SPI:

  STM32中的SPI初始化:

void SPI1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE );    
 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //複用推輓輸出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //SPI設置爲雙線雙向全雙工
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;        //定義此設備爲主機
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;    //SPI發送接收8位幀結構
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;          //選擇了串行時鐘的穩態:時鐘懸空高
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;       //數據捕獲於第二個時鐘沿
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;         //NSS信號由軟件控制
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;        //定義波特率預分頻的值:波特率預分頻值爲256
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;    //數據傳輸從MSB位開始
    SPI_InitStructure.SPI_CRCPolynomial = 7;          //CRC值計算的多項式
    SPI_Init(SPI1, &SPI_InitStructure);            //初始化外設SPI1寄存器
 
    SPI_Cmd(SPI1, ENABLE); //使能SPI外設
相關文章
相關標籤/搜索