基于海明编码的EEPROM 数据存取功能的实现
2015-08-26潘兴明路胜杰尹文颖
潘兴明,石 倩,路胜杰,王 晨,尹文颖
(北京石油机械厂 北京100083)
EEPROM 是电可擦除可编程存储器,具有占用引脚少、容量扩展配置灵活以及读写操作相对简单的特点,在数据可保护存储领域得到了广泛的应用[1-2]。 当单片机片内存储空间不能满足需求时,在单片机片外扩展EEPROM 存储空间,可以扩展数据存储空间,也可以实现数据的掉电保护。
工业应用现场环境恶劣,数据存储传输量较大,在读取EEPROM 数据时可能受到环境干扰等因素的影响降低数据传输的准确性。 海明码编译码简单,不仅可以验证数据是否有效,还能在数据出错的情况下指明错误位置,使得它在数据通信、存储系统和嵌入式系统中应用非常广泛[3]。 为了提高数据的可靠性,可以对需要发送的数据进行海明编码,然后存储到EEPROM 芯片中, 上位机读取EEPROM 后来判断出现错误的数据位,并及时进行校正。
1 海明编码简介
海明码也称汉明码属于线性分组编码方式, 其编码原理:在数据中间加入几个校验码,码距均匀拉大,将数据的每个二进制位分配在几个奇偶校验组里,当某一位发生错误,会引起几个校验位的值发生变化,由此来进行某一位的纠错。
码字(Code Word) 按如下方法构建:
1)把所有2 的幂次方的数据位标记为奇偶校验位(编号为1, 2, 4, 8, 16, 32, 64 等的位置) ;
2)其他数据位用于待编码数据(编号为3, 5, 6, 7, 9, 10,11, 12, 13, 14, 15, 17 等的位置) ;
3) 每个奇偶校验位的值代表了代码字中部分数据位的奇偶性,其所在位置决定了要校验和跳过的比特位顺序。
位置1: 校验位1, 跳过1 位, 校验1 位, 跳过1 位(1,3,5,7,9,11,13,15,…)
位置2: 校验位2, 跳过2 位, 校验2 位, 跳过2 位(2,3,6,7,10,11,14,15,…)
位置4: 校验位4, 跳过4 位, 校验4 位, 跳过4 位(4,5,6,7,12,13,14,15,20,21,22,23,…)
位置8:校验位8,跳过8 位,校验8 位,跳过8 位(8-15,24-31,40-47,…)
如果全部校验的位置中有奇数个1, 把该奇偶校验位置为1;如果全部校验的位置中有偶数个1,把该奇偶校验位置为0。
一般说来, 对所有校验位进行检查, 将所有出错的校验位置相加, 得到的就是错误信息所在的位置。
2 EEPROM 存储空间的硬件设计
EEPROM 芯片选择8 个IIC 总线通信协议的24LC512[4],见图1。此芯片容量为512 kbit,工作电压范围1.8~5.5 V。此芯片1 次最多可写入128 个字节数据 (1 页物理地址空间),1次最多读取512 kbit,64K 字节,即读出整个芯片中数据。芯片的地址引脚可允许最多扩展8 个芯片, 使得寻找空间可达4 Mbit。 外部存储电路的接口通过IIC 总线与单片机进行通信。端口A2,A1,A0 作为每个存储芯片的片选信号,如图1 所示,这3 个端口连接的逻 辑电平分别为000,001,010,011,100,101,110,111。 这样设置后将EERPOM 外部存储空间寻址范围 达 到 0 ~0X7FFFF 字 节。 SCL 和SDA 连 接 单 片 机dsPIC33F3013 的IIC 模块引脚,WP 引脚可以连接单片机的一个I/O 脚,在软件设计过程中控制24LC512 芯片的写保护端(WP 设置高电平则写保护进行可以写入数据,低电平则写保护功能使能,数据不能被写入)。
设计电路板的实物见图2, 图中右侧为8 个24LC512 EEPROM 存储芯片。
图1 EEPROM 硬件电路图Fig. 1 EEPROM hardware circuit
图2 EEPROM 数据存取电路板Fig. 2 EEPROM data access PCB
3 EEPROM 扩展空间的软件编程思路
3.1 IIC 总线通信原理简介
使用8 片EEPROM24LC512 芯片,在软件设计时可以将A0用作寻址的第17位,A1用作寻址的第18位,A2用作寻址的第19 位。图1中的8个芯片在接收或是发送数据时都作为从机工作,听从于单片机IIC 模块[5]的主机命令。
芯片写入数据有两种方式:单个字节数据写入和数据页写入。 单个字节的写入见图3,启动IIC 后,需要向总线写入控制字节,然后地址高8 位,地址低8 位,需要写入的字节数据,24LC512 芯片产生ACK 确认信号后, 主机产生总线停止条件,一个字节的写入操作全部完成。
图3 数据字节写入序列图Fig. 3 Data byte writing sequence
实际存储数据时,可能一次需要顺序存储大量数据,如果每个字节都要按照图3 中进行软件编程, 势必繁琐,而24LC512 芯片具有页写入的功能,见图4,方便用户快捷将数据写入芯片。 页写入操作和字节写入不同处在于在控制字节数据, 地址数据写入后可以连续最多写入128 个字节数据,只要在最后写入字节后检测到24LC512 产生的ACK 确认信号,单片机IIC 模块发送总线停止条件,本次页写入操作全部完成。 每个芯片从第1 个地址单元开始到第128 个单元为第1 页,第129 个单元到256 个单元为第2 页,以此类推。 当一次写入的数据地址范围需要跨页时,软件要及时判断且必须要分两页进行处理, 否则会导致数据在当前一页轮回操作,数据写入完全混乱。
24LC512 读操作的方式包括三种:当前地址单元数据读取、随机地址读取和地址单元连续读取。 24LC512 芯片内部有一个地址计数器, 会将上次读取操作的单元地址自动加1转向当前地址。 单次的当前地址单元数据读取相对于其他两种方式较简单,因为不需要在IIC 总线上进行地址操作,直接就可读取,如图5 所示。
图4 数据页写入序列图Fig. 4 Data page writing sequence
图5 当前地址单元数据读取序列图Fig. 5 Current address byte reading sequence
随机地址读取允许主机可以随机访问地址空间中的任意位置。操作时首先在启动IIC 总线后要写入控制字节,接着写入具体的地址,然后再次启动IIC 总线发送控制字节(读操作),24LC512 从机确认后开始发送该地址中的1 个字节数据, 主机接收数据后不会确认但是会产生一个停止IIC 总线的时序。 这样一次随机地址读取操作完毕,如图6 所示。
地址单元连续读取的方式和随机地址单元数据读取方式很相近,只是在主机接收到1 个数据字节之后不是产生停止IIC 总线的时序,而是产生一个ACK 确认信号。 这个确认信号可以让从机继续发送下一个地址单元中的数据,如此实现连续读取。 直到主机接收到最后一个字节数据后主机才产生停止IIC 总线的时序,如图7 所示。
图6 随机地址单元数据读取序列图Fig. 6 Random address byte reading sequence
图7 连续地址单元数据读取序列图Fig. 7 Sequence address byte reading sequence
实际EEPROM 数据在读取时,一次读取数据量很大,所以采用连续地址单元数据读取方式更加适合,但是需要特别注意的是由于24LC512 芯片每次最多只能读取一整片的数据。
编写数据读取程序时,由于每次发送或接收一个字节数据都需要判断并给予IIC 总线一个状态,而dsPIC33F3013 单片机IIC 模块具有检测这些状态的中断功能可用, 所以读取程序的主要操作放在IIC 中断服务程序中进行。
dsPIC33F3013 单 片 机IIC 模 块 作 为 主 机,24LC512 数 据存储的8 个芯片作为从机。 单片机IIC 模块作为主机时,中断在以下事件完成时产生[6]:启动条件、停止条件、数据传输字节发送/接收、应答发送、重复启动、检测到总线冲突事件。 这些条件完成时产生的中断入口只有一个, 所以IIC 中断服务程序只有一个,在中断服务程序中对这些状态完成集中处理。
3.2 EEPROM 写数据子程序设计
单片机IIC 模块向24LC512 写数据子程序设计,考虑到可能遇到的跨页写入问题,设定一次连续写入的字节个数不大于128,这样每次写操作最多进行一次跨页操作。若实际写地址的范围跨度超出128 个字节范围,可以将空间划分为若干个128 字节段和最后一个不大于128 个字节段来分别调用24LC512 写数据子程序即可解决跨页写入数据问题。
具体设计写数据子程序时,首先要判断此次写入的地址范围(最大不超过128 个字节)是否需要跨越地址页。 如果不需跨越地址页则在本页执行一次页写入操作即可完成,否则将会在写入数据的首地址所处的本页执行页操作至本页最后一个地址单元,然后在连续的下一页第一个地址单元开始写入剩下的数据字节数量完成本次写入操作。 由于向24LC512 写入数据的正确序列是唯一且确定的,见图4。第一次中断在IIC 启动条件完成时产生。 每次写入一个字节的命令或地址或数据,接收器件产生应答信号,因而还会产生中断,用户要确定每次进入中断时,写数据序列所进行到的确切位置,这样才能在中断程序中做出正确的处理,并为下次中断做以准备,最后一次中断发生在IIC 停止条件完成时。
3.3 EEPROM 读数据子程序设计
单片机IIC 模块从24LC512 读取数据子程序设计,考虑作。 从24LC512 读出数据的正确序列是唯一且确定的,见图7。 第一次中断在IIC 启动条件完成时产生。 每次在IIC 总线上写入或读取数据,接收数据一方都会产生应答信号,产生中断, 用户要确定每次进入中断时读取数据序列所处的位置,这样才能在中断服务程序中做出合理的处理,并为下次中断做以准备。 最后一次中断发生在IIC 停止条件完成时。
4 IIC 中断服务程序流程图设计
在设计中断服务程序时同时考虑到写入数据过程和读取数据过程中所产生的中断,为了便于编程,设置一个标志位来分辨写入过程中断和读取过程中断, 且每次进入中断后, 根据程序在发送和读取序列中所进行的具体位置的差异,给此标志位赋以不同的值,为下次中断操作做好准备。
中断服务程序设计的基本框图,如图8 所示。
图8 IIC 中断服务程序流程图Fig. 8 Flow chart of IIC interrupt service program
图8 中,进入中断服务程序后可以由标志位值的不同判断是24LC512 写数据操作还是读取数据操作还是其他。从图中可以看出,左边部分为读取数据基本流程图,右边为写入数据基本流程图。 每次进入中断都需要根据标志位的值进行相应处理,并且依据下次进入中断服务程序的状态对标志位进行赋值便于下次操作。 可见,借助标志位的设置和判断,使得编程更加简便。
5 结论
对单片机系统测量的数据进行于海明编码,然后将大量数据存储在以单片机IIC 模块为核心扩展的8 片24LC512存储芯片构成的4Mbit 数据存储空间内。测试表明,经过利用海明码编码的数据传输的误码率低于百万分之一。 现场应用证明,系统运行稳定,数据存取可靠,满足设计需求,具有很好的工程应用价值。
[1] 姚亚峰,陈建文,黄载禄. 嵌入式系统中EEPROM接口及控制电路设计[J].半导体技术,2007(4):328-330.YAO Ya-feng, CHEN Jian-wen , HUANG Zai-lu. Design of Interface and Control Circuit of EEPROM in Embedded System[J].Design and Development of IC,2009(7):328-330.
[2] 于宗光,许居衍,魏同立. EEPROM单元结构的变革及发展方向[J].固体电子学研究与进展,1996(3):233-239.YU Zong-guang,XU Ju-yan,WEI Tong-li.Change and developing of the EEPROM cell structure[J].Research & Prgress of Solia State Electronic,1996(3):233-240.
[3] 汪海山,康剑冰,马骋. 汉明码在大型传感器网络中的应用研究[J].计算机应用研究,2009(7):2656-2657.WANG Hai -shan, KANG Jian -bing , MA Cheng.Application and research of Haiming code in large scale sensor networks. Application Research of Computers, 2009(7):2656-2657.
[4] 512K IIC CMOS Serial EEPROM[EB/OL].(2004).http://www.microchip.com.
[5] I2C Serial EEPROM datasheet(pdf)[M].Microchip Technology Inc,2005.
[6] DSPIC33F Reference Guide.[EB/OL].http://www microchip.com.