8,STM32CubeMX配置SPI工程(读取norflash的ID)

1,前言

        单片机型号:STM32F407

        编程环境    :STM32CubeMX + Keil v5

        硬件连接    :SPI1,CS/SS--->PB14

注:本工程在1,STM32CubeMX工程基础(配置Debug、时钟树)基础上完成。

        本工程在4,STM32CubeMX配置UART串口工程基础上完成。

2,STM32CubeMX配置SPI工程

        首先开启STM32的SPI接口,STM32F407一共有三个SPI接口,本文使用接口SPI1。

在Connectivity(1)下方点击SPI1(2)启用SPI接口1。点击设置部分Mode(3)将SPI模式设置为Full-Duplex Master全双工主机模式,可以在Paramater Setting(4)设置分频系数64,让SPI的速度低一些。设置完成后可以看到Pinout view(5)以及显示出信息。这里本文用的是复用功能的SPI1和原SPI1效果相同。

        其次,配置SPI1的CS/SS片选引脚,可以在cubeMX上使用硬件CS/SS片选功能,本文使用软件的方式实现。配置方式如下,首先在PB14(1)引脚处左击选择模式未GPIO_Output,在System Core(2)下选择GPIO(3)进行设置。在PB14 Configuration(4)配置界面,将输出默认电平改为High、上拉输出、输出速度为高(由于SPI传输速度较高)。

3,STM32HAL库常用SPI函数

1,SPI发送函数HAL_SPI_Transmit。输入量hspi为句柄, 输入量pData为传输的数据, 输入量 Timeout为超时时间。

/**
  * @brief 在阻塞模式下传输一定数量的数据。
  * SPI_HandleTypeDef@param指向包含
  * SPI 模块的配置信息。
  * @param指向数据缓冲区的 pData 指针
  * @param 大小 要发送的数据量
  * @param 超时超时持续时间
  * @retval HAL 状态
  */
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

2.SPI接收函数HAL_SPI_Receive。输入量hspi为句柄, 输入量pData为接收的数据, 输入量Size为要接收的数据大小(多少字节),输入量 Timeout为超时时间。

/**
  * @brief 在阻塞模式下接收一定数量的数据。
  * SPI_HandleTypeDef@param指向包含
  * SPI 模块的配置信息。
  * @param指向数据缓冲区的 pData 指针
  * @param 要接收的数据量大小
  * @param 超时超时持续时间
  * @retval HAL 状态
  */
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

2.SPI发送接收函数HAL_SPI_TransmitReceive。输入量hspi为句柄,输入量pTxData为发送的数据, 输入量pRxData为接收的数据, 输入量Size为要接收的数据大小(多少字节),输入量 Timeout为超时时间。(注:为什么会有发送接收函数,SPI通信作为单主多从模式,其协议必须有发送才会有接收。如果只想接收数据,则需要发送一个空数据来实现。)

/**
  * @brief 在阻塞模式下发送和接收一定量的数据。
  * SPI_HandleTypeDef@param指向包含
  * SPI 模块的配置信息。
  * @param pTxData 指针指向传输数据缓冲区
  * @param pRxData 指针指向接收数据缓冲区
  * @param 大小 要发送和接收的数据量
  * @param 超时超时持续时间
  * @retval HAL 状态
  */
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,uint32_t Timeout)

4,编程实战(SPI读取norflash的ID)

       首先添加两个.c/.h文件。然后设置norflash的spi的发送接收函数。

uint8_t spi1_read_write_byte(uint8_t Txdata)
{
	uint8_t Rxdata;
	HAL_SPI_TransmitReceive(&hspi1 ,&Txdata, &Rxdata, 1, 1000);
	return Rxdata;
}

        下面是读取norflash的ID时序函数。

/**
 * @brief       读取芯片ID
 * @param       无
 * @retval      FLASH芯片ID
 *   @note      芯片ID列表见: norflash.h, 芯片列表部分
 */
uint16_t norflash_read_id(void)
{
    uint16_t deviceid;

    NORFLASH_CS(0);
    spi1_read_write_byte(FLASH_ManufactDeviceID);   /* 发送读 ID 命令 */
    spi1_read_write_byte(0);                        /* 写入一个字节 */
    spi1_read_write_byte(0);
    spi1_read_write_byte(0);
    deviceid = spi1_read_write_byte(0xFF) << 8;     /* 读取高8位字节 */
    deviceid |= spi1_read_write_byte(0xFF);         /* 读取低8位字节 */
    NORFLASH_CS(1);

    return deviceid;
}

        编译成功,烧录后打开串口调试助手,实验完成。

### STM32 CubeMX 配置 SPI 以驱动 LCD 的指南 #### 使用 STM32CubeMX 初始化项目 为了配置 STM32 来通过 SPI 接口驱动 LCD 显示屏,在初始化阶段需利用 STM32CubeMX 工具创建新工程并设置必要的硬件参数。启动 STM32CubeMX 后,选择目标微控制器型号,并点击“Start Project”。完成基本设置后进入主界面[^1]。 #### 配置 SPI 外设 在图形化界面上找到 SPI 模块对应的图标,双击打开其属性编辑器。这里可以指定 SPI 功能模式为主设备 (Master),这通常是连接到外部从属器件如 LCD 所必需的选择。同时调整时钟极性和相位选项来匹配所选显示屏的要求;这些参数通常可以在 LCD 数据手册中查得。 #### 设置 GPIO 引脚映射 对于选定的 SPI 总线,还需定义关联的 GPIO 引脚功能。确保 MOSI、MISO 和 SCLK 这些信号被正确分配给物理引脚位置。另外,如果使用片选机制,则应额外设定一个 GPIO 输出作为 CS 控制端子。 #### 添加 HAL 库支持 确认已勾选 "Generate Initialization Code from Middleware" 以便自动生成基于 HAL API 的源文件框架。这样做的好处是可以简化底层寄存器操作而专注于应用层逻辑开发。HAL 提供了一系列方便易用的功能函数用于管理外设通信过程中的细节处理。 #### 编写应用程序代码 最后一步是在生成的基础之上编写具体的程序实现图像显示等功能。下面给出一段简单的 C++ 伪代码片段展示如何发送数据至 SPI 设备: ```cpp // 假定 hspi1 是已经初始化好的 SPI 句柄对象 uint8_t buffer[] = {0x00, 0xFF}; // 待传输的数据缓冲区 HAL_SPI_Transmit(&hspi1, buffer, sizeof(buffer), HAL_MAX_DELAY); ``` 上述例子仅作示意用途,请参照实际使用的库文档以及具体需求做适当修改完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值