基于ST MCU( STM32L431RCTx) SPI模块外接SPI FALSH的案例
文章目录
- 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的案例相关推荐
- 18. SPI协议,spi转can,MCP2515裸机驱动详解
更多信息请关注公众号:一口Linux 十八.SPI.MCP2515 一.SPI概述 Serial Peripheral interface 通用串行外围设备接口 是Motorola首先在其MC68HC ...
- 基于STM32F1与NRF24L01模块的SPI简单通信
一.前言 1.简介: 本文是基于STM32F1,将数据发送至NRF模块的寄存器,并将数据重新读取,通过串口发送出来的简单SPI单通信. 2.SPI简介: 调过STM8的都已经对SPI有所了解,调法都一 ...
- MC9S12XEP100的SPI模块(S12SPIV5)
最近要用到W5500,终于有机会使用SPI模块了,把相关资料看了遍,各种速成教程还是没有数据手册靠谱.于是直接翻译一遍. SPI模块的硬件驱动部分已经写好.http://blog.csdn.net/l ...
- clip许可证设备id与绑定设备不匹配_LINUX SPI通用字符设备模型介绍(SPI模块分析结束篇)...
在前面几篇文章我们分析了SPI驱动框架模型.SPI总线.SPI MASTER.SPI DEVICE.SPI通信接口等内容,本篇是SPI总线的最后一篇,主要介绍SPI通用字符设备. spi通用字符设备说 ...
- 【Flink】FLink PipelineExecutorFactory 基于工厂模式的任务提交与SPI机制
1.概述 转载: Flink1.10基于工厂模式的任务提交与SPI机制 Flink任务执行模式包含了yarn-session.standalone.per-job.local, 在1.10中又增加k8 ...
- Postgresql源码(82)SPI模块拆解分析一:执行简单SQL获取结果
相关 <Postgresql源码(76)执行器专用元组格式TupleTableSlot> <Postgresql源码(82)SPI模块拆解分析一:执行简单SQL获取结果> &l ...
- 基于ST的STM32F030K6T6的超声波氧气浓度传感器模块方案
大大通--大联大线上技术支持平台&方案知识库 大大通ST原厂频道--提供ST意法半导体完整方案.产品.技术详解! 用于医疗设备的超声波氧气和流量传感器 自2020年以来,由于新型冠状病毒爆发, ...
- ST已发布基于PC端的ST MCU选型工具
基于PC端的ST MCU FINDER 即ST MCU选型工具正式推出了.其实基于手机端的ST MCU FINDER早已面世,相比之下,或许基于PC端的更实用.更方便. ST MCU FINDER工具 ...
- 【开源项目介绍】STC32基于u8g2库DMA驱动IIC or SPI OLED屏幕显示
[开源项目介绍]STC32基于u8g2库DMA驱动IIC or SPI OLED屏幕显示
最新文章
- uboot i2c 命令的读写测试
- 贵州瑶山古寨旅游产品设计_快领取!贵州推出20条秋冬旅游线路
- python循环语句知识点_Python for 循环语句【每日一个知识点第115期
- SpringBoot+MyBatis搭建迷你小程序
- 你还不知道Redis 高延迟时发生了啥嘛?
- 例子---随机数/不重复的随机数
- Django基础之wsgi
- 【渝粤教育】国家开放大学2018年春季 8668-21T汽车涂装技术(A) 参考试题
- C# PDFLibNet PDF转JPG
- 简单实现网站灰色效果以谨记2020年4月4日悼念日
- 其实读一读,真的安静了
- 计算机系要高考英语口语吗,高考英语口语考试_高考英语口语考试到底有什么用?很重要么?...
- data mining (foreign blogs)
- 万得-python接口-获取数据
- 多发性硬化功能磁共振成像
- 继百度天工物联网平台对接之后,迈思德网关成功与中国联通APN移动应用平台对接
- 雷赛服务器信号er020,【雷赛】L6E 伺服系统 EtherCAT 通讯功能手册.pdf
- unity AVPro视频播放
- 求助移动硬盘显示函数不正确
- JAVA 一个月多少天