当前位置: 首页 > news >正文

HAL库开发--SPI的配置方式和读写操作

知不足而奋进 望远山而前行


目录

文章目录

前言

目标

内容

需求

SPI配置

SPI编码

OLED驱动拷贝

OLED的GPIO初始化修改

实现SPI的读写

总结


前言

SPI(Serial Peripheral Interface)是一种常见的串行通信协议,在嵌入式系统中被广泛应用于外设间的高速数据传输。本文将介绍如何在STM32开发板上配置和操作SPI接口,特别是在全双工模式下使用,以实现稳定和高效的数据交换。我们还将探讨如何集成OLED显示屏驱动,通过SPI接口实现数据传输和控制,从而在嵌入式应用中实现图形和文本的显示功能。


目标

  1. 掌握SPI配置方式
  2. 掌握SPI读写操作

内容

需求

SPI配置

打开SPI1,选中全双工模式。观察下方自动生成的引脚,是否和自己开发板引脚对应。

可以根据需要修改引脚,来动右侧芯片引脚视图,找到开发板对应引脚,进行修改。

修改SPI参数,目前当前业务只需要修改速率,通过修改分频得到。

SPI编码

OLED驱动拷贝

将原有OLED驱动拷贝到项目中

OLED的GPIO初始化修改

GPIO_InitTypeDef GPIO_InitStruct = {0};	
//cs1: 屏幕的片选
CS1_PORT_RCC();
GPIO_InitStruct.Pin = CS1_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(CS1_PORT, &GPIO_InitStruct);
//	
//cs2: 字库的片选
CS2_PORT_RCC();
GPIO_InitStruct.Pin = CS2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(CS2_PORT, &GPIO_InitStruct);//dc: 是屏幕自己独有的命名控制引脚,和spi无关
DC_PORT_RCC();
GPIO_InitStruct.Pin = DC_PIN;
HAL_GPIO_Init(DC_PORT, &GPIO_InitStruct);
#include "stm32f4xx_hal.h"
#include "spi.h"#ifndef u8
#define u8 uint8_t
#endif#ifndef u16
#define u16 uint16_t
#endif#ifndef u32
#define u32 uint32_t
#endif/// CS1 
#define CS1_PORT_RCC() 	__HAL_RCC_GPIOA_CLK_ENABLE()
#define CS1_PORT				GPIOA
#define CS1_PIN					GPIO_PIN_2/// CS2
#define CS2_PORT_RCC() 	__HAL_RCC_GPIOA_CLK_ENABLE()
#define CS2_PORT				GPIOA
#define CS2_PIN					GPIO_PIN_3/// DC
#define DC_PORT_RCC() 	__HAL_RCC_GPIOC_CLK_ENABLE()
#define DC_PORT					GPIOB
#define DC_PIN					GPIO_PIN_5//-----------------OLED端口定义---------------- #define OLED_DC_Clr()  HAL_GPIO_WritePin(DC_PORT,DC_PIN, GPIO_PIN_RESET)//DC
#define OLED_DC_Set()  HAL_GPIO_WritePin(DC_PORT,DC_PIN, GPIO_PIN_SET)#define OLED_CS_Clr()  HAL_GPIO_WritePin(CS1_PORT,CS1_PIN, GPIO_PIN_RESET)//CS1
#define OLED_CS_Set()  HAL_GPIO_WritePin(CS1_PORT,CS1_PIN, GPIO_PIN_SET)#define OLED_ROM_CS_Clr()  HAL_GPIO_WritePin(CS2_PORT,CS2_PIN, GPIO_PIN_RESET)//CS2
#define OLED_ROM_CS_Set()  HAL_GPIO_WritePin(CS2_PORT,CS2_PIN, GPIO_PIN_SET)
  • 将引入改为#include "stm32f4xx_hal.h"
  • 引入生成的spi.h
实现SPI的读写

定义头

/* USER CODE BEGIN Prototypes */
void SPI1_write(uint8_t data);
uint8_t SPI1_read();
/* USER CODE END Prototypes */

实现spi读写

/* USER CODE BEGIN 1 */
void SPI1_write(uint8_t data) {HAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY);
}
uint8_t SPI1_read() {uint8_t data;HAL_SPI_Receive(&hspi1, &data, 1, HAL_MAX_DELAY);return data;
}
/* USER CODE END 1 */

总结

本文详细介绍了在STM32微控制器上配置和使用SPI接口的方法,以及与OLED显示屏驱动的集成。首先,我们通过HAL库选择并配置了SPI1通道,确保其在全双工模式下能够正确地与外设通信。接着,我们修改了SPI参数,特别是时钟分频,以满足当前业务需求。随后,我们将现有的OLED驱动代码集成到项目中,并修改了GPIO初始化设置,确保CS1、CS2和DC引脚正确地与SPI和OLED通信相关的控制信号相连。

在代码实现中,我们定义并实现了简单的SPI写(SPI1_write)和读(SPI1_read)函数,利用HAL库提供的API来进行数据传输。这些功能不仅使得STM32能够与OLED显示屏无缝通信,还为开发人员提供了一个可靠的解决方案,用于实现图形界面和文本显示的嵌入式应用程序。

通过学习本文中的步骤和方法,开发人员不仅能够掌握SPI接口的基本配置和操作,还能够扩展到更复杂的外设集成和应用开发。SPI作为一种高效的串行通信协议,为嵌入式系统提供了强大的数据交换能力,特别适用于需要高速和可靠通信的应用场景。

http://www.xdnf.cn/news/915175.html

相关文章:

  • 《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析LLP (二)
  • pycharm中提示C++ compiler not found -- please install a compiler
  • K8S认证|CKS题库+答案| 5.日志审计
  • 容器安全最佳实践:云原生环境下的零信任架构实施
  • java复习 04
  • HTML面试整理
  • 深入了解UDP套接字:构建高效网络通信
  • iframe(概念、简单例子、在vue项目中的使用)
  • Java毕业设计:WML信息查询与后端信息发布系统开发
  • TripGenie:畅游济南旅行规划助手:个人工作纪实(二十二)
  • [总结篇]个人网站
  • 应用层协议:HTTPS
  • 微软PowerBI考试 PL300-使用适用于 Power BI 的 Copilot 创建交互式报表
  • 2025年- H75-Lc183--121.买卖股票的最佳时机1(贪心or动态规划)--Java版
  • Vue:Ajax
  • 学习STC51单片机30(芯片为STC89C52RCRC)
  • 【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目
  • c++学习-this指针
  • 微信小程序带参分享、链接功能
  • ​​Android 如何查看CPU架构?2025年主流架构有哪些?​
  • 文字转语音
  • 安卓基础(Java 和 Gradle 版本)
  • Qt Quick Test模块功能及架构
  • Qt/C++学习系列之列表使用记录
  • 网络原理5 - TCP4
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(三十一) -> 同步云端代码至DevEco Studio工程
  • 【Java学习笔记】StringBuilder类(重点)
  • 基于 Transformer robert的情感分类任务实践总结之二——R-Drop
  • Python实例题:Python计算线性代数
  • SQL 基础入门