新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 踏踏實實搞清 stm32 SPI總線 基礎(chǔ)和編程

踏踏實實搞清 stm32 SPI總線 基礎(chǔ)和編程

作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏

SPI應(yīng)用是相當(dāng)?shù)膹V了,同步串行總線,同步同步當(dāng)然需要時鐘信號來統(tǒng)一了,這樣通訊雙方通訊時就比較默契沒那么延遲(呆呆)了。應(yīng)用于中低速場合。

本文引用地址:http://m.butianyuan.cn/article/201611/322996.htm

學(xué)起來從哪些地方入手呢?如下:

SPI概念與特點 關(guān)鍵的時序接受 編程時重點 STM32內(nèi)部的SPI使用(介紹、功能、中斷)

SPI概念與特點:不多說,串行,需要同步信號 主從結(jié)構(gòu)的 CS(片選) SCK SDI SDO

全雙工 一主控多從 8或16位數(shù)據(jù)通信

其它特點:8個主模式波特率預(yù)分頻系數(shù) fpcll/2

主模式和從模式下快速通行 并支持切換

編程MSB 或LSB在前

專用發(fā)送和接受標(biāo)志可促發(fā)中斷

有SPI忙標(biāo)志位

支持硬件CRC校驗,發(fā)送模式下crc值作為最后一個字節(jié)被發(fā)送,接受模式下最后一字節(jié)自動CRC校驗

支持錯誤中斷標(biāo)志,支持DMA功能的1字節(jié)發(fā)送和接受緩沖器:產(chǎn)生發(fā)送和接受請求。

SPI總線時序介紹:

看下下圖應(yīng)該就會了


使用stm32 spi需要以下的步驟

1.管腳因為復(fù)用的,故先配置好管腳、并打開spi時鐘

2.設(shè)置spi的工作模式

通過 SPI1_CR1 來設(shè)置,設(shè)置SPI1主機(jī)模式,設(shè)置數(shù)據(jù)格式8位,然后通過 CPOL 和 CPHA 位來設(shè)置 SCK時鐘極性及采樣方式。并設(shè)置 SPI1 的時鐘頻率(最大18Mhz),以及數(shù)據(jù)的格式(MSB 在前還是 LSB在前)。
3.使能SPI.

SPI固件庫函數(shù)

下面是初始化,必須得結(jié)構(gòu)體原型

typedef struct
{
uint16_t SPI_Direction;//設(shè)置方向 (2線全雙工、2線只接受、一線發(fā)送、一線接受)

uint16_t SPI_Mode; //模式 (從或主設(shè)備)

uint16_t SPI_DataSize; //寬度 (8或16位)

uint16_t SPI_CPOL; //時鐘極性 (低或高)

uint16_t SPI_CPHA; //時鐘相位 (第一個或第二個跳變沿)

uint16_t SPI_NSS; //片選方式 (硬件或軟件方式)

uint16_t SPI_BaudRatePrescaler; //波特率預(yù)分頻 (從2---256分頻)

uint16_t SPI_FirstBit; //最先發(fā)送的位 (最低位,還是最高位在先)

uint16_t SPI_CRCPolynomial; //設(shè)置crc多項式 (數(shù)字)如7

}SPI_InitTypeDef;

下面是實例,對SPI2進(jìn)行的初始化

void SPI2_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

//配置SPI2管腳
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14| GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_Init(GPIOB, &GPIO_InitStructure);

//SPI2配置選項
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 ,ENABLE);

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);

//使能SPI2
SPI_Cmd(SPI2, ENABLE);
}

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

以上是,初始化的一些函數(shù),發(fā)現(xiàn)固件庫還有很多函數(shù)沒用上,下面就要談到應(yīng)用了

STM32的SPI串行外圍總線接口,本程序,是將STM32的SPI配置為全雙工模式,且NSS使用的軟件模式。在使用SPI前,下面的這個過程我們必須理解,即STM32作為主機(jī)發(fā)送一個字節(jié)數(shù)據(jù)時,必然能接收到一個數(shù)據(jù),至于數(shù)據(jù)是否處理,由程序操作。


上一頁 1 2 下一頁

關(guān)鍵詞: stm32SPI總

評論


技術(shù)專區(qū)

關(guān)閉