• CubeMx笔记 --SPI


    1、内部图简明图

    在这里插入图片描述

    SPI 接口一般使用 4 条线通信:

    • MISO 主设备数据输入,从设备数据输出。master in
    • MOSI 主设备数据输出,从设备数据输入。master out
    • SCLK 时钟信号,由主设备产生。
    • CS 从设备片选信号,由主设备控制通信·。
      一般自定义GPIO输出、拉低开始通信,拉高结束通信

    3、CPOL和CPHA

    • 时钟极性( CPOL)
      CPOL=0,串行同步时钟的空闲状态为低电平
      CPOL=1,串行同步时钟的空闲状态为高电平
    • 时钟相位( CPHA)
      CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样
      CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样
    • 最高有效位(MSB)
    • 最低有效位(LSB)

    在这里插入图片描述

    3、cubemx配置

    3.1、spi5

    在这里插入图片描述

    • Data Size 数据长度
      8bit和16bit两种
    • First Bit 对齐形式
      MSB 在前还是 LSB 在前
    • Prescaler 预分频(psc)
      用于控制波特率,波特率 = 时钟/psc
      SPI5用的是APB2
      在这里插入图片描述
    • Clock Polarity CPOL
      时钟极性设置
    • Clock Phase CPHA
      时钟相位设置
    • CRC Calculation
      是否启用CRC
    • NSS Signal Type 片选形式
      硬件实现还是软件实现

    3.2、片选线

    • 低电平表示通信开始,所以要一开始要拉高

    在这里插入图片描述

    4、应用

    • 对spi flash进行读写
    • spi flash 为 W25Q256

    4.1、原理图

    在这里插入图片描述

    4.2、读取设备id

    • 这里是读取命令
    • dummy 表示任意数据
      在这里插入图片描述
    
    //  MX_GPIO_Init();
    //  MX_SPI5_Init();
    
    void spi_readid(void){
    	uint16_t temp = 0;
    	uint8_t rxdata = 0;//接收数据
    	uint8_t txdata = 0;//发送数据
    	
    	//开启数据发送 PF6
    	HAL_GPIO_WritePin(F_CS_GPIO_Port,F_CS_Pin,GPIO_PIN_RESET);
    	
    	txdata = 0x90;
    	HAL_SPI_Transmit(&hspi5,&txdata,1,999);
    	txdata = 0x00;//可以任意数据
    	HAL_SPI_Transmit(&hspi5,&txdata,1,999);
    	HAL_SPI_Transmit(&hspi5,&txdata,1,999);
    	HAL_SPI_Transmit(&hspi5,&txdata,1,999);
    	//HAL_SPI_Transmit(&hspi5,(unit8_t *)"0x90",1,1000);//不能这样写
    	
    	txdata = 0xff;//这个也可以任意数据
    	HAL_SPI_TransmitReceive(&hspi5,&txdata,&rxdata,1,999);
    	u1_printf("%x\r\n",rxdata);
    	temp |= rxdata<<8; 
    	
        HAL_SPI_TransmitReceive(&hspi5,&txdata,&rxdata,1,999);  
        u1_printf("%x\r\n",rxdata);
    	temp |= rxdata;
    	
    	//关闭数据发送
    	HAL_GPIO_WritePin(F_CS_GPIO_Port,F_CS_Pin,GPIO_PIN_SET);
    
    	// W25Q256 id 为 0xef18
    	if(temp == 0xEF18){
    		u1_printf("spi ok\r\n");
    	}
    	else{
    		u1_printf("spi error\r\n");
    		u1_printf("%hx\r\n",temp);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    在这里插入图片描述
    在这里插入图片描述

    • u1_printf 可以看这个CubeMx笔记 – 串口
    • 只是看能不能读写到spi flash,后面会对这个函数优化
  • 相关阅读:
    postgre 12.11单实例安装文档
    专利申请流程细节问答(Q & A)
    JS高级:Git
    强化学习——Q-Learning算法原理
    [附源码]Python计算机毕业设计高校第二课堂管理系统
    axios、vue-axios请求模块
    如何将 CSDN 的文章搬到 知乎 以及 微信公众号?
    C Primer Plus(6) 中文版 第3章 数据和C 3.5 使用数据类型
    【C++学习第八讲】简单变量(二)
    常见网络服务器并发模型
  • 原文地址:https://blog.csdn.net/m0_60292931/article/details/126852884