ABB PM861AK01
介绍
在嵌入式微控制器应用中,通常都要用到非易失性存储器。无论是掉电时维持需要保存的设置,还是存储公司的重要记录,可靠的非易失性存储器都是现代微控制器领域的一个基本单元。
非易失性存储常常采用外部串行存储器实现。多年以来,该领域用到了数十亿颗类似存储器件,它们的可靠性得到了的广泛认可。目前,存储器可以做到几百字节到1兆字节甚至更大的容量,在每一个需要保持设置的设备中,都能找到这样一个紧凑、廉价的器件。
包括EEPROM、闪存和旋转式存储器在内,所有类型的非易失性存储器都面临一个共同的问题:写周期被中断时,数据会丢失。一旦在写周期执行过程中掉电,那么即使再恢复电源,也很难修复损坏的数据。本文提出了一种基于事务的提交-回退机制,用于保护一个外部串行EEPROM存储器件的内容。这些措施同样适用于大多数M
AXQ微控制器的内置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的流程说明了以下几点:
检查页面地址和缓存地址,以检验其有效性。如果地址无效,操作在这里结束,函数返回一个无效缓存地址或无效页面编号错误代码。
VITRONIC SPS Typ: 60067
ROEMHELD 1546105
WAF30 DT71D4/BMG/TF/IS
6FX1120-4BD03
SIEMENS 6ES7 214-1BD22-0XB0
SICK C4000 C40E-1503AH030
AHP Merkle HZ 250.50/32/450.03.204 M
SKF GE 140 ES-2RS
PK250-2 116-010114E
BLZMS2-251-2-50/32/30.00-206/M1
REIS Robotics 2963858 01EE105
HT-FB-VW-02/070-VH 230V
FRIZLEN FA 3121502
6FX1120-4BD03
Siemens TDS 120A2Z
FANUC A14B-0076-B00
SIEMENS 6SC6170-0FC50
6ES7 314-1AG13-0AB0 6ES7 953-8LF20-0AA0
TR Electronic XH81M Art.Nr.:8042-00008
SIEMENS 6RA4001-1AA01
SIEMENS 6RB2000-0NB00
BECKHOFF C9900_A179.4 V2
Siemens 6RA-8261-2CA00
Siemens 6RA-8261-3B
USAREM-05CE2K
M-034WN
SL12IV23F
KUKA 339.89 / 339-89.229
KUKA INZ 52/6
KUKA INZE 33/14
FRENO 04 MS/FM-308
Berger Lahr SER397/4L7SS0TO
Omron R7M-A40030-S1
SICK DME5000-111
LEUZE OMS1/100 IS - 500 32738
Danfoss VLT5006 175Z0146
SER3913/4L3SS0TO
MDX61B0014-5A3-4-0T + BW090-P52B
Siemens 6GK1241-3SA00 Simatic Net CP2413
SIEMENS nash_elmo G200 2BH1400-7AH21-ZN03
SIEMENS nash_elmo G200 2BH1400-7AH21-ZN03
SIEMENS nash_elmo G200 2BH1400-7AH21-ZN03
PHILIPS 9407-923-00091
Siemens 6SE6420-2AD25-5CA1
RS20 - 1600
W20 DT71D4/TF
RH-M 0500 D53 1 P102
VT3006 S35 R5
SHYC-H 35-20
DE-STA-CO 726D40342-2
VK6V160L10 L3059915 5202222
SCHUNK PGN+125/2 AS
DSDU1072E25K
VT11037-12 R900562056
Allen Bradley OSAI OS 5551
Allen Bradley OSAI OS 5630
Allen Bradley A-B 8600 Monitor OSAI 69310 CE745W12K39GR
Allen Bradley 8000 888 C
REIS IRT SA 7500.153.100
HT-FB-VW-02/070-VH 115V
C40E-1504CF010
MITSUBISHI MELSEC-Q QJ71PB93D
FR-E540-0,75K-EC
FAS 4014 0,75 KW FAS 4000
Siemens 300 6ES7 312-5BE03-0AB0 CPU312C
TR Electronic CE 65M Drehgeber Art.Nr. 110-00984
tecsis F23C1 1410022
Danfoss VLT2805 195N1008 VLT 2800
SMT SWISS CNC 571-041-018
34S503-0700-D03JD-08
Siemens 6 ES 5726 - 3DB00
Festo DNC-125-160-PPV-A
SMT SWISS CNC 571-505-001 I/O
SEW R17 DT71D4/BMG/MM03
WA37B,DRS71S4/ASE1/TF
Allen Bradley 2094-AMP5-S
QS0J65BTB2-12DT
FDS5015/L
Siemens Simatic S7 6ES7 350-2AH00-0AE0
TR Electronic ZH81 260-00002
Siemens 6ES7864-0AF01-0YX0
Mitsubishi F930GOT-BWD-E
BV:8/2-525-132-2 TYP 4677
P421SGR0100ME
SMT SWISS CNC 571-043-028
Siemens C79458-L716-A131
MKD025B-144-KG0-KN
MOXA ED6008
SGMAS-08ACAHC61 HPG-40A-21-J601A-SP
SMT SWISS CNC 571-504-004
OMRON CJ1W-ETN11
Festo SLT-10-30-P-A 170556
KUKA KVGA 1.0-71-039-276 2049F-1
6ES7416-2XK02-0AB0
Siemens Simatic 6ES7 340-1AH02-0AE0
RF27 DR63L4/BR/TH
Siemens Simodrive 6SC 6100-0GB11
MM05D-503-00
Siemens 6ES5955-3LC14
SIEMENS 6GK1415-2BA10
Siemens 6AV6611-0AA51-2CA5
MITSUBISHI AJ65-BT-64DAV
PULS QT40.241 DC
Siemens Simatic S7 6ES7 432-1HF00-0AB0
GILDEMEISTER 0.861.066-46.0
GILDEMEISTER 0.860.204-59.1
YASKAWA SGMAS-02ACA21
OMRON CJ1W-TC003
Siemens Simatic S7 6ES7 407-0KA02-0AA0
KUKA FN006 Art.-Nr. 69-334-006
KUKA BMC15K BMC15/45Kb Art.: 69-350-105
BLECHER SpeedMec CAM 80 AA4
SIEMENS 6ES7 414-2XG03-0AB0 Simatic S7 CPU 414-2
RMA422 -B21A22A
Siemens Simatic 6ES7 158-0AD01-0XA0
Festo CPV-10-VI 18200 Ventilinsel 10P-10-8A-CO-R-Y-6J2L+UB
DS60-P41211
EDS 344-2-250-000 906321
Siemens Simatic S7 6ES7 315-2AF03-0AB0
SIEMENS 6SC6120-0FE00
GILDEMEISTER 0.652.138-36.1
SIEMENS 6FX1123-7AA01
FANUC A03B-0801-C141
DFM-32-100-P-A-KF 170935
KUKA KK4EY YYYY 021
BLECHER SpeedMec CAM 71 AB4
BLECHER SpeedMec CAM 71 AC4
VIPA 115-6BL21 CPU 115
SEW EURODRIVE Movimot MM07D-503-00 0,75kW 18215017
SEW EURODRIVE Movimot MM03D-503-00 0,37kW 18214991
LEUZE Electronic DDLS 200/120.1-20
INNOTECH TIS-280FS
Festo FENG-50-160-KF 34508
NSK GE 140 ES-2RS
6SC6100-0GB12
Siemens 6ES7 214-1AD23-0XB0
SCHUNK SRU 35.2 / 357820
FH2306900M
6ES7 214-1BC01-0XB0 6ES7214-1BC01-0XB0 / E03
MR-J3-70B
XR96PCT2
3RA2416-8XF31-2BB4
K21R 71G4TLB
MA 5-10
Siemens 6ES7 326-2BF01-0AB0
Siemens Simatic S7 CPU 6ES7 416-2XK02-0AB0
OMRON CJ1W-DRM21
PULS QTD20.241
Siemens 6GK1704-5CW64-3AA0
Siemens SD EA MCH 00319777 S 03
SIEMENS 6RB2000-ONE00
FANUC A03B-0801-C115
Bosch B 830 303 036
Fanuc A350-0005-T322/03
C202G02S0MQ10
Kupplung GERWAH AK 1400/170
UB400-12GM-E5-V1
Sigmatek 01-200-081
5IK60GU-SWM
SMC PFM711S-C6L-C
FR-600.01A
REXROTH R151206012
SLE-16-55--KF-A G-CV-CH 150090
PCR 260
STAR /REXROTH 1851-412-10
B347A E110 344A TMP1500
Anemometer Kit PVE B8900 36
BAUMER BDK 01.24K100/403598
BRIEZ F63G-4
HETRONIK HC510-RK-4
HETRONIK HC500-VU-230
AC1306 2MSTR 1RS232C 1DP
SIEMENS 6GK7 443-5DX03-0XE0
SV-NS-03
SDT03-N-09010261 090-B-B-6G-K001
6ES5 777-1BC01 E-STAND:2
SEW Eurodrive Getriebemotor WAF20 DT71D4
SEW Eurodrive Getriebemotor WA30 DT71D8
SEW Eurodrive Getriebemotor WA30 DT71D8
TRUMPF IDENT NR.: 0045513
TRUMPF IDENT NR.: 0071559 90° 52100-80
IRT SA 7001.102.2031 No.563
DSG 56-S
SCHIELE SPS 400 SPS400 . 2.407.400.23
Philips KS3540
Rexroth CDL1MP5/40/22/160D10/B1CHUMWW
SICK - CMF400-1001
REXROTH R15113E277
SCHUNK PGN+080-1-AS-V
BAUER BG04-31/P04LA16-G/DSG-SP
Datalogic MC-8000 MC-P080
Rexroth DU 16-DG 3-12 / 630 / 63 E32
Siemens 6FX1143-2BA00
Fronius AC 4,045,860 LT 500-S
Siemens S5 6ES5 375
DRS71S4BE05/TH/2W
LE024MVAB-C1828
Pilz 773810
Siemens MS 320 / MS 321-A