• STM32F407ZGT6|SPI主从模式


    功能:主机发送数据0x34–>从机接收数据–>通过串口将数据发送出去–>串口猎人显示0x34

    必备知识点

    1、SPI串行外设接口特点
    高速、全双工、同步、串行
    
    • 1
    • 高速:发送数据的速度很快
    • 全双工:两设备可同时双向通信(接收与发送)
    • 同步:使用一个时钟源
    • 串行:串行数据一位一位发(占用的外设接口少,但效率相对较低)
    2、SPI四根总线及功能
    NSS、SCK、MOSI、MISO
    
    • 1
    • NSS(片选线):
      [1]每个从机都有自己的一条单独的总线与主机连接,此总线的作用就是为主机选择对应的从机进行传输数据,每个从机与主机之间的NSS总线互不相干。
      [2]片选线默认为高电平,SPI中规定通信以NSS信号线拉低为开始,拉高为结束。(软件管理下,片选线需手动拉低/硬件片选线的拉高与拉低自动设置)
    • SCK(时钟线):保持同步的时钟源(32的晶振)
    • MOSI:主器件输出数据,从器件输入数据(主器件默认为高,主器件默认为低)
      MISO:主器件输入数据,从器件输出数据(主器件默认为高,主器件默认为低)
      注意:“MOSI/MISO电平高低可能有误,但应该是这样”

    1主机多从机
    在这里插入图片描述
    1主机1从机
    在这里插入图片描述

    3、物理层与协议层的一些知识

    物理层:片选线(软件管理/硬件管理)
    [1] SPI_NSS_Hard:硬件自动拉高拉低片选,在速率上是远比软件方式控制要高的,缺点是当STM32为主设备时,同一个SPI上面只能接一个从设备。这也就限制了SPI通信设备的数量。
    [2] SPI_NSS_Soft:软件控制,GPIO控制片选拉高拉低,优点是一个SPI上面可以挂多个设备。这也是使用较多的方式。通过SPI_Cmd这个函数实现的,使能SPI,硬件自动拉低片选,取消使能SPI,硬件自动拉高片选。
    [3] 注意:“一般主器件用软件管理,从器件用硬件管理”

    协议层:四种通讯模式
    [1] 时钟极性(CPOL):NSS总线空闲时SCK电平信号,空闲时为高电平(=1),低电平(=0)
    [2] 时钟相位(CPHA):数据采样时刻,奇数边(=0),偶数边(=1)
    在这里插入图片描述

    在这里插入图片描述

    参考资料

    视频
    https://www.bilibili.com/video/BV1wK411g78L/?spm_id_from=333.851.header_right.history_list.click&vd_source=c567c826b38b783f81e4cb19996400c5

    文章
    https://one-piece.blog.csdn.net/article/details/119545607?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-119545607-blog-126541530.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-119545607-blog-126541530.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=1

    配置步骤

    主器件

    • 一些初始化:结构体(GPIOA/SPI)
    • 使能:SPI IO/SPI外设时钟
    • 重映射:SPI(NSS/SCK/MISO/MOSI)
    • SPI(NSS/SCK/MISO/MOSI)外设接口初始化
    • SPI初始化;使能SPI;拉低片选
    • 主器件发送数据
    //主
    #include "stm32f4xx.h"
    #include "delay.h"
    
    int main(void)
    {
       
        //一些初始化:结构体(GPIOA/SPI)
    	GPIO_InitTypeDef GPIO_InitStructure4;//GPIOA4
    	GPIO_InitTypeDef GPIO_InitStructure5;//GPIOA5
    	GPIO_InitTypeDef GPIO_InitStructure6;//GPIOA6
    	GPIO_InitTypeDef GPIO_InitStructure7;//GPIOA7
    	SPI_InitTypeDef SPI_InitStructure;
    
    	//使能:SPI IO/SPI外设时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能 SPI1 IO口
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能 SPI 外设时钟GPIOA
    	
    	//重映射:SPI(NSS/SCK/MISO/MOSI)
     	GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_SPI1);//NSS,使用软件管理方法
    	GPIO_PinAFConfig(GPIOA
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    NAT常用配置讲解!eNSP实验拓扑!
    Python基础_第4章_Python数据序列(容器)
    SAP官方免费提供的OData Gateway Demo 学习系统
    JAVA后端开发面试基础知识(七)——多线程
    vue项目中基于fabric 插件实现涂鸦画布功能
    Java线程通信
    vue项目查看vue版本-- 踩坑
    ElasticSearch(九)【SpringBoot整合】
    muduo源码学习base——Atomic(原子操作与原子整数)
    MySQL数据库基础:数据库基础知识,MySQL数据库及配置安装
  • 原文地址:https://blog.csdn.net/weixin_49079904/article/details/127719356