STM32 SPI EEPROM 25LC1024源码分享

这篇博客主要分享STM32通过SPI接口与25LC1024 EEPROM交互的源码,不涉及原理介绍。作者提供源码供读者参考,适合已了解器件原理的开发者。
摘要由CSDN通过智能技术生成

SPI EEPROM 25LC1024源码分享

本篇文章不讲原理,而是25LC1024源码分享,器件原理部分有网友分析的很到位了,如果还不清楚的,可以到这里学习学习。
云中屋 SPI EEPROM

话不多说,直接上干货,大家先看看有什么问题或建议直接留言或评论。
源码部分有参考网上大神的,也有自己修改或添加的。本着网上源码不好找,分享给各位参考一下。

#ifndef EEPROM_SPI_H
#define EEPROM_SPI_H

/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx_hal.h"
#include "cmsis_os.h"

/* 25LC1024 SPI EEPROM defines */
/* SPI EEPROM支持下表6条命令,即READ(读内存)、WRITE(写内存)、WREN(写使能)、WRDI(写禁止)、RDSR(读状态寄存器)、WRSR(写状态寄存器) */
#define EEPROM_READ  0x03  /*!< 从存储阵列的指定地址开始读取数据 */
#define EEPROM_WRITE 0x02  /*!< 往存储阵列的指定地址开始写数据 */
#define EEPROM_WREN  0x06  /*!< 设置写使能锁存位(使能写操作) */
#define EEPROM_WRDI  0x04  /*!< 复位写使能锁存位(失能写操作) */
#define EEPROM_RDSR  0x05  /*!< 读状态寄存器 */
#define EEPROM_WRSR  0x01  /*!< 写状态寄存器 */

/*大容量EEPROM,为了提高EEPROM操作效率,Microchip为这颗EEPROM增加了Page/Sector/Chip Erase命令*/
#define EEPROM_PE    0x42  /*!< 页擦除--擦除存储阵列中的一页 */
#define EEPROM_SE    0xD8  /*!< 扇区擦除--擦除存储阵列中的一个扇区 */
#define EEPROM_CE    0xC7  /*!< 芯片擦除--擦除存储阵列中的所有扇区 */
#define EEPROM_RDID  0xAB  /*!< 从深度睡眠中恢复和读取电子签名 */
#define EEPROM_DPD   0xB9  /*!< 进入深度睡眠模式 */

/*RDSR(读状态寄存器 8bits)*/
#define EEPROM_WIP_RDY         0x00  /*!< no write is in progress 只读*/
#define EEPROM_WIP_BUSY        0x01  /*!< busy with a write operation 只读*/
#define EEPROM_WEL_EN          0x02  /*!< the latch allows writes to the array只读 */
#define EEPROM_WEL_DIS         0x00  /*!< the latch prohibits writes to the array 只读*/
#define EEPROM_BP00            0x00  /*没有被保护的阵列*/
#define EEPROM_BP01            0x04  /*被保护的阵列高1/4地址(扇区3)*/
#define EEPROM_BP10            0x08  /*被保护的阵列高1/2地址(扇区2,3)*/
#define EEPROM_BP11            0x0C  /*被保护的阵列全部扇区(扇区0,1,2,3)*/
#define EEPROM_WPEN            0x80  /*写保护*/


#define EEPROM_PAGESIZE        256   /*!< Pagesize according to documentation :256Byte*/
/*25LC1024:1Mbit= 1024Kbit =128KB  = 512*256B = 131072 X8bit
第1页地址:  00000H-000FFH  长度256B
                  0-255
第2页地址:  00100H-001FFH  长度256B
                256-511
第3页地址:  00200H-002FFH  长度256B
                512-1278
第4页地址:  00300H-003FFH  长度256B
`
`
`
第510页地址:1FD00H-1FDFFH  长度256B
第511页地址:1FE00H-1FEFFH  长度256B
第512页地址:1FF00H-1FFFFH  长度256B
*/


#define EEPROM_CS_HIGH()    HAL_GPIO_WritePin(EEPROM_CS_GPIO_Port, EEPROM_CS_Pin, GPIO_PIN_SET)
#define EEPROM_CS_LOW()     HAL_GPIO_WritePin(EEPROM_CS_GPIO_Port, EEPROM_CS_Pin, GPIO_PIN_RESET)

/**
 * @brief EEPROM Operations statuses
 */
typedef enum {
   
    EEPROM_STATUS_PENDING,
    EEPROM_STATUS_COMPLETE,
    EEPROM_STATUS_ERROR
} EEPROMStatus;

void EEPROM_SPI_INIT(SPI_HandleTypeDef * hspi);//初始化函数
uint8_t EEPROM_SPI_WaitStandbyState(void);//等待操作完成函数
//在指定地址开始读取指定长度的数据
EEPROMStatus EEPROM_SPI_ReadBuffer (uint8_t* pBuffer, uint32_t ReadAddr,  uint16_t NumByteToRead);

//写入一个字节数据,未实现类似EEPROM_SendByte()
EEPROMStatus EEPROM_SPI_WriteByte  (uint8_t* pBuffer, uint32_t WriteAddr);
//在指定地址开始写入指定长度的数据
EEPROMStatus EEPROM_SPI_WriteBuffer(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);
//在指定地址开始写入不大于整页数据
EEPROMStatus EEPROM_SPI_WritePage  (uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);



/* Low layer functions 底层操作函数*/
uint8_t EEPROM_SendByte(uint8_t byte);//发送一个字节,返回一个字节

void EEPROM_WriteEnable(void);//写使能
void EEPROM_WriteDisable(void);//写失能

void    EEPROM_WriteStatusRegister(uint8_t regval);//写状态寄存器
uint8_t EEPROM_ReadStatusRegister (void);          //读状态寄存器

void EEPROM_SPI_SendInstruction(uint8_t *instruction, uint8_t size);//发送操作命令和数据地址


//个性化函数
void EEPROM_PAGE_ERASE  (uint32_t WriteAddr);//指定地址页擦除,未实现
void EEPROM_SECTOR_ERASE(uint32_t WriteAddr);//指定地址扇区擦除,未实现
/*25LC1024:1Mbit= 1024Kbit=128KB =4*32KB(32K Byte/sector)
第0扇区地址:00000H-07FFFH
第1扇区地址:08000H-0FFFFH
第2扇区地址:10000H-17FFFH
第3扇区地址:18000H-1FFFFH

*/

void EEPROM_CHIP_ERASE(void);//全片擦除
void EEPROM_PowerDown(void);//进入掉电模式
uint8_t EEPROM_ReadID(uint32_t WriteAddr);//读取电子签名ID,24bits的虚拟地址,返回0X29H
void EEPROM_WakeUP(void);//唤醒指令


#ifdef __cplusplus
}
#endif

#endif

/* ----------------------- System incldues ----------------------------------*/
#include "stm32f1xx_hal.h"
 
 
/*----------------------- 25LC1024 incldues ----------------------------------*/
#include "eeprom_spi.h"
#include "spi.h"

/* Private typedef -----------------------------------------------------------*/

//#define * EEPROM_SPI = hspi3

/* Private variables ---------------------------------------------------------*/

SPI_HandleTypeDef * EEPROM_SPI;//定义25LC1024的SPI指针句柄

/**
 * 初始化EEPROM通讯SPI
 * @brief Init EEPROM SPI
 *
 * @param hspi Pointer to SPI struct handler
 */
void EEPROM_SPI_INIT(SPI_HandleTypeDef * hspi)
{
   
    EEPROM_SPI = hspi;
  • 2
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: STM32是一款非常流行的微控制器,而Microchip 25LC640是一种串行EEPROM存储器。驱动Microchip 25LC640需要使用STM32提供的SPI接口,通过该接口进行数据传输。以下是一些步骤: 1. 配置GPIO口 在使用SPI接口时需要配置相应的GPIO口。需要配置SCK、MISO和MOSI口,以便进行数据传输。 2. 配置SPI接口 SPI接口需要设置数据位长度、CPOL、CPHA、主从模式等参数。需要根据手册对SPI进行配置。 3. 写入数据 写入数据时需要设置写片选、写使能位、地址和数据等信息。具体的写入流程需要参考Microchip 25LC640的手册和数据表。 4. 读取数据 读取数据时需要设置读片选、读使能位、地址和数据长度等信息。读取流程与写入类似,需要参考手册和数据表。 总之,在驱动Microchip 25LC640时需要熟练掌握STM32提供的SPI接口,同时仔细阅读Microchip 25LC640的手册和数据表,按照要求进行配置和操作。 ### 回答2: 要驱动microchip 25lc640芯片,需要使用stm32单片机,并编写相应的程序。以下是实现该功能的基本步骤。 1.配置SPI接口:由于25lc640是SPI接口的芯片,因此需要在stm32中配置SPI接口。要配置SPI,需要设置SPI的时钟速率、数据位数、工作模式等参数。 2.写数据到芯片:要写数据到25lc640芯片,需要选择写入地址,并将要写入的数据通过SPI接口发送到芯片。在发送数据之前,必须先将SPI接口从空闲状态转换为传输状态,同时注意控制CS信号的电平。 3.读取芯片数据:在读取25lc640芯片中的数据时,需要先选择要读取的地址,并通过SPI接口向芯片发送读取命令。芯片会将存储在该地址的数据发送回来,随后可以通过SPI接口将数据读取到stm32中。 4.编写完整程序:以上步骤是实现25lc640驱动的基本步骤,需要将它们整合到一个完整的程序中。在编写程序时,需要注意控制SPI接口的状态,选择正确的读取和写入地址,以及合理处理芯片返回的数据。最终,应该可以通过stm32来完整驱动25lc640芯片,实现数据的读取和写入。 ### 回答3: STM32是一款微控制器芯片,适配了多种通用外设接口和主流现代通信协议,操作简便,使用灵活,被广泛运用于各种智能设备和嵌入式系统中。Microchip 25LC640是一款串行EEPROM存储器,它以SPI接口进行数据传输。下面的问题将讲述STM32如何驱动Microchip 25LC640程序。 首先,应确定STM32的硬件连接和电路连通性,并确认使用的SPI总线协议参数,如时钟速率、数据位宽等等。要注意的是Microchip 25LC640需要提供断电恢复保护,因此还需要配置STM32的电源管理,保证存储器内的数据在掉电之后不会丢失。 然后,可以通过STM32SPI库文件的配置,将SPI接口参数和CS片选等配置完成。然后使用STM32 MCU芯片来控制Microchip 25LC640进行读写,可以使用HAL库函数或者直接在库函数的基础上进行代码编写来进行控制实现。 在写数据时,需要先发送写启动命令,然后输入要写的数据,等待写操作完成即可,要注意数据的选择顺序与字节数相对应。在读数据时,先发送读启动命令,在读到数据之前,需要发送一个空操作(NOP)来启动数据输出,并且在数据读取完毕之后需要发送一个停止命令。 总的来说,STM32是一个功能强大的MCU芯片,它可以轻松驱动Microchip 25LC640,通过SPI接口实现数据的可靠读写,为智能设备和嵌入式系统提供更加可靠的内存扩展实现方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值