当前位置: 首页 > news >正文

GT25C16的eeprom芯片使用

GT25C16的eeprom芯片使用

EEPROM
相关配置信息

在使用时需要置高WP和HOLD,
image

WP : 拉低进入写保护

HOLD :拉低挂起芯片,忽略总线上通信内容

状态寄存器

image
当RDY=0时,设备已准备好接收指令。

当RDY=1时,设备正忙。由于繁忙,设备只接受读取状态寄存器命令

WEN : 这表示设备的写保护状态。当WEN=0时,无论WPEN、WP引脚或块保护的设置如何,都不能修改状态寄存器和整个阵列。写入启用命令(WREN)可用于将WEN设置为1。在加电阶段,WEN重置为0。
WREN命令为写使能

BP0 BP1 为写保护块,可通过
image
选择是否保护所选区域,内部地址为 0x000 - 0x7FF

WPEN可与WP硬件引脚一起启用写保护,注意 内存阵列不受此模式的保护。硬件写保护要求设置WP=0和WPEN=1。否则,它将被禁用。如果WP已设置为低,则WPEN不能从1更改为0。
image
图为写保护控制
image
使用时可以直接接高电平,默认不保护,此时WPEN不起作用,由WEN控制

控制寄存器

image
依次
写使能
写失能
读状态寄存器
写状态寄存器
读数据
写数据

具体使用

设置控制寄存器

#define SPI_READ           0x03
#define SPI_WRITE          0x02
#define EEP_WREN           0x06
#define EEP_WRDI           0x04
#define SPI_READ_STATUS    0x05
#define SPI_WRITE_STATUS   0x01

e2读状态寄存器

static uint8_t EEPROM_Read_Status(void)
{uint8_t EEPROM_25LC160_CMD;uint8_t EEPROM_25LC160_Data;EEPROM_CS_ENABLE;           /* CS as low */EEPROM_25LC160_CMD = SPI_READ_STATUS;SPI_Send(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);SPI_Receive_Process(SPI0_SFR, &EEPROM_25LC160_Data);EEPROM_CS_DISABLE;          /* CS as high */EEPROM_25LC160_Data &= 0x0F;return EEPROM_25LC160_Data;
}

设置保护

void EEP_set_array_protection(EEPROM_Protect_E data)
{/* 0x00 non protection *//* 0x04 upper 1/4 (180h - 1ffh) protection *//* 0x08 upper 1/2 (100h - 1ffh) protection *//* 0x0C all (000h - 1ffh) protection */uint8_t EEPROM_25LC160_CMD;Check_EEPROM_Busy();     EEPROM_CS_ENABLE;  /* CS as low */EEPROM_25LC160_CMD = EEP_WREN;  /* Write WEL */SPI_Send(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);EEPROM_CS_DISABLE; /* CS as high */delay_us(4U);EEPROM_CS_ENABLE;   /* CS as low */EEPROM_25LC160_CMD = SPI_WRITE_STATUS;SPI_Send(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);EEPROM_25LC160_CMD = (uint8_t)(data);SPI_Send(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);EEPROM_CS_DISABLE;  /* CS as high */
}

主机发送 1字节

//使用轮询方式,在头次发送之后等待发送完成标志和是否繁忙void SPI_Send_Process(SPI_SFRmap *SPIx, uint8_t *Databuf, uint8_t DataLength)
{uint8_t Databuf_Index = 0U;/* 轮询发送数据 */while (Databuf_Index < DataLength){SPI_I2S_SendData8(SPIx, Databuf[Databuf_Index]);   /* 发送数据 */while (SET == SPI_Get_Transmit_Buf_Flag(SPIx)){;/* Waiting for the sending buffer to be empty */}while (SET == SPI_Get_BUSY_Flag(SPIx)){;/* 等待SPI数据发送完成 */}Databuf_Index++;}
}

主机接收 1字节

static void SPI_Receive_Process(SPI_SFRmap *SPIx, uint8_t *Databuf)
{SPI_I2S_SendData8(SPI0_SFR, 0xFF);  /* 产生接收SCK */while (RESET == SPI_Get_Receive_Buf_Flag(SPI0_SFR)){ /* 等待SPI0接收BUFFER不为空 */; }*Databuf = (uint8_t)SPI_I2S_ReceiveData(SPI0_SFR);
}

发送接收函数

SPI_I2S_SendData8(SPI, data)
{SPI->address = data;
}uint8_t SPI_I2S_ReceiveData(SPI)
{
uint8_t data;data = SPI->address;
return data;
}

等待是否忙碌,状态寄存器0位

void Check_EEPROM_Busy(void)
{/* WIP(Write-In-Process),若为1则表示写入正在进行,反之则没有写入正在进行 */while (EEPROM_Read_Status()&0x01){;}
}

写数据

void SPI_Write_EEPROM_Process(uint16_t Address, uint8_t *Data, uint16_t Length)
{uint8_t Cycle_Times = 0U;uint16_t Data_Length = Length;uint8_t Address_Offset = 0U;uint8_t EEPROM_25LC160_CMD;uint16_t EEPROM_Address = Address;/* INT_All_Enable(FALSE); */  /* 禁止所有全局可屏蔽中断使能位 */while ((Data_Length > 0U)&&(EEPROM_Address < 0x0800U)){Address_Offset = (16U - (EEPROM_Address % 16U));if (Data_Length > Address_Offset){Cycle_Times = Address_Offset;}else{ Cycle_Times = Data_Length; }Check_EEPROM_Busy();EEPROM_CS_ENABLE;  /* CS as low */EEPROM_25LC160_CMD = EEP_WREN;  /* Write WEL */SPI_Send_Process(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);EEPROM_CS_DISABLE; /* CS as high */EEPROM_CS_ENABLE;  /* CS as low */EEPROM_25LC160_CMD = SPI_WRITE;SPI_Send_Process(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);/* 发送地址高8位 */EEPROM_25LC160_CMD = (uint8_t)(EEPROM_Address >> 8U);SPI_Send_Process(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);/* 发送地址低8位 */EEPROM_25LC160_CMD = (uint8_t)EEPROM_Address;SPI_Send_Process(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);while ((Cycle_Times > 0U)&&(Data_Length > 0U)&&(EEPROM_Address < 0x0800U)){SPI_Send_Process(SPI0_SFR, Data, 1U);Data++; Cycle_Times--; Data_Length--; EEPROM_Address++;}EEPROM_CS_DISABLE; /* CS as high */}/* INT_All_Enable(TRUE); */   /* 启用所有全局可屏蔽中断使能位 */
}

读数据

void SPI_Read_EEPROM_Process(uint16_t Address, uint8_t *Data, uint16_t Length)
{uint8_t EEPROM_25LC160_CMD;/* INT_All_Enable(FALSE); */  /* 禁止所有全局可屏蔽中断使能位 */Check_EEPROM_Busy();EEPROM_CS_ENABLE;  /* CS as low */EEPROM_25LC160_CMD = SPI_READ;SPI_Send_Process(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);/* 发送地址高8位 */EEPROM_25LC160_CMD = (uint8_t)(Address >> 8U);SPI_Send_Process(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);/* 发送地址低8位 */EEPROM_25LC160_CMD = (uint8_t)Address;SPI_Send_Process(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);while (Length > 0U){SPI_Receive_Process(SPI0_SFR, Data);Data++; Length--;}EEPROM_CS_DISABLE; /* CS as high *//* INT_All_Enable(TRUE); */   /* 启用所有全局可屏蔽中断使能位 */
}