PM861AK01
ABBPM861AK01介绍在嵌入式微控制器应用中,通常都要用到非易失性存储器。无论是掉电时维持需要保存的设置,还是存储公司的重要记录,可靠的非易失性存储器都是现代微控制器领域的一个基本单元。非易失性存储常常采用外部串行存储器实现。多年以来,该领域用到了数十亿颗类似存储器件,它们的可靠性得到了的广泛认可。目前,存储器可以做到几百字节到1兆字节甚至更大的容量,在每一个需要保持设置的设备中,都能找到这样一个紧凑、廉价的器件。包括EEPROM、闪存和旋转式存储器在内,所有类型的非易失性存储器都面临一个共同的问题:写周期被中断时,数据会丢失。一旦在写周期执行过程中掉电,那么即使再恢复电源,也很难修复损坏的数据。本文提出了一种基于事务的提交-回退机制,用于保护一个外部串行EEPROM存储器件的内容。这些措施同样适用于大多数MAXQ微控制器的内置EEPROM。I2CEEPROM的特点串行存储器件有多种接口,但最常用的接口是I2C接口。这种总线接口有很多优点:高度标准化的接口;控制器和存储器之间只需两条线;而且具有灵活的时序要求,可以由软件驱动。一个I2C主机可以驱动很多I2C从机,从而最大程度减少了主机的引脚数。在所有EEPROM器件中,写周期都要比读周期长的多。因为在写周期过程中,电荷需要借助隧道效应并通过绝缘层进行转移,而这个过程很费时间。虽然增加电压可以加快这个过程,但是过高的电压会导致绝缘层的介质击穿,从而损坏器件。典型的EEPROM器件写周期持续10毫秒左右;而读周期通常需要几百个纳秒。为了显著缩短写周期的时间,许多I2CEEPROM器件采用页面模式。该模式允许将多个字节传送到缓存中,然后将数据一次性写入存储区。I2C存储器件的典型页面尺寸为32字节。因此,可以在一个写周期内向EEPROM填入32个字节。这一点非常重要,因为串行EEPROM器件都具有特定的耐久度:即每个页面所能承受的写周期次数上限。典型的写周期次数从10,000到1,000,000次。然而,即使存储器件能够承受1百万次写周期,软件也会很快将其损耗殆尽。软件每秒仅执行100次写周期,那么不到3个小时就会耗尽器件的写周期次数。考虑到这些基本的EEPROM特性,设计者为一个嵌入式处理器设计可靠的非易失存储系统时,需切记以下几点:不要在同一页面上反复执行写操作。尤其是不要将某个页面设置成写入任何其它页面时都要更新的“目录”。如果在写周期过程中电源被中断,必须提供以下机制:(1)检测被中断的写操作;(2)完成被中断的操作;(3)或者将事件回退至写操作之前的状态。必须通过某些数据校验机制(校验和、CRC或消息摘要)来保证数据的完整性。设计目标虽然上面提到的EEPROM问题可通过多种非易失文件系统加以解决,但这样的文件机制对于小型嵌入式微控制器来说负担过重。很多文件系统需要更多的RAM,远远超出了小型微控制器所能提供的容量,而且对于多数应用,也不需要一个完整的文件系统。考虑到这一点,下面列出了EEPROM数据保护机制的设计目标:精简:保护机制用于存储校验数据的空间不应超过EEPROM的10%,它应该只需要少量的计算开销。块大小:被保护的块大小,应该和EEPROM的写操作页面大小一样。由于EEPROM器件的页面大小通常是2的偶数次幂,因此与每个块保留1或2个字节的做法相比,相同的尺寸大小更便于软件编码。耐久性:每个保护周期不要对同一页面进行写操作。可靠性:每次掉电情况下,数据都应是可恢复的。这里提到的保护机制有6个接口函数:读、写、提交、回退、检查和清理。读函数接收一个块编号和一个指向32字节缓存的指针。如果缓存地址和块编号处于有效范围内,程序就会将指定的块数据读入缓存,并校验数据的有效性。它会返回如下状态:有效读(validread)、无效读(invalidread)、无效缓存地址(invalidbufferaddress)、无效页面编号(invalidpagenumber)或保护失败(protectionfailure)。写函数接收一个块编号和一个指向填好数据的32字节缓存的指针。如果缓存地址和块编号处于有效范围内,程序就会将数据写入非易失性缓存,并标记缓存状态以准备提交。提交和回退函数,是可以在写操作之后执行的互补型操作。提交函数将最近被写入的缓存数据复制到对应的存储区最终位置,并为下一个待写入的数据块准备好缓存结构。回退函数实际上就是一个“取消”操作。它消除最近一次写操作产生的效果,并为下一个写操作准备好缓存子系统。检查函数读取存储器件的每个数据块,并检查存储数据的有效性。该函数还检查缓存子系统,以确保没有未执行的写操作。任何无效块或未执行的写操作都会使检查函数返回一个错误状态。清理函数修复一个数据损坏的EEPROM。实际上,它将试图找出发生的错误,并采取相应的解决措施。关于这些函数的更多细节,参见下面的操作详解。EEPROM存储器结构EEPROM结构参考上面图1给出的EEPROM结构。EEPROM包含三个主要区域:主存储区:EEPROM的最大区域用于存储用户数据。在一个16kB器件内,包括512页、每页32字节的存储空间。在这样的器件中,开始的473个页面专门用来存储数据。校验存储区:EEPROM的第二个部分,用于校验主存储区每个页面的数据。校验存储区的每1页都包含15个16位的CRC值。每1页的最后1个CRC用于校验本页数据。校验存储区占用31页(从473到503页)。缓存:EEPROM的最后部分,包含由8个页面构成的4个写缓存。每个缓存包含4个域:数据域,它包含32字节数据,执行下一个提交命令时,数据将被写入主存储区;地址域,它表示缓存数据要写入的页面地址;状态域,它表示缓存的状态(包括可用(available)、占用(occupied)和终止(expired)状态);16位CRC域,用来校验整个写缓存。缓存结构见图1所示。这种EEPROM结构可以实现主要的设计目标。首先,由于主存储区每1页数据的校验结果都存储在另一个位置,所以页面的所有位都用于存储用户数据。其次,由于主存储区的每1页都通过校验存储区的特定字来校验,因此校验存储区不会有单点错误,并且也不会在每个写周期中都去更新整个校验存储区的同一页面。最后,使用4个写缓存分散了写周期带来的损耗。操作详解对于一个不带保护功能的EEPROM,具体操作非常简单。一个读周期简单地将字节从所选择的地址传送给主机;一个写周期将字节从主机写入EEPROM,并等待操作完成(大多数器件需要几个毫秒的时间)。然而,在一个提供保护的EEPROM环境下,读和写操作就比较复杂了。在以下各节中,对每个操作进行了分解,以便了解函数被调用时到底是如何操作的。读操作读操作的流程图读操作这个最简单的接口函数,也是相当复杂的。图2给出了操作流程:检查页面地址和缓存地址,以检验它们的有效性。如果地址无效,则就此结束操作,函数返回一个无效缓存地址或无效页面编号错误代码。将所选页面读入缓存,计算校验页面的地址,并将相应的校验页面读入暂存区,计算校验页面的CRC。如果校验页面的数据无效,则返回一个保护失败错误代码。计算数据缓存的CRC,并将其与暂存区中对应读取页面的CRC进行比较。如果CRC匹配,则程序返回有效读代码;如果CRC不匹配,则程序返回无效读代码。无论结果怎样,实际读取的数据都保存在返回缓存中,以供调用读操作的程序使用。写操作如上所述,写操作并不是真正将数据写入主存储区。实际上,写操作是将数据写入4个缓存之一。在这种方式下,主存储区内原先的数据将一直保持到整个有效写操作流程完成后为止。图3的流程说明了以下几点:检查页面地址和缓存地址,以检验其有效性。如果地址无效,操作在这里结束,函数返回一个无效缓存地址或无效页面编号错误代码。VITRONICSPSTyp:60067ROEMHELD1546105WAF30DT71D4/BMG/TF/IS6FX1120-4BD03SIEMENS6ES7214-1BD22-0XB0SICKC4000C40E-1503AH030AHPMerkleHZ250.50/32/450.03.204MSKFGE140ES-2RSPK250-2116-010114EBLZMS2-251-2-50/32/30.00-206/M1REISRobotics296385801EE105HT-FB-VW-02/070-VH230VFRIZLENFA31215026FX1120-4BD03SiemensTDS120A2ZFANUCA14B-0076-B00SIEMENS6SC6170-0FC506ES7314-1AG13-0AB06ES7953-8LF20-0AA0TRElectronicXH81MArt.Nr.:8042-00008SIEMENS6RA4001-1AA01SIEMENS6RB2000-0NB00BECKHOFFC9900_A179.4V2Siemens6RA-8261-2CA00Siemens6RA-8261-3BUSAREM-05CE2KM-034WNSL12IV23FKUKA339.89/339-89.229KUKAINZ52/6KUKAINZE33/14FRENO04MS/FM-308BergerLahrSER397/4L7SS0TOOmronR7M-A40030-S1SICKDME5000-111LEUZEOMS1/100IS-50032738DanfossVLT5006175Z0146SER3913/4L3SS0TOMDX61B0014-5A3-4-0T+BW090-P52BSiemens6GK1241-3SA00SimaticNetCP2413SIEMENSnash_elmoG2002BH1400-7AH21-ZN03SIEMENSnash_elmoG2002BH1400-7AH21-ZN03SIEMENSnash_elmoG2002BH1400-7AH21-ZN03PHILIPS9407-923-00091Siemens6SE6420-2AD25-5CA1RS20-1600W20DT71D4/TFRH-M0500D531P102VT3006S35R5SHYC-H35-20DE-STA-CO726D40342-2VK6V160L10L30599155202222SCHUNKPGN+125/2ASDSDU1072E25KVT11037-12R900562056AllenBradleyOSAIOS5551AllenBradleyOSAIOS5630AllenBradleyA-B8600MonitorOSAI69310CE745W12K39GRAllenBradley8000888CREISIRTSA7500.153.100HT-FB-VW-02/070-VH115VC40E-1504CF010MITSUBISHIMELSEC-QQJ71PB93DFR-E540-0,75K-ECFAS40140,75KWFAS4000Siemens3006ES7312-5BE03-0AB0CPU312CTRElectronicCE65MDrehgeberArt.Nr.110-00984tecsisF23C11410022DanfossVLT2805195N1008VLT2800SMTSWISSCNC571-041-01834S503-0700-D03JD-08Siemens6ES5726-3DB00FestoDNC-125-160-PPV-ASMTSWISSCNC571-505-001I/OSEWR17DT71D4/BMG/MM03WA37B,DRS71S4/ASE1/TFAllenBradley2094-AMP5-SQS0J65BTB2-12DTFDS5015/LSiemensSimaticS76ES7350-2AH00-0AE0TRElectronicZH81260-00002Siemens6ES7864-0AF01-0YX0MitsubishiF930GOT-BWD-EBV:8/2-525-132-2TYP4677P421SGR0100MESMTSWISSCNC571-043-028SiemensC79458-L716-A131MKD025B-144-KG0-KNMOXAED6008SGMAS-08ACAHC61HPG-40A-21-J601A-SPSMTSWISSCNC571-504-004OMRONCJ1W-ETN11FestoSLT-10-30-P-A170556KUKAKVGA1.0-71-039-2762049F-16ES7416-2XK02-0AB0SiemensSimatic6ES7340-1AH02-0AE0RF27DR63L4/BR/THSiemensSimodrive6SC6100-0GB11MM05D-503-00Siemens6ES5955-3LC14SIEMENS6GK1415-2BA10Siemens6AV6611-0AA51-2CA5MITSUBISHIAJ65-BT-64DAVPULSQT40.241DCSiemensSimaticS76ES7432-1HF00-0AB0GILDEMEISTER0.861.066-46.0GILDEMEISTER0.860.204-59.1YASKAWASGMAS-02ACA21OMRONCJ1W-TC003SiemensSimaticS76ES7407-0KA02-0AA0KUKAFN006Art.-Nr.69-334-006KUKABMC15KBMC15/45KbArt.:69-350-105BLECHERSpeedMecCAM80AA4SIEMENS6ES7414-2XG03-0AB0SimaticS7CPU414-2RMA422-B21A22ASiemensSimatic6ES7158-0AD01-0XA0FestoCPV-10-VI18200Ventilinsel10P-10-8A-CO-R-Y-6J2L+UBDS60-P41211EDS344-2-250-000906321SiemensSimaticS76ES7315-2AF03-0AB0SIEMENS6SC6120-0FE00GILDEMEISTER0.652.138-36.1SIEMENS6FX1123-7AA01FANUCA03B-0801-C141DFM-32-100-P-A-KF170935KUKAKK4EYYYYY021BLECHERSpeedMecCAM71AB4BLECHERSpeedMecCAM71AC4VIPA115-6BL21CPU115SEWEURODRIVEMovimotMM07D-503-000,75kW18215017SEWEURODRIVEMovimotMM03D-503-000,37kW18214991LEUZEElectronicDDLS200/120.1-20INNOTECHTIS-280FSFestoFENG-50-160-KF34508NSKGE140ES-2RS6SC6100-0GB12Siemens6ES7214-1AD23-0XB0SCHUNKSRU35.2/357820FH2306900M6ES7214-1BC01-0XB06ES7214-1BC01-0XB0/E03MR-J3-70BXR96PCT23RA2416-8XF31-2BB4K21R71G4TLBMA5-10Siemens6ES7326-2BF01-0AB0SiemensSimaticS7CPU6ES7416-2XK02-0AB0OMRONCJ1W-DRM21PULSQTD20.241Siemens6GK1704-5CW64-3AA0SiemensSDEAMCH00319777S03SIEMENS6RB2000-ONE00FANUCA03B-0801-C115BoschB830303036FanucA350-0005-T322/03C202G02S0MQ10KupplungGERWAHAK1400/170UB400-12GM-E5-V1Sigmatek01-200-0815IK60GU-SWMSMCPFM711S-C6L-CFR-600.01AREXROTHR151206012SLE-16-55--KF-AG-CV-CH150090PCR260STAR/REXROTH1851-412-10B347AE110344ATMP1500AnemometerKitPVEB890036BAUMERBDK01.24K100/403598BRIEZF63G-4HETRONIKHC510-RK-4HETRONIKHC500-VU-230AC13062MSTR1RS232C1DPSIEMENS6GK7443-5DX03-0XE0SV-NS-03SDT03-N-09010261090-B-B-6G-K0016ES5777-1BC01E-STAND:2SEWEurodriveGetriebemotorWAF20DT71D4SEWEurodriveGetriebemotorWA30DT71D8SEWEurodriveGetriebemotorWA30DT71D8TRUMPFIDENTNR.:0045513TRUMPFIDENTNR.:007155990°52100-80IRTSA7001.102.2031No.563DSG56-SSCHIELESPS400SPS400.2.407.400.23PhilipsKS3540RexrothCDL1MP5/40/22/160D10/B1CHUMWWSICK-CMF400-1001REXROTHR15113E277SCHUNKPGN+080-1-AS-VBAUERBG04-31/P04LA16-G/DSG-SPDatalogicMC-8000MC-P080RexrothDU16-DG3-12/630/63E32Siemens6FX1143-2BA00FroniusAC4,045,860LT500-SSiemensS56ES5375DRS71S4BE05/TH/2WLE024MVAB-C1828Pilz773810SiemensMS320/MS321-A)