找回密码
 立即注册
首页 业界区 安全 GT25C16的eeprom芯片使用

GT25C16的eeprom芯片使用

府扔影 5 天前
EEPROM
相关配置信息
在使用时需要置高WP和HOLD,
1.png

WP : 拉低进入写保护
HOLD :拉低挂起芯片,忽略总线上通信内容
状态寄存器

2.png

当RDY=0时,设备已准备好接收指令。
当RDY=1时,设备正忙。由于繁忙,设备只接受读取状态寄存器命令
WEN : 这表示设备的写保护状态。当WEN=0时,无论WPEN、WP引脚或块保护的设置如何,都不能修改状态寄存器和整个阵列。写入启用命令(WREN)可用于将WEN设置为1。在加电阶段,WEN重置为0。
WREN命令为写使能
BP0 BP1 为写保护块,可通过
3.png

选择是否保护所选区域,内部地址为 0x000 - 0x7FF
WPEN可与WP硬件引脚一起启用写保护,注意 内存阵列不受此模式的保护。硬件写保护要求设置WP=0和WPEN=1。否则,它将被禁用。如果WP已设置为低,则WPEN不能从1更改为0。
4.png

图为写保护控制
5.png

使用时可以直接接高电平,默认不保护,此时WPEN不起作用,由WEN控制
控制寄存器

6.png

依次
写使能
写失能
读状态寄存器
写状态寄存器
读数据
写数据
具体使用

设置控制寄存器
  1. #define SPI_READ           0x03
  2. #define SPI_WRITE          0x02
  3. #define EEP_WREN           0x06
  4. #define EEP_WRDI           0x04
  5. #define SPI_READ_STATUS    0x05
  6. #define SPI_WRITE_STATUS   0x01
复制代码
e2读状态寄存器
  1. static uint8_t EEPROM_Read_Status(void)
  2. {
  3.     uint8_t EEPROM_25LC160_CMD;
  4.     uint8_t EEPROM_25LC160_Data;
  5.     EEPROM_CS_ENABLE;           /* CS as low */
  6.     EEPROM_25LC160_CMD = SPI_READ_STATUS;
  7.     SPI_Send(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);
  8.     SPI_Receive_Process(SPI0_SFR, &EEPROM_25LC160_Data);
  9.     EEPROM_CS_DISABLE;          /* CS as high */
  10.     EEPROM_25LC160_Data &= 0x0F;
  11.     return EEPROM_25LC160_Data;
  12. }
复制代码
设置保护
  1. void EEP_set_array_protection(EEPROM_Protect_E data)
  2. {
  3.     /* 0x00 non protection */
  4.     /* 0x04 upper 1/4 (180h - 1ffh) protection */
  5.     /* 0x08 upper 1/2 (100h - 1ffh) protection */
  6.     /* 0x0C all (000h - 1ffh) protection */
  7.     uint8_t EEPROM_25LC160_CMD;
  8.     Check_EEPROM_Busy();     
  9.     EEPROM_CS_ENABLE;  /* CS as low */
  10.     EEPROM_25LC160_CMD = EEP_WREN;  /* Write WEL */
  11.     SPI_Send(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);
  12.     EEPROM_CS_DISABLE; /* CS as high */
  13.     delay_us(4U);
  14.     EEPROM_CS_ENABLE;   /* CS as low */
  15.     EEPROM_25LC160_CMD = SPI_WRITE_STATUS;
  16.     SPI_Send(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);
  17.     EEPROM_25LC160_CMD = (uint8_t)(data);
  18.     SPI_Send(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);
  19.     EEPROM_CS_DISABLE;  /* CS as high */
  20. }
复制代码
主机发送 1字节
  1. //使用轮询方式,在头次发送之后等待发送完成标志和是否繁忙
  2. void SPI_Send_Process(SPI_SFRmap *SPIx, uint8_t *Databuf, uint8_t DataLength)
  3. {
  4.     uint8_t Databuf_Index = 0U;
  5.     /* 轮询发送数据 */
  6.     while (Databuf_Index < DataLength)
  7.     {
  8.         SPI_I2S_SendData8(SPIx, Databuf[Databuf_Index]);   /* 发送数据 */
  9.         while (SET == SPI_Get_Transmit_Buf_Flag(SPIx))
  10.         {
  11.             ;/* Waiting for the sending buffer to be empty */
  12.         }
  13.         while (SET == SPI_Get_BUSY_Flag(SPIx))
  14.         {
  15.             ;/* 等待SPI数据发送完成 */
  16.         }
  17.         Databuf_Index++;
  18.     }
  19. }
复制代码
主机接收 1字节
  1. static void SPI_Receive_Process(SPI_SFRmap *SPIx, uint8_t *Databuf)
  2. {
  3.     SPI_I2S_SendData8(SPI0_SFR, 0xFF);  /* 产生接收SCK */
  4.     while (RESET == SPI_Get_Receive_Buf_Flag(SPI0_SFR))
  5.     { /* 等待SPI0接收BUFFER不为空 */; }
  6.     *Databuf = (uint8_t)SPI_I2S_ReceiveData(SPI0_SFR);
  7. }
复制代码
发送接收函数
  1. SPI_I2S_SendData8(SPI, data)
  2. {
  3.   SPI->address = data;
  4. }
  5. uint8_t SPI_I2S_ReceiveData(SPI)
  6. {
  7. uint8_t data;
  8.   data = SPI->address;
  9. return data;
  10. }
复制代码
等待是否忙碌,状态寄存器0位
  1. void Check_EEPROM_Busy(void)
  2. {
  3.     /* WIP(Write-In-Process),若为1则表示写入正在进行,反之则没有写入正在进行 */
  4.     while (EEPROM_Read_Status()&0x01)
  5.     {
  6.         ;
  7.     }
  8. }
复制代码
写数据
  1. void SPI_Write_EEPROM_Process(uint16_t Address, uint8_t *Data, uint16_t Length)
  2. {
  3.     uint8_t Cycle_Times = 0U;
  4.     uint16_t Data_Length = Length;
  5.     uint8_t Address_Offset = 0U;
  6.     uint8_t EEPROM_25LC160_CMD;
  7.     uint16_t EEPROM_Address = Address;
  8.     /* INT_All_Enable(FALSE); */  /* 禁止所有全局可屏蔽中断使能位 */
  9.     while ((Data_Length > 0U)&&(EEPROM_Address < 0x0800U))
  10.     {
  11.         Address_Offset = (16U - (EEPROM_Address % 16U));
  12.         if (Data_Length > Address_Offset)
  13.         {
  14.             Cycle_Times = Address_Offset;
  15.         }else{ Cycle_Times = Data_Length; }
  16.         Check_EEPROM_Busy();
  17.         EEPROM_CS_ENABLE;  /* CS as low */
  18.         EEPROM_25LC160_CMD = EEP_WREN;  /* Write WEL */
  19.         SPI_Send_Process(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);
  20.         EEPROM_CS_DISABLE; /* CS as high */
  21.         EEPROM_CS_ENABLE;  /* CS as low */
  22.         EEPROM_25LC160_CMD = SPI_WRITE;
  23.         SPI_Send_Process(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);
  24.         /* 发送地址高8位 */
  25.         EEPROM_25LC160_CMD = (uint8_t)(EEPROM_Address >> 8U);
  26.         SPI_Send_Process(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);
  27.         /* 发送地址低8位 */
  28.         EEPROM_25LC160_CMD = (uint8_t)EEPROM_Address;
  29.         SPI_Send_Process(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);
  30.         while ((Cycle_Times > 0U)&&(Data_Length > 0U)&&(EEPROM_Address < 0x0800U))
  31.         {
  32.             SPI_Send_Process(SPI0_SFR, Data, 1U);
  33.             Data++; Cycle_Times--; Data_Length--; EEPROM_Address++;
  34.         }
  35.         EEPROM_CS_DISABLE; /* CS as high */
  36.     }
  37.     /* INT_All_Enable(TRUE); */   /* 启用所有全局可屏蔽中断使能位 */
  38. }
复制代码
读数据
  1. void SPI_Read_EEPROM_Process(uint16_t Address, uint8_t *Data, uint16_t Length)
  2. {
  3.     uint8_t EEPROM_25LC160_CMD;
  4.     /* INT_All_Enable(FALSE); */  /* 禁止所有全局可屏蔽中断使能位 */
  5.     Check_EEPROM_Busy();
  6.     EEPROM_CS_ENABLE;  /* CS as low */
  7.     EEPROM_25LC160_CMD = SPI_READ;
  8.     SPI_Send_Process(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);
  9.     /* 发送地址高8位 */
  10.     EEPROM_25LC160_CMD = (uint8_t)(Address >> 8U);
  11.     SPI_Send_Process(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);
  12.     /* 发送地址低8位 */
  13.     EEPROM_25LC160_CMD = (uint8_t)Address;
  14.     SPI_Send_Process(SPI0_SFR, &EEPROM_25LC160_CMD, 1U);
  15.     while (Length > 0U)
  16.     {
  17.         SPI_Receive_Process(SPI0_SFR, Data);
  18.         Data++; Length--;
  19.     }
  20.     EEPROM_CS_DISABLE; /* CS as high */
  21.     /* INT_All_Enable(TRUE); */   /* 启用所有全局可屏蔽中断使能位 */
  22. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册