STM32完全学习——SPI接口的FLASH(DMA模式)

一、硬件SPI的配置

CPOL和CPHA这两个的配置和FALSH那边一定要保持一致,不然通信就会不正常,我使用的是W25Q128这个FALSH,下面是它的时序。我这个FALSH默认情况下使用的是模式0,模式0规定时钟线默认就是低电平,如果你选择的是模式3,那么你 CubMAX那边的设置,是需要一起修改的。

二、使用DMA来处理

理论上我们可以使用上面的这些都可以,将数据发送和接收,区别就是效率的问题。我这里使用DMA模式来进行处理数据的发送和接收。我们使用的DMA的正常模式,没有使用环形模式,因为这里的数据不像你,用DMA来进行AD转换,你只需要隔一段时间采样一次,这里所发的数据和所接收的数据都不能被覆盖,也就是DMA传输的所有数据我们都是需要的。我们这个FALH是8位的,我们在我们接收数据的时候,也使用8位接收。地址增长可以勾选也可以不选,没啥用影响。

三、编程实现FLASH的一些函数

cpp 复制代码
//SPI1 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
uint8_t SPI1_ReadWriteByte(uint8_t TxData)
{
    uint8_t Rxdata;
	HAL_SPI_TransmitReceive_DMA(&hspi1, &TxData, &Rxdata, 1);
	delay_us(1);   //这里的延时是必须的,不然工作不正常 FALSH那边不能太快
 	return Rxdata;          		    //返回收到的数据		
}
cpp 复制代码
//读取芯片ID
//返回值如下:				   
//0XEF13,表示芯片型号为W25Q80  
//0XEF14,表示芯片型号为W25Q16    
//0XEF15,表示芯片型号为W25Q32  
//0XEF16,表示芯片型号为W25Q64 
//0XEF17,表示芯片型号为W25Q128 	  
uint16_t W251128Q_Read_ID(void)
{
	uint16_t Temp = 0;	  
	FLASH_CS = 0;				    
	SPI1_ReadWriteByte(0x90);//发送读取ID命令	    
	SPI1_ReadWriteByte(0x00); 	    
	SPI1_ReadWriteByte(0x00); 	    
	SPI1_ReadWriteByte(0x00); 	 			   
	Temp |= SPI1_ReadWriteByte(0xFF)<<8;  
	Temp |= SPI1_ReadWriteByte(0xFF);	 
	FLASH_CS = 1;		
}		    
	
相关推荐
码界奇点5 小时前
Python从0到100一站式学习路线图与实战指南
开发语言·python·学习·青少年编程·贴图
YJlio7 小时前
Active Directory 工具学习笔记(10.8):AdInsight——保存与导出(证据留存、共享与二次分析)
数据库·笔记·学习
驴友花雕8 小时前
【花雕动手做】CanMV K230 AI视觉识别模块之使用CanMV IDE调试运行人脸代码
ide·人工智能·单片机·嵌入式硬件·canmv k230 ai视觉·canmv ide 人脸代码
噗噗夹的TA之旅10 小时前
Unity Shader 学习20:URP LitForwardPass PBR 解析
学习·unity·游戏引擎·图形渲染·技术美术
2401_8345170710 小时前
AD学习笔记-36 gerber文件输出
笔记·学习
气π10 小时前
【JavaWeb】——(若依 + AI)-基础学习笔记
java·spring boot·笔记·学习·java-ee·mybatis·ruoyi
深蓝海拓10 小时前
PySide6从0开始学习的笔记(三) 布局管理器与尺寸策略
笔记·python·qt·学习·pyqt
暗然而日章10 小时前
C++基础:Stanford CS106L学习笔记 8 继承
c++·笔记·学习
2401_8345170710 小时前
AD学习笔记-34 PCBlogo的添加
笔记·学习
点灯小铭10 小时前
基于单片机的酒驾报警刹车系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业