蓝牙技术
直播中

何夏庄

8年用户 1057经验值
私信 关注
[问答]

如何增加CYBLE-416045-02的EEPROM?

我正在使用 CYBLE-416045-02 开发产品,但似乎最大模拟 EEPROM 是 32kBytes。
有没有办法进一步增加 EEPROM,因为我需要它来存储记录的数据。

回帖(1)

刘静

2025-7-3 18:20:02

要增加CYBLE-416045-02的EEPROM存储空间,有几种有效方法。该芯片的内部模拟EEPROM确实限制在32kB,但可通过以下方案扩展存储容量:




方案1:使用外部EEPROM芯片(推荐)


优点:直接扩展容量、简单可靠

适用场景:需存储超过32kB的日志数据

操作步骤



  1. 选择芯片

    • I²C接口:Microchip的24LC系列(如24LC512,64KB)、AT24C系列

    • SPI接口:25LC系列(如25LC1024,128KB)


  2. 硬件连接

    • I²C示例(接PSoC4的SCL/SDA引脚):
      CYBLE-416045-02   →   24LC512
      ---------------------------------
      SCL (P3.0)        →   SCL
      SDA (P3.1)        →   SDA
      VCC (3.3V)        →   VCC
      GND               →   GND
      A0/A1/A2          →   GND(设置I²C地址为0x50)
      WP                →   GND(禁用写保护)



  3. 软件驱动


    #include "project.h"
    #define EEPROM_ADDR 0x50 // I²C地址

    void EEPROM_Write(uint16_t addr, uint8_t data) {
       uint8_t buffer[3];
       buffer[0] = (addr >> 8) & 0xFF; // 高地址位
       buffer[1] = addr & 0xFF;        // 低地址位
       buffer[2] = data;
       I2C_MasterWriteBuffer(buffer, 3, EEPROM_ADDR);
    }

    uint8_t EEPROM_Read(uint16_t addr) {
       uint8_t addr_bytes[2] = { (addr >> 8) & 0xFF, addr & 0xFF };
       uint8_t data;
       I2C_MasterWriteBuffer(addr_bytes, 2, EEPROM_ADDR); // 发送地址
       I2C_MasterReadBuffer(&data, 1, EEPROM_ADDR);      // 读取数据
       return data;
    }

    注意:需处理I²C状态机和延时(EEPROM写入周期约5ms)。






方案2:使用外部SPI Flash


优点:容量大(可达数MB)、成本低

适用场景:大数据量日志存储

操作步骤



  1. 选择芯片:Winbond W25Q系列(如W25Q128,16MB)

  2. 硬件连接
    CYBLE-416045-02   →   W25Q128
    ------------------------------
    MOSI (P2.0)       →   DI
    MISO (P2.1)       →   DO
    SCK (P2.2)        →   CLK
    CS (P2.3)         →   CS
    VCC/GND           →   VCC/GND

  3. 软件实现

    • 使用PSoC Creator的SPI组件驱动

    • 实现擦除(扇区/块级)、写入、读取函数

    • 建议添加磨损均衡算法(延长Flash寿命)





方案3:利用内部未使用Flash


优点:无需外部硬件

注意事项



  • 写入慢(需擦除整个扇区)

  • 寿命较低(约10万次 vs EEPROM的百万次)

  • 需保留空间避免覆盖代码


实现代码


#include "flash.h"

#define FLASH_ADDR 0x0F000 // 用户Flash区域末段地址(检查Datasheet)

void Flash_Write(uint32_t addr, uint8_t *data, uint16_t len) {
    CySysFlashWriteRow(addr, (uint8_t *)data); // 需对齐行地址(256字节)
}

void Flash_Read(uint32_t addr, uint8_t *buf, uint16_t len) {
    memcpy(buf, (void*)addr, len);
}



优化建议




  1. 数据压缩

    对日志数据使用算法(如LZ4、Delta+RLE编码)减少存储占用。


    // 示例:简单差分压缩
    int16_t prev_value = 0;
    int16_t delta = current_value - prev_value;
    EEPROM_Write(addr, (uint8_t*)&delta, 2);



  2. 数据分段

    循环覆盖最旧数据,实现"环形缓冲区"机制。




  3. 降低采样率

    评估业务需求,调整日志采集频率。






关键步骤总结































方法 容量扩展 实现复杂度 成本
外部EEPROM ★★☆ (64-512KB) ★☆☆
外部SPI Flash ★★★ (MB级) ★★☆
内部Flash模拟 ☆☆☆ (~32KB+) ★★★

推荐路径



  1. 优先尝试外部EEPROM

  2. 若容量需求极大(>1MB),改用SPI Flash

  3. 对成本极度敏感时,优化数据策略 + 内部Flash扩展



注意:使用外部存储时,考虑添加硬件写保护电路,防止数据意外丢失。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分