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
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值