新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 踏踏實實搞清 stm32 SPI總線 基礎和編程

        踏踏實實搞清 stm32 SPI總線 基礎和編程

        作者: 時間:2016-11-28 來源:網絡 收藏

        SPI應用是相當的廣了,同步串行總線,同步同步當然需要時鐘信號來統一了,這樣通訊雙方通訊時就比較默契沒那么延遲(呆呆)了。應用于中低速場合。

        本文引用地址:http://www.104case.com/article/201611/322996.htm

        學起來從哪些地方入手呢?如下:

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

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

        全雙工 一主控多從 8或16位數據通信

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

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

        編程MSB 或LSB在前

        專用發送和接受標志可促發中斷

        有SPI忙標志位

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

        支持錯誤中斷標志,支持DMA功能的1字節發送和接受緩沖器:產生發送和接受請求。

        SPI總線時序介紹:

        看下下圖應該就會了


        使用stm32 spi需要以下的步驟

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

        2.設置spi的工作模式

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

        SPI固件庫函數

        下面是初始化,必須得結構體原型

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

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

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

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

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

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

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

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

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

        }SPI_InitTypeDef;

        下面是實例,對SPI2進行的初始化

        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; //復用推挽輸出
        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);
        }

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

        以上是,初始化的一些函數,發現固件庫還有很多函數沒用上,下面就要談到應用了

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


        上一頁 1 2 下一頁

        關鍵詞: stm32SPI總

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 天全县| 石狮市| 丰都县| 福泉市| 浮梁县| 霍山县| 长岭县| 普陀区| 保亭| 文成县| 平阳县| 鹤壁市| 锡林浩特市| 南通市| 左云县| 图片| 北海市| 都安| 霍州市| 乐亭县| 湟源县| 建瓯市| 镇远县| 正镶白旗| 凯里市| 镇宁| 綦江县| 新竹县| 凤城市| 新乡市| 洪江市| 富民县| 乐亭县| 巴林左旗| 宿州市| 呼玛县| 五大连池市| 龙里县| 筠连县| 偃师市| 梓潼县|