EEPROM

传统的I2C串行EEPROM采用基于硬件的写保护,只允许通过外部引脚锁定或解锁整个存储器阵列,从而严重限制了可实现的数据保护方式。为解决这一限制问题,24CS系列器件新增了16位配置寄存器,该寄存器允许将写保护特性配置为传统的硬件写保护或增强的软件写保护。

传统的硬件写保护采用写保护(WP)引脚,在WP引脚为“1”时,对整个存储器阵列进行写保护。顾名思义,传统的写保护模式作用与标准的I2C串行EEPROM相同。然而,当今的许多应用都可以从更灵活的数据保护管理中受益。对于这些应用,24CS提供了利用增强软件写保护的选项,可将存储器阵列分为八个区,每个区都可以单独设置为写保护。这种新增的灵活性允许24CS系列器件根据应用需要提供更细粒度的数据保护。

所需的写保护设置可通过配置寄存器进行设置,而配置寄存器可通过向特定器件地址和字地址发送命令的方式访问。如果需要,可锁定配置寄存器,这样可以将其设置为只读,且不能再进行修改,从而使当前的数据保护方案永久生效。本应用笔记用于演示如何在应用中利用16 位配置寄存器设置数据保护。

点击下载:《在24CS系列串行EEPROM中使用增强软件写保护功能》全文。

来源:Microchip

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 16

学单片机,串口、I²C、SPI等这些常用外设接口是必学的一项,相信很多读者都使用过类似AT24C0x这种使用I²C读写的EEPROM,在项目中,使用不当就容易导致数据丢失,或者异常的情况。

今天就来讲讲单片机I²C驱动EEPROM常见注意事项。

1、I²C读写EEPROM基础原理

市面上大部分使用I²C通信的EEPROM,控制时序和读写流程都基本相同。

I²C通信原理,说简单不简单,但说难也不难,主要理解基础原理和时序即可。

2、EEPROM底层驱动

真正实际做过项目的人都知道,好的底层驱动,会给上层应用开发带来很大便利,节省开发时间,以及减少bug发生率。

而大部分初学者,或者应届毕业生从事相关开发,一般很少考虑代码的移植性,复用性,或者说容错处理等问题。

下面,我简单列两点我在项目中,对EEPROM常用的几项操作。

1)写,再读,验证写入成功

这种方法很好理解:写入之后,再次读去这部分数据,进行一一匹配,验证是否与写入数据一致。

一般我是会重复操作3次,也就是说:写入,再读取,如果超过3次都还失败,那么我则放弃写入,认为写入失败,或芯片异常。

这个方法可以简单解决因异常导致写入失败的问题。

2)添加校验信息

在上面一层读验证基础上,对保存一些参数,我一般还会:在参数末尾添加类似“和校验”,或“CRC校验”。

假如你连续存储一个有10字节的参数(数据结构),如果因异常修改了中间某一个字节参数,你读出来进行校验,发现不对,则认为这个参数无效。

添加这个校验的目的相信从上面我举例已经明白,就是解决多字节参数中某个字节被恶意修改,导致这个参数无效的问题。

3)EEPROM在多任务中添加互斥锁

使用过操作系统的朋友都知道,多线程访问一个资源,一般都存在互斥的关系。简单的说:一个资源,在同一时刻,只能被一个线程操作。

那EEPROM举例:线程A在往EEPROM写10字节数据,刚6个字节时,线程B想要抢占,往EEPROM写入数据。你觉得线程A应不应该放弃I2C总线,让线程B写入呢?

答案肯定是不允许的,所以,就有了互斥锁这么一说。也就是等先占用I2C总线的线程操作完,才释放总线,让其他线程进行操作。

这三点应该是我比较常用了,网上还有其他一些相关的容错处理机制,感兴趣的不妨搜索一下。

我这里就不贴代码了,因芯片型号不同,应用不同,代码就存在差异。但我们目的:在保证满足应用的同时,需考虑代码的移植、复用、以及容错。

3、I²C选择硬件、软件?

我们代码应该使用硬件I2C?还是软件模拟I2C?

这个问题有许多朋友都在问,说句实话,遇到这类有争议的问题,一般来说,需要结合项目实际情况,比如速度、实时性、移植性等。

我遇到这类问题,一般会根据实际情况而定。比如:你的I2C产品要提供给一些不同平台用户,进行二次开发,我觉得软件IO模拟比较好,方便用户嘛。

假如你们公司开发的产品都使用STM32这家公司芯片开发I2C产品,我觉得,你代码可以使用硬件I2C。

来源:strongerHuang

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 35

新存储器兼备串行闪存的读取速度与EEPROM的字节级写操作灵活性,实现真正的两全其美

意法半导体的 Page EEPROM兼备EEPROM存储技术的能效和耐用性与闪存的存储容量和读写速度,为面临极端尺寸和功率限制的应用场景提供了一个混合存储器。

嵌入式系统需要支持日益复杂的先进功能,运行数据密集型的边缘 AI 算法,意法半导体的新存储器可以满足嵌入式应用对存储容量的日益增长的需求。例如,在耳背式助听器中,Page EEPROM可以降低物料清单成本,让助听器变得更纤薄,佩戴更舒适。

除了可穿戴设备外,Page EEPROM 还是医疗设备、资产追踪器、电动自行车以及其他工业和消费产品等应用的理想选择。意法半导体 EEPROM 产品线经理 Philippe Ganivet 表示:“智能边缘技术发展迅速,正在深刻改变市场对嵌入式存储器的容量、性能和功耗的需求。我们的新 Page EEPROM是一个非常好的超低功耗存储器,是电池供电的远程物联网模块微控制器的理想搭档。”

BitFlip Engineering公司是新系列存储器芯片的首批用户,该公司的业主 Patrick Kusbel表示:“ST的Page EEPROM是一个真正地实现了两全其美的的非易失性存储器解决方案,当我们在开发新一代旗舰系列产品时,包括 GPS 追踪器、物联网设备,以及其他的所有的需要高性能、高可靠性、小尺寸和低功耗的设计,新系列存储器让我们能够实现预设的大目标。M95P的读取速度是我们以前用的存储器的50 倍,而功耗却只有十分之一,产品可靠性提高了四倍,可擦写次数达到50万次,而我们以前用的产品的耐擦写能力只有10万次,这是一个颠覆性的改变。”

意法半导体Page EEPROM系列的容量分为8Mbit、16Mbit 和 32Mbit,大大高于标准 EEPROM产品的存储容量。嵌入式智能页面管理允许进行字节级写操作,适合数据记录等数据处理,同时还支持页面/扇区/块擦除和高达 512 字节的页面写操作,可以高效处理固件无线 (OTA) 更新需求。新系列存储器还允许进行缓存载入操作,同时向多个页面写入数据,以缩短在生产线上安装软件的时间。320 Mbit/s 的数据读取速度大约是标准 EEPROM 的16 倍,而 50万次耐擦写能力是传统串行闪存的几倍。

Page EEPROM还具有新颖的峰值电流控制功能,可最大限度地降低电源噪声,延长电池供电设备的续航时间。写入电流低于许多传统 EEPROM,并且还有深度断电模式和快速唤醒功能,可将工作电流降至 1µA 以下。

新系列产品的数据保存期长达100 年,并享受意法半导体10年产品寿命保障计划,保证该系列产品长期供货。

X-NUCLEO-PGEEZ1扩展板和 X-CUBE-EEPRMA1 软件包现已上市,供用户可学习如何与 Page EEPROM交互,如何使用该系列产品设计开发应用。在软件包中有一个展示如何测试该存储器的混合架构,快速构建概念验证的演示应用程序。

M95P08M95P16M95P32 Page EEPROM 现已投产。X-NUCLEO-PGEEZ1现已在意法半导体网站eSTore上架开售。

详情访问www.st.com/page-eeprom

关于意法半导体

意法半导体拥有5万名半导体技术的创造者和创新者,掌握半导体供应链和先进的制造设备。作为一家半导体垂直整合制造商(IDM),意法半导体与二十多万家客户、成千上万名合作伙伴一起研发产品和解决方案,共同构建生态系统,帮助他们更好地应对各种挑战和新机遇,满足世界对可持续发展的更高需求。意法半导体的技术让人们的出行更智能,让电源和能源管理更高效,让云连接的自主化设备应用更广泛。意法半导体承诺将于2027年实现碳中和(在范围1和2内完全实现碳中和,在范围3内部分实现碳中和)。详情请浏览意法半导体公司网站:www.st.com.cn

围观 13

实现代码:

https://gitee.com/synwit-co-ltd/EEPROM_Emulation 

工作原理

Flash 和 EEPROM 的主要区别在于可擦单元大小,EEPROM 可以字节擦写,而 Flash 只能块(扇区)擦除。这意味着如果在一个 Flash 扇区上存储多个参数时,扇区的擦除次数是该扇区上所有存储参数修改次数的总和,因此用作参数存储器时,Flash 相比 EEPROM 更容易写坏。

解决这个问题的方法是,不再将参数存储在 Flash 的固定地址,而是给每个参数分配一个唯一的数字用作虚拟地址,将参数写入 Flash 时同时将虚拟地址写入 Flash。

举例说明,执行如下的伪代码,将产生下图所示的存储效果:

1.jpg

2.jpg

注:上图中空格表示未写入,其值实为 0xFF

Flash 存储器被划分为 2 个字一组的存储单元,执行 EE_Write 时,将参数的值写入存储单元的前一个字,参数的虚拟地址写入存储单元的后一个字。

3.png

读取参数时,不再去固定的 Flash 地址读取,而是从存储页的尾部向前逐个存储单元读取,检查该单元中存储的虚拟地址是否等于 EE_Read 调用中指定的虚拟地址 EE_ADDR_Speed。若不等,则继续向前搜索;若相等,则说明找到了参数 Speed 在存储器中存储的最新设定值。

由于参数不必存储在 Flash 中的固定地址,因此不必每次修改参数的值时都擦除 Flash,而是只要 Flash 扇区未写满,就可以直接在后续空白地址写入参数的新值。这样将大幅减少 Flash 的擦除次数,降低 Flash 被写坏的风险。

页拷贝

当存储页写满时,可以将所有所有参数读入 RAM,擦除存储页,然后再将所有参数写入 Flash中。但若在此过程中发生掉电,就会导致所有参数丢失。

为解决这个问题,可以使用两个存储页,存储页的第一个存储单元存储该页的状态。如下图所示第一个存储页已满:

4.jpg

若此时执行 EE_Write(EE_ADDR_Speed, 0x1900),可将第二个存储页状态改为 Receiving,表示正在从 Active 页拷贝数据。然后将本次要写的数据写入。

5.jpg

接下来,搜索 Active 页中的所有存储参数,将每个参数的最新值拷贝到 Receiving 页中。等所有参数拷贝完成后,将第一个页擦除(页状态自动变为 Erased),最后将第二个页状态改为 Active。

6.jpg

后面,所有的参数读写操作均在第二页上即可。

这样操作,可以保证即使在过程中发生突然掉电,也不会损坏存储的参数值:

l 若在将第二页标记为 Receiving 时突然掉电,则只是丢失参数 Speed 的最新设定值,其他参数不受影响,读取参数 Speed 会读取到它的前一个设定值。

ll 若在第二页标记为 Receiving 之后,从 Active 页向 Receiving 页拷贝参数的过程中突然掉电,则下次上电后会发现同时存在 Active 页和 Receiving 页,重新执行参数拷贝即可。

lll 若在参数拷贝完,Active 页擦除后,Receiving 页还未被修改为 Active 时突然掉电,则下次上电后会发现有一个 Receiving 页,但没有 Active 页,只需要将 Receiving 页状态改为 Active 即可。

来源:华芯微特32位MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 43

Holtek A/D Flash MCU with EEPROM系列新增HT66F3184 / HT66F3194成员,分别为HT66F3185HT66F3195的精简版,能为客户提供多元化的产品规格选择。此产品非常适用于各式家电产品,例如:咖啡机、电热水壶、电茶炉、电饭煲、豆浆机等,亦适用于小体积产品,例如:智能型穿戴装置、锂电池保护板等。

1.jpg

HT66F3184/HT66F3194提供多样化的资源,包含4K×16 / 8K×16 Flash ROM、256×8 / 512×8 RAM、128×8 EEPROM、多功能Timer Module及12-bit ADC等。内建振荡器与ADC参考电压的精准度分别可达到8/12/16MHz±1%与1.2V±1%。HT66F3184封装提供16-pin NSOP、20-pin QFN、24-pin SSOP/QFN,HT66F3194封装则提供20-pin NSOP、24-pin SSOP/QFN,I/O引脚功能兼容于HT66F3185/HT66F3195同型封装。

来源:HOLTEK

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 5

概 述

在MCU的使用中,经常遇到需要存储参数或掉电保持数据等功能。其中,Flash和EEPROM是常见的非易失性存储器,都可以做到设备掉电重启后,数据还会保留。但二者有明显的区别:EEPROM可以被编程和电擦除,而且大多数的EEPROM可以被编程和电擦除,大多数串行EEPROM允许逐字节程序或擦除操作。与EEPROM相比,闪存具有更高的密度,这允许在芯片上实现更大的内存阵列(扇区)。通过对每个单元施加时间控制的电压来执行闪存擦除和写入周期。典型的Flash写时间是50µs/8位字;然而,EEPROM通常需要5到10 ms。EEPROM不需要进行页面(扇区)擦除操作,可以擦除一个需要指定时间的特定字节。与EEPROM相比,Flash具有更高的密度和更低的价格。

先楫产品可以外接大容量Flash芯片,支持可达256Mbyte程序或数据存储;部分产品如HPM6754、HPM6364、HPM6284内置4Mbyte Flash,HPM53XX系列全系支持1Mbyte Flash。在使用Flash模拟EEPROM时,最重要的挑战是满足Flash程序/擦除持久性和数据保留方面的可靠性目标。

其次,在应用程序的控制下,需要满足更新和读取数据的实时应用要求。请注意,在Flash擦写期间,它不能执行Flash应用程序,因为在此时间内不能执行在Flash中的程序,通常程序是将Flash擦写程序拷贝到RAM中执行。先楫半导体为了方便客户程序应用,已经将Flash驱动程序集成到ROM中,减少了系统对RAM的需求,用户使用时更加灵活方便。

由于Flash的块擦除要求,必须完全为模拟的EEPROM保留至少一个Flash扇区。例如,一个4K x 8bit大小的Flash扇区可以分为16页,每个页的大小为256 x 8bit。这使得每个页面相当于一个256 x 8字节的EEPROM。要保存的数据首先写入RAM中的缓冲区中,每个部分RAM可以模拟EEPROM的存储的数据。

如何实现?

根据Flash扇区和模拟的EEPROM的大小,划分相应的Flash和RAM空间。

功能:

• 读取片内或片外flash信息。

• 批量读取flash中数据到RAM缓存中。

• 用户可以自由读写RAM缓存中数据。

• 用户可以将RAM缓存中数据写入flash。

• 用户可以根据自己的需要定制存储空间大小和存储地址。

由于先楫半导体MCU已经集成了Flash驱动,用户可以不再需要把精力放到繁琐的底层Flash驱动部分。

为了实现此功能,需要8个函数来进行编程、读取和擦除,3个宏定义确定存储空间和位置。

/* Sector size */ 
#define SECTOR_SIZE (uint32_t) (0x1000)
 /* Sectors 0 and 1 base and end addresses */ 
#define Flash_base 0x80000000L 
#define SECTOR1_BASE_ADDRESS (Flash_base+0x3FE000) 
#define SECTOR1_END_ADDRESS  (SECTOR1_BASE_ADDRESS+SECTOR_SIZE*2-1)

其中,SECTOR_SIZE定义了flash扇区大小,单位是byte。若不确定flash扇区大小可以在Initial_EEProm函数中获取flash信息。Flash_base定义flash起始地址,具体可以参考user guider中系统内存映射 System Memory Map地址。SECTOR1_BASE_ADDRESS和SECTOR1_END_ADDRESS为数据存放起始地址,SECTOR1_BASE_ADDRESS必须是特定扇区起始地址。

ATTR_PLACE_AT_WITH_ALIGNMENT(".ahb_sram",8) uint8_t EEPROM_data[SECTOR1_END_ADDRESS-SECTOR1_BASE_ADDRESS+1];

Flash模拟EEPROM时需在RAM中开辟缓存用于常态数据读写,开辟数据时应注意RAM区数据应放到ahb_sram或noncacheable区域。

if defined(FLASH_XIP) && FLASH_XIP 
ATTR_RAMFUNC hpm_stat_t Initial_EEProm(void)
#else hpm_stat_t Initial_EEProm(void) 
#endif 
{ 
    xpi_nor_config_option_t option; 
    option.header.U = BOARD_APP_XPI_NOR_CFG_OPT_HDR; 
    option.option0.U = BOARD_APP_XPI_NOR_CFG_OPT_OPT0; 
    option.option1.U = BOARD_APP_XPI_NOR_CFG_OPT_OPT1; 
    hpm_stat_t status = rom_xpi_nor_auto_config(HPM_XPI0, &s_xpi_nor_config, &option); 
    if (status != status_success) 
    { 
        return status; 
    } 
    rom_xpi_nor_get_property(HPM_XPI0, &s_xpi_nor_config, xpi_nor_property_total_size, &flash_size); 
    rom_xpi_nor_get_property(HPM_XPI0, &s_xpi_nor_config, xpi_nor_property_sector_size, &sector_size); 
    rom_xpi_nor_get_property(HPM_XPI0, &s_xpi_nor_config, xpi_nor_property_page_size, &page_size); 
    printf("Flash Size:%dMBytes\nFlash Sector Size:%dKBytes\nFlash Page Size:%dBytes\n", flash_size / 1024U / 1024U, sector_size / 1024U, page_size); 
    EEProm_Flush(); 
} /* End  Initial_EEProm */

通过调用rom_xpi_nor_auto_config()、rom_xpi_nor_get_property()获取flash信息。

/******************************************************************************* * Routine:  EEPromFlush 
* Purpose:  Refresh data from flash to buffer.
 *******************************************************************************/ 
inline void EEProm_Flush(void) 
{ 
     memcpy((void*)EEPROM_data,(const void*)SECTOR1_BASE_ADDRESS,(SECTOR1_END_ADDRESS-SECTOR1_BASE_ADDRESS)); 
} /* End EEProm_Flush */

从flash中读取数据无需单独调用API函数,直接寻址读取效率更高,文中通过memcpy()函数直接从flash中读取数据到RAM缓存中,后面读写参数直接读写RAM缓存即可。

如果需要将参数写入flash中,需将整块flash擦写,由于数据已经存在RAM缓存,不会存在flash擦写时数据丢失的问题。

/******************************************************************************* * Routine:  writeEEProm_withflush 
* Purpose:  Writes variable to EEPROM and flush flash later. 
* Input  :  none 
* Output:    None. 
* Return:   Returns 0 
*******************************************************************************/ 
#if defined(FLASH_XIP) && FLASH_XIP 
ATTR_RAMFUNC hpm_stat_t writeEEProm_withflush(uint16_t index, uint8_t *data, uint16_t size) 
#else 
hpm_stat_t writeEEProm_withflush(uint16_t index, uint8_t *data, uint16_t size) 
#endif 
{ 
    hpm_stat_t status; 
    if(flash_size==0) return status_fail; 
    memcpy((void*)&EEPROM_data[index],(const void*)data,size); 
    status = rom_xpi_nor_erase(HPM_XPI0, xpi_xfer_channel_auto, &s_xpi_nor_config, SECTOR1_BASE_ADDRESS-Flash_base, SECTOR1_END_ADDRESS-SECTOR1_BASE_ADDRESS); 
    if (status != status_success) 
    { 
        return status; 
    } 
    status = rom_xpi_nor_program(HPM_XPI0, xpi_xfer_channel_auto, &s_xpi_nor_config, (const uint32_t *)EEPROM_data, SECTOR1_BASE_ADDRESS-Flash_base, SECTOR1_END_ADDRESS-SECTOR1_BASE_ADDRESS); 
    if (status != status_success) 
    { 
        return status; 
    } 
}

考虑到flash擦写期间不能读取flash,flash擦写函数需放置在RAM执行的程序存储空间。先楫SDK中已经定义好了ram运行区域,并在HPM_COMMON.H文件中将函数和数字放置属性重新封装,通过ATTR_RAMFUNC等效定义__attribute__((section(“.fast”)))。为确保擦写flash期间不会被中断打断从而调用其他flash中的程序,需在运行中关闭中断。

//disable all interrupt before programming flash 
CSR_reg = disable_global_irq(CSR_MSTATUS_MIE_MASK); 
disable_global_irq(CSR_MSTATUS_SIE_MASK); 
disable_global_irq(CSR_MSTATUS_UIE_MASK); 
writeEEProm_withflush(0,(uint8_t*)s_write_buf,0x1000);//update eeprom with flash 
//restore interrupt 
restore_global_irq(CSR_reg);

小 结

本文首先介绍了基于HPM6000系列芯片如何使用Flash模拟EEPROM存储参数。由于先楫SDK中已经提供了强大的驱动库,用户可以方便地通过Flash存储数据,降低成本和提高使用灵活性。

来源: 先楫半导体HPMicro

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 153

1、EEPROM 简介

EEPROM全称为EEPROM(Electrically Erasable Programmable Read Only Memory)是电可擦除可编程只读存储器。虽然名称为只读存储器,但是擦除和写入都是直接使用电路控制,不需要再使用外部设备来擦写,即设备在运行过程中即可随时擦除和写入。可以按字节为单位修改数据,无需整个芯片擦除,且掉电后数据不丢失,一般用来存储一些配置信息,以便系统重新上电的时候加载。

2、EPROM 操作说明

2.1  通讯方式

主要通讯方式有 I2C 和 SPI 协议,本文将介绍如何通过 I2C 来驱动EEPROM。

2.2  设备地址

如果仅接入一个AT24C02,可以将设备的A0、A1、A2引脚全部接入低电平,那么此时该设备的地址为0xA0。

1.png

2.3  I2C配置流程

开时钟,外设清零,参数配置,初始化,引脚配置,使能

2.png

2.4  写入数据

  • 写入一个字节:

MCU先向AT24C02写入一个地址,然后再写入数据。

  • 写入一页:

MCU先向AT24C02写入一个地址,然后再依次写入数据,注意AT24C02一页有8个字节,每页开始地址均是8的整数倍,一次页写入操作地址不能超过当前页的尾地址。

  • 连续写入:

AT24C02本身没有提供连续写入的操作,因此必须先将数据按页地址分为若干页,然后再依次调用页写入操作进行写入。

3.png

2.5  读出数据

  • 读取当前字节:

MCU直接发起读操作,设备返回当前字节,当前字节自动加1,该操作较少使用。

  • 读取指定地址一个字节:

MCU先向AT24C02写入一个地址,然后再发起一个读操作,AT24C02返回该地址存储的字节。

  • 连续读取:

MCU发起读当前字节,或者读指定地址字节,设备返回数据,MCU发送ACK,设备继续返回后续地址数据,直到MCU发送NACK,设备不再返回数据。

4.png

2.6  样例测试

初始化两个数组,配置I2C,调用写入和读取的函数操作EEPROM,通过串口打印观察结果。

5.png

运行实例

6.png

来源:灵动MM32MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 27

上海复旦微电子集团股份有限公司今日举办线上发布会,推出FM25/FM29系列SLC NAND,FM24N/FM24LN/FM25N高可靠、超宽压系列EEPROM,以及符合AEC-Q100的车规FM24C/FM25系列EEPROM等非挥发存储新产品。

1.jpg

FM25/FM29系列产品基于28nm先进NAND flash工艺,满足6万次擦写次数和数据保存10年的高可靠性要求,应用于工规、5G通讯、车载等相关领域。

FM24N/FM24LN/FM25N系列产品基于95nm先进EEPROM工艺,具备低功耗、超宽电压、高可靠等特性,其中擦写寿命大于400万次、数据保持时间大于200年,产品性能及可靠性达到业界领先水平,应用于CCM、白电、工控、仪表、医疗、5G通讯、车载等相关领域。其中FM24C/FM25系列车规产品已通过AEC-Q100 Grade 1车规级验证。

2.jpg

FM25/FM29系列SLC NAND存储器

发布会现场,复旦微电产品经理肖磊介绍,FM25/FM29系列是目前国内外首款单芯片同时支持双接口(SPI/PPI)双电源(1.8/3.3)的 SLC NAND Flash,产品开发团队针对28nm先进工艺平台特性,优化编擦、擦除、回读算法,采用内部8bit BCH ECC设计,兼顾成本、性能和可靠性,满足6万次擦写次数和数据保存10年的高可靠性要求。SPI系列(FM25)容量覆盖512Mb~4Gb,温度覆盖-40℃~+105℃。PPI系列为(FM29)容量覆盖2Gb~8Gb,温度覆盖-40℃~+105℃。

3.jpg

FM25S系列产品特点

  • 存储器容量:512Mb~4Gbit

  • 工作电压范围:1.8V/3.3V

  • 工作温度范围:

  • -40℃~+85℃ 以及-40℃~+105℃扩展级

  • SPI高速单/双/四口:104MHz(3.3V) / 85MHz(1.8V)

  • 支持内置8 bit ECC,满足客户Error-Free 需求

  • 高可靠性:

  • Endurance:6万擦写次数

  • Data Retention:10年

  • 封装支持TDFN5X6/TDFN6X8等多种封装形式

FM29F系列产品特点

  • 存储器容量:2Gb~8G bit

  • 工作电压范围:1.8V/3.3V

  • 工作温度范围:

  • -40℃~+85℃ 以及-40℃~+105℃扩展级

  • 兼容ONFI 1.0标准 50MHz(3.3V)/33MHz(1.8V)

  • 支持内置8 bit ECC,满足客户Error-Free 需求

  • 高可靠性

  • Endurance:6万擦写次数

  • Data Retention:10年

  • 封装支持BGA63/TSOP48等多种封装形式

4.png

下一阶段,复旦微电SLC NAND Flash存储器全系列产品将覆盖512Mbit~16Gbit容量, 其中2/4 Gbit SPI NAND Flash容量新品最高工作频率将扩展到120MHz(3.3V)/95MHz(1.8V)的High speed模式,16Gbit PPI NAND支持DDR高速接口,可满足客户更快读写访问速度需求。同时,全系产品会继续提升耐写性指标,满足客户高工规的应用。

FM24/FM25系列串行EEPROM存储器

本次复旦微电推出国内首款低功耗超宽电压FM24LN系列I2C串行EEPROM存储器、FM24N/25N宽电压高可靠I2C/SPI串行EEPROM,以及FM24C/FM25车规EEPROM三个系列的新产品。复旦微电产品经理周泉介绍道,产品开发团队针对流片工艺平台的特性,以及对存储器产品工作原理的深刻理解,对EEPROM存储器读写电路进行了特别的优化设计,大幅度提升了产品的性能及可靠性,为客户提供了更多的产品选择,可以满足CCM、白电、工控、仪表、医疗、5G通讯、车载等各种应用领域需求。FM24C/FM25系列车规产品已通过权威第三方测试认证机构——工业和信息化部电子第五研究所AEC-Q100 Grade 1车规级验证,产品工作温度扩展至-40℃~+125℃。

5.jpg

FM24LN系列 首发包含

32K/64K/128Kbit三种容量的I2C串行EEPROM,产品支持1.1V~5.5V超宽工作电压范围,温度覆盖工规-40℃~+85℃,全电压范围内均支持400KHz/1MHz工作频率,5.5V下典型待机电流小于1uA,读写电流不超过0.8mA,产品满足擦写寿命≥400万次、数据保持时间≥100年的高可靠性要求,支持WLCSP-4Ball、SOP8、TSSOP8、TDFN8等多种封装形式。 

FM24N系列 首发包含

64K/128K/256K/512Kbit四种容量的I2C串行EEPROM,产品支持1.7V~5.5V宽工作电压范围,温度覆盖工规-40℃~+85℃以及工规扩展温度-40℃~+125℃,支持400KHz/1MHz/ 3.4MHz工作频率,写电流≤2mA,读电流≤0.6mA,产品满足擦写寿命≥400万次、数据保持时间≥200年的高可靠性要求,支持SOP8、TSSOP8、TDFN8等多种封装形式
FM25N系列 首发包含

64K/128K/256K/512Kbit四款容量,产品支持1.7V~5.5V宽工作电压范围,温度覆盖工规 -40℃~+85℃ 以及工规扩展温度-40℃~+125℃ , 支持5M(VCC≥1.7V);10M(VCC≥2.5V); 20M(VCC≥4.5V)工作频率,写电流≤2mA,读电流≤5mA@5.5V/20MHz,产品满足擦写寿命≥400万次、数据保持时间≥200年的高可靠性要求,支持SOP8、TSSOP8、TDFN8等多种封装形式。 

FM24CXXX系列车规产品首发包含

128K/256K/512Kbit三款容量产品,产品通过了严苛的AEC-Q100 Grade1认证,产品支持1.7V~5.5V超宽工作电压范围,工作温度范围 -40℃~+125℃,支持400KHz/1MHz工作频率,写电流≤3mA,读电流≤1mA,产品满足擦写寿命≥100万次、数据保持时间≥40年的高可靠性要求,支持SOP8、TSSOP8、TDFN8等多种封装形式,产品湿敏等级为MSL1。 

FM25XXX系列车规产品 首发包含

64K/512Kbit两款容量产品,产品通过了严苛的AEC-Q100 Grade1认证,产品支持1.8V~5.5V超宽工作电压范围,工作温度范围-40℃~ +125℃ , 最高支持20MHz工作频率,写电流≤3mA,读电流≤5mA,产品满足擦写寿命≥100万次、数据保持时间≥40年的高可靠性要求,支持SOP8、TSSOP8、TDFN8等多种封装形式,产品湿敏等级为MSL1。

6.png

FM24LN32/64/128产品特点

  • 存储器容量:32K/64K/128Kbit

  • 工作电压范围:1.1V~5.5V

    工作温度范围:-40℃~+85℃

  • 全电压范围内兼容400KHz/1MHz时钟

  • 串行接口符合I²C规范

  • IO电压与芯片VCC相同,同时兼容1.2V/1.8V/3.3V/5V等主流电压应用。

  • 具有软件保护功能(SWP)

  • 具备器件地址可配置功能,支持I²C总线上最多挂8颗EEPROM

  • 输入脚经施密特触发器滤波抑制噪声

  • 具有字节写、页写、当前地址读、自由读、顺序读等操作模式

  • 擦写时间内部定时(max 5ms)

  • 128 bit 由厂家编写的、只读的唯一标识码,方便产品溯源

  • 额外的一页Security Sector安全区,用户可读写,可锁成只读。(客户可以把版本、物料、厂商代码等关键信息写入,方便产品管控及溯源)

  • 高可靠性:

    ·Endurance:400万擦写次数

    ·Data Retention:100年

  • 封装支持SOP8/TDFN/TSSOP/WLCSP等封装,其中WLCSP封装支持400um*400um及400um*500um Ball Pitch两种规格

FM24N64/128/256/512产品特点

  • 存储器容量:64K/128K/256K/512Kbit

  • 工作电压范围:1.7V~5.5V

  • 工作温度范围:

    -40℃~+85℃/-40℃~+125℃(扩展)

  • 支持400KHz/1MHz/3.4MHz时钟频率

  • 串行接口符合I²C规范

  • 内置ECC纠错逻辑

  • 支持硬件保护功能

  • 总线上最多支持8颗EEPROM寻址

  • 输入脚经施密特触发器滤波抑制噪声

  • 具有字节写、页写、当前地址读、自由读、顺序读等操作模式

  • 擦写时间内部定时(max 5ms)

  • 128 bit 由厂家编写的、只读的唯一标识码,方便产品溯源

  • 额外的一页Security Sector安全区,用户可读写,可锁成只读。(客户可以把版本、物料、厂商代码等关键信息写入,方便产品管控及溯源)

  • 高可靠性:

    ·Endurance:400万擦写次数

    ·Data Retention:200年

  • 封装支持SOP8/TDFN/TSSOP等封装

FM25N64/128/256/512产品特点

  • 存储器容量:64K/128K/256K/512Kbit

  • 工作电压范围:1.7V~5.5V

  • 工作温度范围

    -40℃~+85℃/-40℃~+125℃(扩展)

  • 工作频率5M(VCC≥1.7V);10M(VCC≥2.5V);20M(VCC≥4.5V)

  • 支持SPI Mode 0 (0,0)及Mode 3 (1,1)

  • 内置ECC纠错逻辑

  • 支持1/4空间、1/2空间、全空间写保护

  • 支持软、硬件写保护功能

  • 支持字节页及页写模式

  • 擦写时间内部定时(max 5ms)

  • 128 bit 由厂家编写的、只读的唯一标识码,方便产品溯源

  • 额外的一页Security Sector安全区,用户可读写,可锁成只读。(客户可以把版本、物料、厂商代码等关键信息写入,方便产品管控及溯源)

  • 高可靠性:

    ·Endurance:400万擦写次数

    ·Data Retention:200年

  • 封装支持SOP8/TDFN/TSSOP等封装

FM24C128EA1/FM24C256EA1/FM24C512DA1车规产品特点

  • 存储器容量:128K/256K/512Kbit

  • 符合AEC-Q100 Grade1

  • 工作电压范围:1.7V~5.5V

  • 工作温度范围:-40℃~+125℃

  • 支持400KHz/1MHz时钟频率

  • 串行接口符合I²C规范

  • 支持硬件保护功能

  • 总线上最多支持8颗EEPROM寻址

  • 输入脚经施密特触发器滤波抑制噪声

  • 具有字节写、页写、当前地址读、自由读、顺序读等操作模式

  • 擦写时间内部定时(max 5ms)

  • 128 bit 由厂家编写的、只读的唯一标识码,方便产品溯源

  • 额外的一页Security Sector安全区,用户可读写,可锁成只读。(客户可以把版本、物料、厂商代码等关键信息写入,方便产品管控及溯源)

  • 高可靠性:

    ·Endurance:100万擦写次数

    ·Data Retention:40年

  • 封装支持SOP8/TDFN/TSSOP等封装,湿敏等级:MSL1

FM25640A1/FM25512A1产品特点

  • 存储器容量:64K/512Kbit

  • 符合AEC-Q100 Grade1

  • 工作电压范围:1.8V~5.5V

  • 工作温度范围:-40℃~+125℃

  • 工作频率最高支持20MHz(FM25640A1)、16MHz(FM25512A1)

  • 支持SPI Mode 0 (0,0)及Mode 3 (1,1)

  • 支持1/4空间、1/2空间、全空间写保护

  • 支持软、硬件写保护功能

  • 支持字节页及页写模式

  • 擦写时间内部定时(max 5ms)

  • 128 bit 由厂家编写的、只读的唯一标识码,方便产品溯源

  • 额外的一页Security Sector安全区,用户可读写,可锁成只读。(客户可以把版本、物料、厂商代码等关键信息写入,方便产品管控及溯源)

  • 高可靠性:

    ·Endurance:100万擦写次数

    ·Data Retention:40年

  • 封装支持SOP8/TDFN/TSSOP等封装

下一阶段,复旦微电全新FM24LN、FM24N系列EEPROM存储器全系列产品将覆盖64Kbit~2Mbit容量,FM25N将补全64Kbit~4Mbit全系列容量。其中FM24N全系列新品最高工作频率将扩展到I2C总线规范的3.4MHz的High speed(HS Mode)模式,可满足客户更快读写访问速度需求。I2C、SPI接口EEPROM的全系列容量产品计划于年内完成AEC-Q100 Grade1车规级验证,本次发布EEPROM新品将陆续启动量产。

发布会最后,工业和信息化部电子第五研究所汽车电子行业经理王健分享了题为《车规“芯”形式下的质量保障》的主题演讲。王健表示,近几年来车规芯片快速发展,五所与客户开发并应用“5A+CA关键分析评价”质量工程体系,在研制转批量生产前有效识别、定位、改善解决潜在的设计、材料、结构、工艺等缺陷,提升成品率、可靠性、稳定性和一致性,提升企业品牌和竞争力。五所在与复旦微电的合作中,对存储芯片、MCU、安全与识别等一系列产品开展车规测试认证服务合作。未来,五所将持续和复旦微携手并进,砥砺前行。

基于本次发布的系列新品,复旦微电子还推出全系列车规级NAND/Nor Flash及EEPROM存储器,产品符合AEC-Q100 Grade1/Grade2需求。公司将持续在非易失存储器领域以新工艺节点、低压或宽压、高速、高可靠性(拓展工规、车规等)为发展方向,进一步尝试并拓展系统级存储器产品防线,不断获得突破和领先优势。

关于复旦微电

上海复旦微电子集团股份有限公司(“复旦微电”,上交所科创板证券代码: 688385.SH;“上海复旦”,港交所股份代号: 01385.HK)是国内从事超大规模集成电路的设计、开发、生产(测试)和提供系统解决方案的专业公司。公司于1998年7月创办,并于2000年在香港上市,2014年转香港主板,是国内成立最早、首家上市的股份制集成电路设计企业。2021年登陆上交所科创板,形成“A+H”资本格局。复旦微电子集团现已建立健全安全与识别芯片、非挥发存储器、智能电表芯片、FPGA芯片和集成电路测试服务等产品线。产品行销30多个国家和地区,广泛应用于金融、社保、汽车电子、城市公共交通、电子证照、移动支付、防伪溯源、智能手机、安防监控、工业控制、信号处理、智能计算等领域。

来源:复旦微电子集团

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 55

一、概述

CW32L083 内部集成 2 个 I2C 控制器,能按照设定的传输速率(标准,快速,高速)将需要发送的数据按照 I2C 规范串行发送到 I2C 总线上,或从总线上接收数据,并对通信过程中的状态进行检测,另外还支持多主机通信中的总线冲突和仲裁处理。

二、主要功能

• 支持主机发送 / 接收,从机发送 / 接收四种工作模式 

• 支持时钟延展 ( 时钟同步 ) 和多主机通信冲突仲裁

• 支持标准 (100Kbps)/ 快速 (400Kbps)/ 高速 (1Mbps) 三种工作速率 

• 支持 7bit 寻址功能 

• 支持 3个从机地址 

• 支持广播地址 

• 支持输入信号噪声过滤功能 

• 支持中断状态查询功能

1.协议介绍

I2C 总线使用两根信号线(数据线 SDA 和时钟线 SCL)在设备间传输数据。SCL 为单向时钟线,固定由主机驱动。SDA 为双向数据线,在数据传输过程中由收发两端分时驱动。I2C 总线上可以连接多个设备,所有设备在没有进行数据传输时都处于空闲状态(未寻址从机接收模式),任一设备都可以作为主机发送 START 起始信号来开始数据传输,在 STOP 停止信号出现在总线上之前,总线一直处于 被占用状态。I2C 通信采用主从结构,并由主机发起和结束通信。主机通过发送 START 起始信号来发起通信,之后发送 SLA+W/R 共 8bit 数据(其中,SLA 为 7bit 从机地址,W/R 为读写位),并在第 9个SCL 时钟释放 SDA 总线, 对应的从机在第 9个SCL 时钟占用 SDA 总线并输出 ACK 应答信号,完成从机寻址。此后根据主机发送的第 1 字 节的 W/R 位来决定数据通信的发端和收端,发端每发送 1个字节数据,收端必须回应 1个ACK 应答信号。数据传输完成后,主机发送 STOP 信号结束本次通信。

2.功能框图

I2C 模块主要包括时钟发生器、输入滤波器、地址比较器、协议控制逻辑、仲裁和同步逻辑、以及相关寄存器等。

1.png

CW32L083 支持用户灵活选择 GPIO 作为 I2C 通信引脚,如下表所示:

2.png

3.I2C中断

I2C 控制寄存器 I2Cx_CR 的 SI 位域为中断标志位。当 I2C 状态寄存器 I2Cx_STAT 的 STAT 位域值发生改变(变成 0xF8 除外)时,I2Cx_CR.SI 标志位就会被置位,同时产生中断请求。在用户 I2C 中断服务程序中,应查询 I2C 状态寄存器 I2Cx_STAT 的 STAT 位域值获取 I2C 总线的状态,以确定中断产生原因。设置 I2Cx_CR.SI 为 0 清除该标志位。

4.工作模式

I2C 控制器支持 4 种工作模式:主机发送模式、主机接收模式、从机发送模式、从机接收模式。另外还支持广播 接收模式,其工作方式和从机接收模式类似。

三、EEPROM(CW24C02AD)

1.功能简介

CW24C02是一个2Kbit的串行EEPROM存储芯片,可存储256个字节数据。芯片内部分为32页,每页8字节。工作电压范围为1.7V到5.5V,I2C接口时钟频率为 1MHz (5V,3V),400 KHz (1.7V)。器件地址为1010 A2 A1 A0,对于我们单板A2 A1 A0引脚全部接GND,故器件地址为1010000,即0x50。器件内部存储空间地址长度8 bit。

2.读写时序

字节写操作时序:起始信号+器件地址(7bit)+读写指示(1bit)+存储空间地址(8bit)+写入数据(8bit)+停止信号,即可完成指定字节写入操作。

3.png

页写操作时序:起始信号+器件地址(7bit)+读写指示(1bit)+存储空间地址(8bit)+写入数据(8bit*8)+停止信号,即可完成指定地址(必须是页起始地址)的页写入操作。

4.png

随机读操作时序:起始信号+器件地址(7bit)+读写指示(1bit)+存储空间地址(8bit)+重复起始信号+器件地址(7bit)+读写指示(1bit),之后器件会返回1字节数据,主机收到后发送停止信号,即可完成指定字节读取操作。

5.png

顺序读操作时序:和随机读时序类似,只是在主机接收到1字节数据后,不发送停止信号,而是继续发送时钟进行下一个字节数据的接收,直到所有所需读取的数据全部读取,之后再发送停止信号。

四、硬件连接

如下图所示,MCU和EEPROM通过I2C总线互连。

6.png

五、实例演示:MCU采用页写和顺序读操作时序完成EERPOM的访问。

1.I2C读写EEPROM芯片中断函数(I2C分为I2C1和I2C2)

void I2c1EepromReadWriteInterruptFunction(void)
{
    u8State = I2C_GetState(CW_I2C1);// I2C:获取状态寄存器函数
    switch(u8State)
    {
        case 0x08:     //发送完START信号
        I2C_GenerateSTART(CW_I2C1, DISABLE);// 发送START信号
        I2C_Send7bitAddress(CW_I2C1, I2C_SLAVEADDRESS,0X00);// 做主时发送从机地址字节
        break;
        case 0x10:     //发送完重复起始信号
        I2C_GenerateSTART(CW_I2C1, DISABLE);
        if(0 == SendFlg)
        {
            I2C_Send7bitAddress(CW_I2C1, I2C_SLAVEADDRESS,0X00);    //写命令
        }
        else
        {
            I2C_Send7bitAddress(CW_I2C1, I2C_SLAVEADDRESS,0X01); //读命令,eeprom 随机读
        }
        break;
        case 0x18:    //发送完SLA+W/R字节
        I2C_GenerateSTART(CW_I2C1, DISABLE);
        I2C_SendData(CW_I2C1, u8Addr);   //发送访问EEPROM的目标地址字节
        break;
        case 0x20:    //发送完SLA+W后从机返回NACK
        case 0x38:    //主机在发送 SLA+W 阶段或者发送数据阶段丢失仲裁  或者  主机在发送 SLA+R 阶段或者回应 NACK 阶段丢失仲裁
        case 0x30:    //发送完一个数据字节后从机返回NACK
        case 0x48:    //发送完SLA+R后从机返回NACK
        I2C_GenerateSTOP(CW_I2C1, ENABLE);
        I2C_GenerateSTART(CW_I2C1, ENABLE);
        break;
        case 0x58:    //接收到一个数据字节,且NACK已回复
        u8Recdata[u8RecvLen++] = I2C_ReceiveData(CW_I2C1);//所有数据读取完成,NACK已发送
        receivedflag =1;
        I2C_GenerateSTOP(CW_I2C1, ENABLE);//发送停止条件
        break;
        case 0x28:     //发送完1字节数据:发送EEPROM中memory地址也会产生,发送后面的数据也会产生
        if(0 == SendFlg)
        {
            if(u8SendLen <WRITELEN)
            {
                 I2C_SendData(CW_I2C1,u8Senddata[u8SendLen++]);
            }
            else
            {
                u8SendLen = 0;
                Comm_flg = 1;
                SendFlg = 1;
                I2C_GenerateSTOP(CW_I2C1, ENABLE);//发送完数据,发送停止信号
            }
        }
        else//SendFlg=1为读,SendFlg=0为写。读数据发送完地址字节后,重复起始条件
        {
            CW_I2C1->CR_f.STA = 1;  //set start       //发送重复START信号,START生成函数改写后,会导致0X10状态被略过,故此处不调用函数
            I2C_GenerateSTOP(CW_I2C1, DISABLE);
        }
        break; 
        case 0x40:     //发送完SLA+R信号,开始接收数据
        u8RecvLen = 0;
        if(READLEN>1)
        {
            I2C_AcknowledgeConfig(CW_I2C1,ENABLE);//读取数据超过1个字节才发送ACK
        }
        break;
        case 0x50:     //接收完一字节数据,在接收最后1字节数据之前设置AA=0;
        u8Recdata[u8RecvLen++] = I2C_ReceiveData(CW_I2C1);
        if(u8RecvLen==READLEN-1)
        {
            I2C_AcknowledgeConfig(CW_I2C1,DISABLE);;
        }
        break;
    }
    I2C_ClearIrq(CW_I2C1);
}

2.设置系统时钟

void RCC_Configuration(void)
{
    CW_SYSCTRL->APBEN1_f.I2C1 = 1U;   
}

3.设置GPIO口

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    CW_SYSCTRL->AHBEN_f.GPIOA  = 1;
    CW_SYSCTRL->AHBEN_f.GPIOB  = 1;
    CW_SYSCTRL->AHBEN_f.GPIOC  = 1;
    CW_SYSCTRL->AHBEN_f.GPIOD  = 1;
    CW_SYSCTRL->AHBEN_f.GPIOE  = 1;
    CW_SYSCTRL->AHBEN_f.GPIOF  = 1;
    
    PB10_AFx_I2C1SCL();
    PB11_AFx_I2C1SDA();
    GPIO_InitStructure.Pins = I2C1_SCL_GPIO_PIN | I2C1_SDA_GPIO_PIN;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_Init(I2C1_SCL_GPIO_PORT, &GPIO_InitStructure);
}

4.配置嵌套矢量中断控制器

void NVIC_Configuration(void)
{
     __disable_irq();
    NVIC_EnableIRQ(I2C1_IRQn);
    __enable_irq();
}
void I2C1_IRQHandler(void)
{
    I2c1EepromReadWriteInterruptFunction();
}

5.定义常量

#define  I2C1_SCL_GPIO_PORT       CW_GPIOB
#define  I2C1_SCL_GPIO_PIN        GPIO_PIN_10   
#define  I2C1_SDA_GPIO_PORT       CW_GPIOB
#define  I2C1_SDA_GPIO_PIN        GPIO_PIN_11    
//EEPROM内部地址
uint8_t u8Addr = 0x00;        //地址字节
#define WRITELEN   8          //写数据长度
#define READLEN   8           //读数据长度
#define WriteReadCycle  35    //写读次数,每次写入数据为n+i(n为次数,i=0~7)
uint8_t u8Senddata[8] = {0x66,0x02,0x03,0x04,0x05,0x60,0x70,0x20};
uint8_t u8Senddata2[8] = {0x55,0xAA,0xAA,0x55,0x55,0xAA,0x55,0xAA};
uint8_t u8Recdata[16]= {0x00};
uint8_t u8SendLen=0;
uint8_t u8RecvLen=0;
uint8_t SendFlg = 0,Comm_flg = 0;
uint8_t u8recvflg=0;
uint8_t u8State = 0;
uint8_t receivedflag = 0;    //读取完成标志

6.主程序:利用I2C接口,采用中断方式读写EEPROM芯片(CW24C02)。

int32_t main(void)
{
    I2C_InitTypeDef I2C_InitStruct = {0};
    uint16_t tempcnt = 0 ;
    RCC_Configuration();//时钟初始化
    GPIO_Configuration();//IO口初始化
    //I2C初始化
    I2C_InitStruct.I2C_Baud = 0x01;//500K=(8000000/(8*(1+1)) ,波特率计数器配置
    I2C_InitStruct.I2C_BaudEn = ENABLE;// 波特率计数器使能
    I2C_InitStruct.I2C_FLT = DISABLE; //<FLT配置
    I2C_InitStruct.I2C_AA =  DISABLE; //<ACK配置
    I2C1_DeInit();
    I2C_Master_Init(CW_I2C1,&I2C_InitStruct);//初始化模块
    NVIC_Configuration();//中断设置
    //I2C模块开始工作
    I2C_Cmd(CW_I2C1,ENABLE);  //模块使能
    tempcnt =0;
    for(uint8_t i=0; i<8; i++)
    {
        u8Senddata[i] = i;
    }
    while(1)
    {
        I2C_GenerateSTART(CW_I2C1, ENABLE); //开始信号
        while(1)
        {
            while(!Comm_flg) ; //等待数据发送完成
            FirmwareDelay(3000);
            
            Comm_flg = 0; //启动读数据过程
            receivedflag=0;
            I2C_GenerateSTART(CW_I2C1, ENABLE); //开始信号
            while(!receivedflag) ; //等待数据读取完成
            receivedflag = 0; //初始化下一次写数据
            SendFlg = 0;
            u8RecvLen = 0;
            tempcnt++;
            for(uint8_t i=0; i<8; i++)
            {
                u8Senddata[i] =tempcnt+i;
            }
            break;
        }

        if(tempcnt >=WriteReadCycle) //测试次数完成,退出
        {
            break;
        }
    }
    while(1);
}

7.程序流程

程序完成I2C主设备配置后,先将u8Senddata数组中的内容写入到EEPROM的第1页(CW24C02每页8字节):发送START信号后,I2C模块会产生状态改变中断,在中断服务程序中根据不同状态值进行不同处理,直到完成CW24C02的页写模式所有数据字节以及STOP信号发送,发送完成后置写操作流程完成标志。主循环中判断到写操作流程完成后,启动从EERROM的第1页数据读取流程:发送启动信号后,I2C模块会产生状态改变中断,在中断服务程序中根据不同状态值进行不同处理,直到完成CW24C02的顺序读模式所有数据字节发送及读取,在发送完STOP信号后置读操作流程完成标志。主循环中判断读操作流程完成后,初始化u8Senddata数组内容,重复下一次测试过程。完成WriteReadCycle变量设置的测试次数后退出。

来源:武汉芯源半导体

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 34

之前有读者问过类似这样的问题:

1.EEPROM 和 FLASH有什么区别?

2.单片机中为什么很少有EEPROM呢?

3.ROM不是只读存储器吗?为什么 EEPROM 可以读写操作呢?

今天就来围绕EEPROM 和 FLASH展开描述,希望能解决你心中的疑惑。

ROM的发展

ROM:Read-Only Memory,只读存储器。

以非破坏性读出方式工作,只能读出无法写入信息,信息一旦写入后就固定下来,即使切断电源,信息也不会丢失,所以又称为固定存储器。---来自百度百科

最早的ROM是不能编程的,出厂时其存储内容(数据)就已经固定了,永远不能修改,也不灵活。

因为存在这种弊端,后来出现了PROM(Programmable read-only memory,可编程只读存储器),可以自己写入一次,要是写错了,只能换一块芯片。

1.jpg

因为只能写一次,还是存在很多不方便,于是出现了EPROM(Erasable Programmable Read-Only Memory,可擦除可编程只读存储器),这种存储器就可以多次擦除,但是这种可擦除的存储是通过紫外线进行擦除,擦除的时候也不是很方便。

引用一个比如:如果你往单片机下载一个程序之后发现有个地方需要加一句话,为此你要把单片机放紫外灯下照半小时,然后才能再下一次,这么折腾一天也改不了几次。

随着技术的不断进步,EEPROM(Electrically Erasable Programmable Read-Only Memory,电可擦除可编程只读存储器)来了,解决了ROM过去历史中存在一些问题。

早期的EEPROM:早期的EEPROM的特点是可以随机访问和修改任何一个字节,可以往每个bit中写入0或者1,现在基本以字节为单位了。

早期的EEPROM具有较高的可靠性,但是电路更复杂,其成本也更高,因此EEPROM的容量都很小,从几KB到几百KB不等。(有点类似前面说的因为工艺和制造成本的原因,RAM的容量也不大)。

如今的EEPROM支持连续多字节读写操作了,算是已经发展到很先进的水平了。

至此,大家今天看到的EEPROM,基本都是发展的很成熟的EEPROM了。

Flash的发展

Flash,又叫Flash Memory,即平时所说的“闪存”。

Flash结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的功能,还可以快速读取数据,具有NVRAM的优势(NVRAM:Non-Volatile Random Access Memory,非易失性随机访问存储器)。

在过去,嵌入式系统一直使用ROM(EPROM)作为它们的存储设备,Flash的出现,全面代替了ROM(EPROM)在嵌入式系统中的地位,用作存储Bootloader以及操作系统或者程序代码或者直接当硬盘使用(U盘、固态硬盘)。

2.png

Flash通常分为:NOR Flash 和 NAND Flash,它们各自有各自的优缺点。

1.NOR Flash

Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。
NOR Flash的读取和我们常见的SDRAM的读取是一样,即可以根据地址随机读写,用户可以直接运行装载在NOR FLASH里面的代码,这样可以减少SRAM的容量从而节约了成本。因为其读取速度快,多用来存储程序、操作系统等重要信息。

2.NAND Flash

1989年,东芝公司发表了NAND flash结构,强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级。

NAND Flash没有采取内存的随机读取技术,它的读取是以一次读取一块的形式来进行的,通常是一次读取512个字节,采用这种技术的制作Flash的成本更廉价。

用户不能直接运行NAND Flash上的代码,因此好多使用NAND Flash的开发板除了使用NAND Flash以外,还作上了一块小的NOR Flash来运行启动代码。

3.比较

相比于 NOR Flash,NAND Flash 写入性能好,大容量下成本低。
目前,绝大部分手机和平板等移动设备中所使用的 eMMC 内部的 Flash Memory 都属于 NAND Flash。PC 中的固态硬盘中也是使用 NAND Flash。

EEPROM和FLASH区别

现在的 EEPROM 和 FLASH 都属于“可多次电擦除存储器”,但他们二者之间还是有很大差异。

首先,他们最大差异就是:FLASH按块/扇区进行读写操作,EEPROM支持按字节读写操作。

其次,容量大小不同:FLASH容量可以做到很大,但EEPROM容量一般都很小。

再次,就是它们的应用场景不同:EERPOM存储零散小容量数据,比如:标志位、一组数据等。

LASH存储大容量数据,比如:程序代码、图片信息等。

再次,内部结构不同,Flash结构更简单,成本更低,类似前面和大家分享的《单片机中RAM少的原因》。

当然,还有很多其他区别,但随着技术的提升,它们二者已经很接近了。以前它们不能满足的功能,现在基本都能满足了。

单片机中为啥很少有EEPROM?

通过上面的描述,相信大家基本都能明白,为什么单片机中很少有EEPROM了。

下面简单总结一下几点原因:

1.Flash容量更大,储存数据更多;

2.Flash速度更快,特别是读取速度;

3.同等容量,Flash成本更低;

4.Falsh体积更小,在单片机有限的空间Flash优势更明显;

5.随着RAM增加、CPU处理速度增快,能用Flash“模拟”EERPOM;

6.···

来源: 嵌入式专栏(作者:strongerHuang)

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 230

页面

订阅 RSS - EEPROM