找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3265|回复: 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 单片机教程网

快速回复 返回顶部 返回列表