zoukankan      html  css  js  c++  java
  • SPI读写FLASH

    SPI协议:

    SPI1挂载在APB2总线上,SP12和SPI3挂载在APB1总线上。

    相对于I2C来说,SPI的传输速率要高得多,所以低速传感器可能用I2C,但是高速传感器用SPI还是用得非常多的。

    I2C为半双工,因为只有一根线,而SPI有两根总数据线,一根可以接收数据,一根发送数据,为全双工通信,

    SS:从设备选择信号线,常称为片选信号线,也称为NSS、CS。

    主机通过片选线来选择设备,而不用设备地址

    每个从设备都有独立的这一条SS信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而SPI协议中没有设备地址,它使用SS信号线来寻址,当主机要选择从设备时,把该从设备的SS信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI通讯。所以SPI通讯以SS线置低电平为开始信号,以SS线被拉高作为结束信号。

    SCLK:由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如STM32的SPI时钟频率最大为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。

    MISO(Master Intput, SlaveOutput):主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。

    MOSI(Master Output, Slave Input):主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。

    • 通讯的起始和停止

    NSS片选信号线由高变低,是SPI通讯的起始信号,NSS信号由低变高,是SPI通讯的停止信号,表示本次通讯结束。

    SCK引脚的上升沿和下降沿进行触发和采样,触发代表数据信号进行变化不稳定,这个时候是不会采样的,在采样过程中MOSI和MISO都是保持稳定法。

    •  时钟极性和时钟相位

     

    时钟极性CPOL是指SPI通讯设备处于空闲状态时,SCK信号线的电平信号(即SPI通讯开始前、 NSS线为高电平时SCK的状态)。CPOL=0时, SCK在空闲状态时为低电平,CPOL=1时,则相反。
    时钟相位CPHA是指数据的采样的时刻,当CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的“奇数边沿”被采样。当CPHA=1时,数据线在SCK的“偶数边沿”采样。

     

    •  SPI外设设置

    STM32的SPI外设可用作通讯的主机及从机,支持最高的SCK时钟频率为fpclk/2 (STM32F10x型号的芯片默认fpclk1为72MHz,fpclk2为36MHz),完全支持SPI协议的4种模式,数据帧长度可设置为8位或16位,可设置数据MSB先行或LSB先行。它还支持双线全双工(前面小节说明的都是这种模式)、双线单向以及单线模式。

     其中SPI1是APB2上的设备,最高通信速率达36Mbtis/s,SPI2、SPI3是APB1上的设备,最高通信速率为18Mbits/s。除了通讯速率,在其它功能上没有差异。

    • 时钟控制逻辑

    SCK线的时钟信号,由波特率发生器根据“控制寄存器CR1”中的BR[0:2]位控制,该位是对fpclk时钟的分频因子,对fpclk的分频结果就是SCK引脚的输出时钟频率

    其中的fpclk频率是指SPI所在的APB总线频率,APB1为fpclk1,APB2为fpckl2。

     以上这些只有在STM32做主机时才生效

    •  数据控制逻辑

    SPI的MOSI及MISO都连接到数据移位寄存器上,数据移位寄存器的数据来源来源于接收缓冲区及发送缓冲区。

    通过写SPI的“数据寄存器DR”把数据填充到发送缓冲区中。
    通过读“数据寄存器DR”,可以获取接收缓冲区中的内容。

    其中数据帧长度可以通过“控制寄存器CR1”的“DFF位”配置成8位及16位模式;配置“LSBFIRST位”可选择MSB先行还是LSB先行。

    • 整体控制逻辑

    整体控制逻辑负责协调整个SPI外设,控制逻辑的工作模式根据“控制寄存器(CR1/CR2)”的参数而改变,基本的控制参数包括前面提到的SPI模式、波特率、LSB先行、主从模式、单双向模式等等。

    在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR)”,只要读取状态寄存器相关的寄存器位,就可以了解SPI的工作状态了。除此之外,控制逻辑还根据要求,负责控制产生SPI中断信号、DMA请求及控制NSS信号线。

    实际应用中,一般不使用STM32 SPI外设的标准NSS信号线,而是更简单地使用普通的GPIO,软件控制它的电平输出,从而产生通讯起始和停止信号。

    • 通讯过程

    控制NSS信号线,产生起始信号(图中没有画出);
    把要发送的数据写入到“数据寄存器DR”中,该数据会被存储到发送缓冲区;
    通讯开始,SCK时钟开始运行。MOSI把发送缓冲区中的数据一位一位地传输出去;MISO则把数据一位一位地存储进接收缓冲区中;
    当发送完一帧数据的时候,“状态寄存器SR”中的“TXE标志位”会被置1,表示传输完一帧,发送缓冲区已空;类似地,当接收完一帧数据的时候,“RXNE标志位”会被置1,表示传输完一帧,接收缓冲区非空;
    等待到“TXE标志位”为1时,若还要继续发送数据,则再次往“数据寄存器DR”写入数据即可;等待到“RXNE标志位”为1时,通过读取“数据寄存器DR”可以获取接收缓冲区中的内容。

    假如使能了TXE或RXNE中断,TXE或RXNE置1时会产生SPI中断信号,进入同一个中断服务函数,到SPI中断服务程序后,可通过检查寄存器位来了解是哪一个事件,再分别进行处理。也可以使用DMA方式来收发“数据寄存器DR”中的数据。

    •  SPI初始化结构体详解

     SPI_Direction本成员设置SPI的通讯方向,可设置为双线全双工(SPI_Direction_2Lines_FullDuplex),双线只接收(SPI_Direction_2Lines_RxOnly),单线只接收(SPI_Direction_1Line_Rx)、单线只发送模式(SPI_Direction_1Line_Tx)。

     SPI_Mode本成员设置SPI工作在主机模式(SPI_Mode_Master)或从机模式(SPI_Mode_Slave  ),这两个模式的最大区别为SPI的SCK信号线的时序,SCK的时序是由通讯中的主机产生的。若被配置为从机模式,STM32的SPI外设将接受外来的SCK信号。

    SPI_DataSize本成员可以选择SPI通讯的数据帧大小是为8位(SPI_DataSize_8b)还是16位(SPI_DataSize_16b)。

    SPI_FirstBit 所有串行的通讯协议都会有MSB先行(高位数据在前)还是LSB先行(低位数据在前)的问题,而STM32的SPI模块可以通过这个结构体成员,对该特性编程控制。

    SPI_CRCPloynomial 这是SPI的CRC校验中的多项式,若我们使用CRC校验时,就使用这个成员的参数(多项式),来计算CRC的值。

     配置完这些结构体成员后,要调用SPI_Init函数把这些参数写入到寄存器中,实现SPI的初始化,然后调用SPI_Cmd来使能SPI外设。

    •  SPI读写FLASH实验

     FLASH的存储特性:1、在写入数据前必须先擦除(擦除就是把所有数据改为1),2、写入数据时只能把为1 的数据改为0,3、擦除时必须按最小单位来擦除,比如说扇区。

    norflash:可以一个字节写入

    nandflash:必须以块或者扇区为单位进行读写

     SPI与I2C的区别:

    1、SPI相对于I2C来说,SPI的传输速率要高得多,所以低速传感器可能用I2C,但是高速传感器用SPI还是用得非常多的。

    2、I2C为半双工,因为只有一根线,而SPI有两根总数据线,一根可以接收数据,一根发送数据,为全双工通信,

    3、SPI通过片选信号线来选择设备,I2C通过设备地址来选择设备

    4、I2C数据为时钟线高电平有效,SPI数据为上升沿或者下降沿有效

  • 相关阅读:
    结构体怎么组包发送
    开源语音代码eSpeak1.06 的移植到单片机的过程(二)之分析下speak.c 文件
    看看深圳的房价
    开源语音代码eSpeak1.06 的移植到单片机的过程(一)0之分析下espeak.c 文件
    开源语音代码eSpeak1.06 的学习入门
    利尔达模组CAT1 UIS8910指令的 TCP相关中文解释
    将博客搬至CSDN
    【原创】大叔问题定位分享(39)azkaban定期出现fullgc
    【原创】大叔经验分享(129)mac下启动MAT报错
    【原创】大数据基础之Doris(1)编译安装和启动
  • 原文地址:https://www.cnblogs.com/roscangjie/p/11732816.html
Copyright © 2011-2022 走看看