久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3582|回復: 0
打印 上一主題 下一主題
收起左側

stm32 ---spi 總結

[復制鏈接]
跳轉到指定樓層
樓主
ID:264387 發表于 2017-12-20 17:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 秦延雷 于 2017-12-20 17:31 編輯

一、概述
1.SPI通訊總線介紹
2.STM32F40xSPI模塊介紹
3.STM32F40xSPI模塊相關寄存器
4.W25Q64 Flah存儲芯片介紹

二、講解
1.SPI通訊總線介紹
1)SPI通訊協議概述
SPI是由MOTOROLA公司研發的串行外圍通訊設備接口,是一種高速的、全雙工、同步的通訊總線。
2)SPI通訊接口
SPIO通訊接口分為:五線制和四線制
①五線制:
a)MOSI:也稱為DO,作為主器件的時候為數據輸出,作為從器件的時候為數據輸入。
b)MISO:也稱為DI,作為主器件的時候為數據輸入,作為從器件的時候為數據輸出。
c)SCLK:時鐘信號線。由主器件產生。
d)NSS:也稱為CS,從器件使能信號。由主器件控制。
e)GND:公共地線
②四線制:
a)MOSI:雙向數據線(可收可發)
b)SCLK:時鐘信號線。由主器件產生。
c)NSS:也稱為CS,從器件使能信號。由主器件控制。
d)GND:公共地線
3)SPI通訊物理連接
4)SPI通訊原理
①NSS控制從器件是否被選中,也就是說當只有片選信號為預先規定的使能信號(高電平或者低電平)時,對從器件的操作才算有效。
②主器件在SCLK時鐘線上提供時鐘脈沖,MOSI或MISO則基于這個脈沖信號完成數據的傳輸。
③數據通過MOSI線,在時鐘的上升沿或者下降沿改變數據,在緊接著的下降沿或者上升沿被讀取。SPI通訊協議規定傳輸的數據為8位,傳輸順序是高位在前,低位在后。
④SPI總線是一個數據交換協議,主機給從機發送一個位的數據,從機必定會返回一個位的數據給主機。也就是說,主機想讀取從機的數據,需要先發一個位的數據給從機,從機才會回發一個位的數據給主機。
5)SPI總線數據傳輸方式
SPI一共有四種傳輸方式,四種方式的主要區別是總線空閑時SCLK的時鐘狀態以及數據采樣的時刻(上升沿、下降沿、前沿或者后沿)
SPI模式    時鐘極性(CPOL)   時鐘相位(CPHA)     時鐘空閑狀態    數據采集時刻
      0                     0                             0                                低電平      時鐘的奇數邊緣采集
      1                     0                             1                                低電平      時鐘的偶數邊緣采集
      2                     1                             0                                高電平      時鐘的奇數邊緣采集
      3                     1                             1                                高電平      時鐘的偶數邊緣采集
①時鐘相位(CPHA):決定了數據線上第1個數據的采集時刻。
a)CPHA = 0:MOSI或MISO數據線上的數據在串行時鐘線(SCLK)的奇數邊沿被采集。
b)CPHA = 1:MOSI或MISO數據線上的數據在串行時鐘線(SCLK)的偶數邊沿被采集。
②時鐘極性(CPOL):決定了SPI總線在空閑狀態時(SPI通訊開始之前),時鐘線的電平狀態。
a)CPOL = 0:串行同步時鐘總線(SCLK)的空閑狀態為低電平。
b)CPOL = 1:串行同步時鐘總線(SCLK)的空閑狀態為高電平。

2.STM32F40xSPI模塊介紹
1)STM32F40xSPI模塊概述
STM32F40x的SPI模塊支持兩個功能,分別為:SPI通訊總線協議以及IIS音頻協議,默認功能為SPI通訊總線協議功能。SPI通訊協議支持SPI四線制(半雙工)和五線制(全雙工)通訊模式。同時還可以配置成主機模式和從機模式以及多主機模式,還可以使用CRC校驗實現可靠通信。
2)STM32F40xSPI模塊主要特性
①由SPI模塊中的SCLK、MOSI以及MISO三線組成全雙工同步通信。
②支持SPI四線制同步半雙工通信
③支持數據傳輸字長為8位或16位
④可以設置成主機模式和從機模式(默認是從機模式)和多主機模式(在同一個時間內只能有1個主機在工作)
⑤可以對SPI的輸入時鐘源進行分頻,頻率最大值為(fpclk/2)
⑥NSS在主模式下為軟件管理,在從模式線為硬件管理
⑦可以設置數據的傳輸順序(先高還是先低)以及SPI的數據傳輸方式
⑧支持MOTOROL公司以及TI公司的SPI通訊協議
⑨SPI中斷源分別為:發送、接收、主模式錯誤、上溢錯誤、CRC錯誤
⑩支持DMA功能
3)SPI主機模式設置
①根據需要驅動的目標器件來確定SPI的傳輸速度比特率。
②根據需要驅動的目標器件來配置時鐘極性和相位(TI模式忽略此步)。
③根據需要驅動的目標器件來確定數據位長度。
④根據需要驅動的目標器件來配置數據的傳輸方式(TI模式忽略此步)。
⑤把NSS管腳設置位軟件管理模式
⑥選擇SPI通信協議格式
⑦把SPI配置位主機模式
⑧是SPI模塊

3.STM32F40xSPI模塊相關寄存器
1)SPI 控制寄存器 1 (SPI_CR1)
寄存器作用:設置SPI模塊工作模式
2)SPI 控制寄存器 2 (SPI_CR2)
寄存器作用:設置SPI模塊工作模式
3)SPI 狀態寄存器 (SPI_SR)
寄存器作用:檢測SPI具體相應功能的具體狀態。
4)SPI 數據寄存器 (SPI_DR)
寄存器作用:存放需要發送或接收的數據

4.W25Q64 Flah存儲芯片介紹
1)W25Q64  Flah芯片概述
W25Q64是一款具有SPI通信接口,大小為8M(Byte)的Flash芯片。W25Q64內部把8M大小的存儲空間分為128塊(Bolck),每塊大小為64K字節,而每塊又分為16個扇區(Sector),每個扇區大小為4K字節。每個扇區分為16頁,每頁256個字節。Flash內部數據只能有1變0,不能由0變1。
2)W25Q64管腳
①/CS:片選管腳,低電平有效。在執行一條新指令之前,必須要讓CS管腳先出現一個下降沿。
②DO(MISO):串行數據輸出管腳,在CLK管腳的下降沿輸出數據。
③/WP:寫保護管腳,低電平有效,高電平可讀可寫,低電平僅僅可讀。
④DI(MOSI):串行數據輸入管腳,在CLK管腳的上升沿捕獲數據。
⑤CLK:串行時鐘管腳,為輸入和輸出數據提供時鐘脈沖。
⑥/HOLD:保存管腳,有效電平為低電平。當/HOLD為低電,并且CS也為低電平時,數據輸出管腳將保持高阻態,同時會忽略數據輸出管腳以及時鐘管腳上的信號。把/HOLD管腳拉高,器件恢復正常工作。
3)W25Q64傳輸速度
W25Q64在標準模式下支持80Mbit/s;快速模式下支持160Mbit/s;高速模式下支持320Mbit/s
4)W25Q64數據傳輸
W25Q64支持模式0和模式3數據傳輸時序模式。數據傳輸的字長為8位,傳輸順序為先高再低。
5)W25Q64工作原理
通過SPI總線接口,用標準的SPI協議發送相應的指令給Flash,然后Flash根據命令執行各種相關操作。

5.SPI通信編程思路
1)配置SPI相應功能的GPIO管腳
2)使能SPI模塊時鐘
3)設置SPI模塊工作模式:按照SPI主機模式設置步驟設置
4)編寫SPI字節數據傳輸函數

#include "spi.h"

/********** SPI初始化函數**************
   DO  ---->     PB4  復用模式
   CLK ---->     PB3  復用模式
   DI  ---->     PB5  復用模式
***************************************/
void SPI_Init(void)
{
        /* SPI引腳管腳配置 */
        RCC->AHB1ENR |= 1 << 1; //使能 GPIOB外設時鐘
       
        /* PB3(CLK)管腳配置 復用模式 */
        /* 管腳模式配置 */
        GPIOB->MODER &= ~(3 << (3 * 2));      //清零
        GPIOB->MODER |= 2 << (3 * 2);         //PB3配置為復用模式
        /* 復用功能配置 */
        GPIOB->AFR[0] &= ~(0x0f << (3 * 4));  //清零
        GPIOB->AFR[0] |= 5 << (3 * 4);        //PB3 復用選擇SPI_1
        /* 輸出速率配置 */
        GPIOB->OSPEEDR &= ~(3 << (3 * 2));    //清零
        GPIOB->OSPEEDR |= 2 << (3 * 2);       //輸出速率50M
       
        /* PB4(DO)管腳配置 復用模式*/
        /* 管腳模式配置 */
        GPIOB->MODER &= ~(3 << (4 * 2));      //清零
        GPIOB->MODER |= 2 << (4 * 2);         //PB4配置為復用模式
        /* 復用功能配置 */
        GPIOB->AFR[0] &= ~(0x0f << (4 * 4));  //清零
        GPIOB->AFR[0] |= 5 << (4 * 4);        //PB4 復用選擇SPI_1
       
        /* PB5(DI)管腳配置 復用模式 */
        /* 管腳模式配置 */
        GPIOB->MODER &= ~(3 << (5 * 2));      //清零
        GPIOB->MODER |= 2 << (5 * 2);         //PB5配置為復用模式
        /* 復用功能配置 */
        GPIOB->AFR[0] &= ~(0x0f << (5 * 4));  //清零
        GPIOB->AFR[0] |= 5 << (5 * 4);        //PB5 復用選擇SPI_1
        /* 輸出速率配置 */
        GPIOB->OSPEEDR &= ~(3 << (5 * 2));    //清零
        GPIOB->OSPEEDR |= 2 << (5 * 2);       //輸出速率50M
       
        /* 使能SPI模塊時鐘 */
        RCC->APB2ENR |= 1 << 12;              //使能SPI_1時鐘
       
        /* 設置SPI模塊工作模式 */
        SPI1->CR1 &= ~(7 << 3);               //SPI_1波特率42M
        SPI1->CR1 &= ~(1 << 1);               //SPI_1時序模式0
        SPI1->CR1 &= ~(1 << 0);
        SPI1->CR1 &= ~(1 << 11);              //8位數據長度
        SPI1->CR1 &= ~(1 << 7);               //先發高位
        SPI1->CR1 |= 1 << 9;                  //NSS軟件管理
        SPI1->CR1 |= 1 << 8;                  //NSS內部狀態為高電平
        SPI1->CR2 &= ~(1 << 4);               //選擇MOTOROLA模式
        SPI1->CR1 |= 1 << 2;                  //主機模式
       
        /* 使能SPI */
        SPI1->CR1 |= 1 << 6;                  //使能SPI_1
}

/********************** SPI數據傳輸函數 *********************************/
u16 SPI_Send_Read_Byte(u8 data)
{
        u16 ErrTimer = 0;
       
        /* 寫功能 */
        while( !(SPI1->SR & (1 << 1)) )
        {
                ErrTimer++;
                if(ErrTimer >= 0xfffe)
                {
                        return 0;
                }
        }
        SPI1->DR = data;
       
        ErrTimer = 0;
       
        /* 讀功能 */
        while( !(SPI1->SR & (1 << 0)) )
        {
                ErrTimer++;
                if(ErrTimer >= 0xfffe)
                {
                        return 0;
                }
        }
        return SPI1->DR;
}






分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久人人国产 | 麻豆av在线 | 日韩欧美大片在线观看 | 九色在线观看 | 国产中文区二幕区2012 | 青青激情网 | 国产yw851.c免费观看网站 | 日韩精品一区二区三区中文在线 | 色婷婷激情综合 | 国产电影一区二区在线观看 | 日韩av电影院 | 亚洲精品久久久久中文字幕欢迎你 | 天天操人人干 | 亚洲视频区 | 国产一区视频在线 | 久久青视频 | 久久国产亚洲 | 国产毛片久久久 | 一区二区三区亚洲视频 | 国产超碰人人爽人人做人人爱 | 亚洲一区在线日韩在线深爱 | 久久精品播放 | 精品欧美在线观看 | 久久成人精品视频 | 免费观看www7722午夜电影 | 久久综合av | 欧美日韩18 | 色偷偷人人澡人人爽人人模 | 特级a欧美做爰片毛片 | 5060网一级毛片 | 狠狠干av| 伊人焦久影院 | 三区四区在线观看 | 欧美色影院| h片免费看| 国产片一区二区三区 | 国产精品久久国产精品 | 久久精品国产一区二区 | 精品久久久一区二区 | 国产精品精品久久久 | 久久在视频 |