文章目录

  • 1.相关开发环境
  • 2.SPI1 外接SPI FLASH
  • 3.SPI FLASH初始化
    • 3.1 SPI FLASH支持SPI MODE0/3的通讯控制
    • 3.2 SPI 硬件CRC 不需要DISABLE即可
    • 3.3 SPI CS 软件GPIO控制即可
  • 4.SPI FLASH 的读 写 等操作验证代码
    • 4.1 SPI FLASH ID读取
    • 4.2 SPI FLASH 读写
  • 5.参考

1.相关开发环境

硬件版本:STM32L431RCTx

开发软件:KEIL

2.SPI1 外接SPI FLASH

MCU SPI1 外接SPI FLASH

#define CS_PORT GPIOB
#define CS_PIN GPIO_PIN_11#define FLASH_CS_ENABLE() HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_RESET)
#define FLASH_CS_DISABLE() HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_SET)

3.SPI FLASH初始化

根据 FLASH 芯片的说明,它支持 SPI模式 0及模式 3,支持双线全双工,使用 MSB先行模式,支持最高通讯时钟为 104MHz,数据帧长度为 8 位。我们要把 STM32 的 SPI 外设中的这些参数配置一致。

SPI 1初始化 Init的具体定义如下:

static void st_SPI1_Init(void)
{/* SPI1 parameter configuration*/hspi1.Instance = SPI1;hspi1.Init.Mode = SPI_MODE_MASTER;hspi1.Init.Direction = SPI_DIRECTION_2LINES;hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
//  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
//  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;hspi1.Init.NSS = SPI_NSS_SOFT;hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;hspi1.Init.TIMode = SPI_TIMODE_DISABLE;hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;hspi1.Init.CRCPolynomial = 7;hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;if (HAL_SPI_Init(&hspi1) != HAL_OK){Error_Handler();}}

3.1 SPI FLASH支持SPI MODE0/3的通讯控制

//   hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
//  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;

3.2 SPI 硬件CRC 不需要DISABLE即可

hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

3.3 SPI CS 软件GPIO控制即可

hspi1.Init.NSS = SPI_NSS_SOFT;

4.SPI FLASH 的读 写 等操作验证代码

4.1 SPI FLASH ID读取

uint32_t stmcu_W25Q64_ReadDeviceID(void)
{uint8_t command = FLASH_READ_DEVICE_ID;uint32_t usFlashId = 0;uint8_t temp_buff[3] = {0};FLASH_CS_ENABLE();HAL_SPI_Transmit(&hspi1, &command, 1, 1);  // 90hHAL_SPI_Transmit(&hspi1, temp_buff, 3, 3); //写入24位地址;假地址HAL_SPI_Receive(&hspi1, temp_buff, 2, 2);FLASH_CS_DISABLE();//usFlashId = (uint32_t)temp_buff[2]|(temp_buff[1] << 8) | (temp_buff[0] << 16);usFlashId = (uint16_t)(temp_buff[1]) | (temp_buff[0] << 8);return usFlashId;
}
uint32_t stmcu_W25Q64_ReadDeviceID_JEDEC(void)
{uint8_t command = FLASH_READ_JEDEC_ID;uint32_t usFlashId = 0;uint8_t temp_buff[3] = {0};FLASH_CS_ENABLE();HAL_SPI_Transmit(&hspi1, &command, 1, 1);  // 9Fh//  HAL_SPI_Transmit(&hspi1, temp_buff, 3, 3); //写入24位地址;假地址HAL_SPI_Receive(&hspi1, temp_buff, 3, 3);FLASH_CS_DISABLE();usFlashId = (uint32_t)temp_buff[2]|(temp_buff[1] << 8) | (temp_buff[0] << 16);return usFlashId;
}

4.2 SPI FLASH 读写

void stmcu_W25Q64_WriteEnable(void)
{uint8_t command = FLASH_WRITE_ENABLE_CMD;FLASH_CS_ENABLE();HAL_SPI_Transmit(&hspi1, &command, 1, 1);FLASH_CS_DISABLE();
}
void stmcu_W25Q64_WriteDisable(void)
{uint8_t command = FLASH_WRITE_DISABLE_CMD;FLASH_CS_ENABLE();HAL_SPI_Transmit(&hspi1, &command, 1, 1);FLASH_CS_DISABLE();
}uint8_t stmcu_W25Q64_ReadSR(void)
{uint8_t ucTmpVal = 0;uint8_t command = FLASH_READ_SR_CMD;FLASH_CS_ENABLE();HAL_SPI_Transmit(&hspi1, &command, 1, 1);HAL_SPI_Receive(&hspi1, &ucTmpVal, 1, 1);FLASH_CS_DISABLE();return ucTmpVal;
}
void stmcu_W25Q64_WriteSR(uint8_t _ucByte)
{uint8_t CMD[2] = {FLASH_WRITE_SR_CMD, 0};CMD[1] = _ucByte;stmcu_W25Q64_WriteEnable();stmcu_W25Q64_WaitNobusy();FLASH_CS_ENABLE();HAL_SPI_Transmit(&hspi1, CMD, 2, 2);FLASH_CS_DISABLE();stmcu_W25Q64_WaitNobusy();
}void stmcu_W25Q64_WaitNobusy(void)
{while (((stmcu_W25Q64_ReadSR()) & 0x01) == 0x01) //等待BUSY位清空{osDelay(1);}
}
void stmcu_W25Q64_ReadData(uint32_t Addr, uint8_t *Buffer, uint16_t NByte)
{uint8_t temp_buff[4] = {0};if (Buffer == NULL){return;}temp_buff[0] = FLASH_READ_DATA;temp_buff[1] = (uint8_t)(Addr >> 16);temp_buff[2] = (uint8_t)(Addr >> 8);temp_buff[3] = (uint8_t)(Addr >> 0);FLASH_CS_ENABLE();HAL_SPI_Transmit(&hspi1, temp_buff, 4, 4);HAL_SPI_Receive(&hspi1, Buffer, NByte, NByte);FLASH_CS_DISABLE();
}
void stmcu_W25Q64_WriteData(uint32_t Addr, uint8_t *Buffer, uint16_t NByte)
{uint8_t temp_buff[4] = {0};if (Buffer == NULL){return;}temp_buff[0] = FLASH_WRITE_PAGE;temp_buff[1] = (uint8_t)(Addr >> 16);temp_buff[2] = (uint8_t)(Addr >> 8);temp_buff[3] = (uint8_t)(Addr >> 0);stmcu_W25Q64_WriteEnable();stmcu_W25Q64_WaitNobusy();FLASH_CS_ENABLE();HAL_SPI_Transmit(&hspi1, temp_buff, 4, 4);HAL_SPI_Transmit(&hspi1, Buffer, NByte, NByte);FLASH_CS_DISABLE();stmcu_W25Q64_WaitNobusy();
}

5.参考

本文引用《STM32库开发实战指南》

obusy();

FLASH_CS_ENABLE();
HAL_SPI_Transmit(&hspi1, temp_buff, 4, 4);
HAL_SPI_Transmit(&hspi1, Buffer, NByte, NByte);
FLASH_CS_DISABLE();stmcu_W25Q64_WaitNobusy();

}

## 5.参考本文引用《STM32库开发实战指南》##

基于ST MCU( STM32L431RCTx) SPI模块外接SPI FALSH的案例相关推荐

  1. 18. SPI协议,spi转can,MCP2515裸机驱动详解

    更多信息请关注公众号:一口Linux 十八.SPI.MCP2515 一.SPI概述 Serial Peripheral interface 通用串行外围设备接口 是Motorola首先在其MC68HC ...

  2. 基于STM32F1与NRF24L01模块的SPI简单通信

    一.前言 1.简介: 本文是基于STM32F1,将数据发送至NRF模块的寄存器,并将数据重新读取,通过串口发送出来的简单SPI单通信. 2.SPI简介: 调过STM8的都已经对SPI有所了解,调法都一 ...

  3. MC9S12XEP100的SPI模块(S12SPIV5)

    最近要用到W5500,终于有机会使用SPI模块了,把相关资料看了遍,各种速成教程还是没有数据手册靠谱.于是直接翻译一遍. SPI模块的硬件驱动部分已经写好.http://blog.csdn.net/l ...

  4. clip许可证设备id与绑定设备不匹配_LINUX SPI通用字符设备模型介绍(SPI模块分析结束篇)...

    在前面几篇文章我们分析了SPI驱动框架模型.SPI总线.SPI MASTER.SPI DEVICE.SPI通信接口等内容,本篇是SPI总线的最后一篇,主要介绍SPI通用字符设备. spi通用字符设备说 ...

  5. 【Flink】FLink PipelineExecutorFactory 基于工厂模式的任务提交与SPI机制

    1.概述 转载: Flink1.10基于工厂模式的任务提交与SPI机制 Flink任务执行模式包含了yarn-session.standalone.per-job.local, 在1.10中又增加k8 ...

  6. Postgresql源码(82)SPI模块拆解分析一:执行简单SQL获取结果

    相关 <Postgresql源码(76)执行器专用元组格式TupleTableSlot> <Postgresql源码(82)SPI模块拆解分析一:执行简单SQL获取结果> &l ...

  7. 基于ST的STM32F030K6T6的超声波氧气浓度传感器模块方案

    大大通--大联大线上技术支持平台&方案知识库 大大通ST原厂频道--提供ST意法半导体完整方案.产品.技术详解! 用于医疗设备的超声波氧气和流量传感器 自2020年以来,由于新型冠状病毒爆发, ...

  8. ST已发布基于PC端的ST MCU选型工具

    基于PC端的ST MCU FINDER 即ST MCU选型工具正式推出了.其实基于手机端的ST MCU FINDER早已面世,相比之下,或许基于PC端的更实用.更方便. ST MCU FINDER工具 ...

  9. 【开源项目介绍】STC32基于u8g2库DMA驱动IIC or SPI OLED屏幕显示

    [开源项目介绍]STC32基于u8g2库DMA驱动IIC or SPI OLED屏幕显示

最新文章

  1. uboot i2c 命令的读写测试
  2. 贵州瑶山古寨旅游产品设计_快领取!贵州推出20条秋冬旅游线路
  3. python循环语句知识点_Python for 循环语句【每日一个知识点第115期
  4. SpringBoot+MyBatis搭建迷你小程序
  5. 你还不知道Redis 高延迟时发生了啥嘛?
  6. 例子---随机数/不重复的随机数
  7. Django基础之wsgi
  8. 【渝粤教育】国家开放大学2018年春季 8668-21T汽车涂装技术(A) 参考试题
  9. C# PDFLibNet PDF转JPG
  10. 简单实现网站灰色效果以谨记2020年4月4日悼念日
  11. 其实读一读,真的安静了
  12. 计算机系要高考英语口语吗,高考英语口语考试_高考英语口语考试到底有什么用?很重要么?...
  13. data mining (foreign blogs)
  14. 万得-python接口-获取数据
  15. 多发性硬化功能磁共振成像
  16. 继百度天工物联网平台对接之后,迈思德网关成功与中国联通APN移动应用平台对接
  17. 雷赛服务器信号er020,【雷赛】L6E 伺服系统 EtherCAT 通讯功能手册.pdf
  18. unity AVPro视频播放
  19. 求助移动硬盘显示函数不正确
  20. JAVA 一个月多少天

热门文章

  1. Win10远程连接,出现身份验证错误。远程计算机要求的函数不受支持 这可能是由于CredSSP加密Oracle修正 。
  2. HAL库学习01---点亮LED
  3. 好污!杜蕾斯:一份2017年度账单和床上总结求认领
  4. 阿里云态势感知服务使用教程
  5. 用友备份文件怎么与服务器断开,用友软件帐套的备份方法及帐套恢复方法规整...
  6. JFrame与Frame的区别
  7. Android仿苹果siri浮动控件
  8. 谷歌分析UA怎么转最新版GA4最方便
  9. jQuery插件漏洞排查
  10. strace命令使用