基于C#的OTP存储器烧录器上位机软件的设计与实现

2016-09-08 09:23唐亚华
电子设计工程 2016年13期
关键词:下位熔丝存储器

姚 远,唐亚华

(1.电子科技大学 微电子与固体电子学院,四川 成都 610054;2.成都信息工程大学 光电技术学院,四川 成都 610225)

基于C#的OTP存储器烧录器上位机软件的设计与实现

姚 远1,唐亚华2

(1.电子科技大学 微电子与固体电子学院,四川 成都610054;2.成都信息工程大学 光电技术学院,四川 成都 610225)

一次性可编程OTP存储器件的数据烧录需要专门的烧录器,而获取读取与烧写的数据则需要专门上位机软件来进行相应的操作。针对国内某反熔丝OTP存储器件,本文主要介绍了如何使用C#语言设计一个通过串口通信实现在PC上进行OPT存储器数据的读写的测试软件。由于必需对OTP存储器的功能进行测试才能得到OPT存储器中被烧录的正确数据,因此怎样使用上位机软件读取到通过串口与PC相连的高性能的OTP存储器中的数据成为一个我们非常关心的课题。C#语法简单,代码重用性高,易于维护,设计出的软件便于测试人员进行操作。在PC与基于STM32的下位机硬件平台连接进行实际测试的实验中表明,利用C#编写出的上位机软件能快速、准确地对OPT存储器进行读取和写入。

C#;串口通信;OPT存储器;芯片测试

一次性可编程OTP存储器由于其存储数据的非易失性、抗辐射性、高可靠性、高保密性[1],在密钥存储、军工设备、航空航天等领域获得了广泛的应用。然而目前,与反熔丝相关的大部分技术都被西方发达国家所掌握,我国处于相对落后地的位。因此,必须走自主创新的道路,开发出相应的编程设备与软件,逐步缩短我国与西方发达国家的差距。

存储器测试是指在设计或者生产半导体存储器芯片时,对它的的功能进行验证,以及测量它的一些主要电学特性参数。测试的目的是为了判断存储器产品质量的好坏以及获得一些重要参数,为今后的改进设计提供帮助[2]。一套合格的存储器测试/烧录系统可以大大减少测试人员的工作量,使得芯片测试工作更加智能、高效、便捷。

OTP存储器中的原始数据全为“1”或者全为“0”,通过外加电压可以实现OTP存储器的编程。OTP存储器只能编程一次,不能擦除已经写入的数据而重新编程[3]。反熔丝是一种可编程单元,未编程时,反熔丝相当于一个电容,呈高阻抗状态,高压编程后,反熔丝被击穿,呈低阻抗状态[4],通过这种物理状态上的差异达到稳定存储二进制数值的目的。C#是兼顾系统开发和应用开发的最佳实用语言,相比于C/C++,C#的语法更简单,代码重用性更高,软件更易于维护,且能够设计出非常友好的可视化图形用户界面,便于测试人员进行操作。针对国内某反熔丝OTP存储器件,文中主要介绍了如何使用C#语言设计一个通过串口通信实现在PC上进行OPT存储器数据的读写的测试软件,主要具有以下特点:通过RS232串口与计算机通信;友好的图形用户界面;提供自动化、高效的读取与烧录方式;可兼容多种反熔丝OPT存储器件;可兼容不同的使用串口进行通信的测试平台。

1 烧录器系统总体设计方案

该烧录器系统总体结构如图1所示,整个系统分为PC上位机软件和硬件烧录平台下位机两个部分。在对反熔丝OPT存储器进行烧录的过程中,PC上位机产生烧写与读取控制指令控制烧录器对反熔丝OTP存储器进行数据的烧写与读取。将编程数据存储在Hex文件中,在上位机软件中加载Hex文件即可自动高效地将编程数据烧录到反熔丝OTP存储器中。读校验指令用于校验反熔丝OTP存储器中已烧录的数据是否与Hex文件中的数据一致。此外,烧录器还将烧录状态以及读写结果反馈回计算机,并在上位机软件上显示出来,实时监控烧录过程,一旦出现故障,可及时进行故障排除。

图1 烧录系统总体结构图

2 烧录系统的下位机硬件基础

由于只有通过串口上位机软件才能向下位机发送数据、接收下位机读取到的数据,所以这里着重介绍此烧录系统的串口通信电路。RS232串口通信电路负责上位机与下位机的通信功能,上位机通过RS232串口通信电路向下位机发送指令与数据,下位机通过RS232串口通信电路向上位机反馈下位机的运行及对OTP存储器的读写状况。

近距离通信时,通过三根线(TXD、RXD、GND)就可以实现计算机与编程器的全双工异步串口通信。在TXD(发送)和RXD(接收)上:逻辑“1”为-3 V至-15 V,逻辑“0”为+3 V至+ 15 V[5]。由于本烧录器为+3.3 V电压系统,使用的是TTL或CMOS逻辑电平,因此采用电平转换芯片SP3222EEA,该芯片能实现TTL或CMOS逻辑电平与RS-232电平之间的转换。

3 烧录器上位机软件及其界面的设计

软件界面主要分为串口设置、HEX数据发送、读操作、功能操作、数据接收几个部分。串口设置让用户可以选择使用PC上的某一个串口;HEX数据发送部分让用户可以从PC硬盘上选择某个想要写入或者读检验的HEX文件,并且进行写文件或者读校验操作;读操作部分可以让用户自定义读校验的起始和结束地址,读取OTP存储器中某个特定部分的数据;功能操作部分可以让用户清空数据窗口中的内容以及退出上位机软件程序;接收数据部分用来显示从OTP存储器读取出来的数据以及下位机反馈回来的一些读取状态与信息。

首先对连接到PC的串口进行设置。当打开软件,主窗口进行装载时,软件就自动对PC上的串口进行遍历搜索,并对每个串口进行检测,如果串口可用则在listBox1中显示可用串口的编号。如果打开串口失败那么sp.Open()语句无法正常运行,try中的语句抛出异常,不会执行try中的其余语句,转而执行catch中的语句[6],在label6中显示出不可用的COM口。同时通过SerialDataReceivedEventHandler()方法委派sp_DataReceived函数对串口的数据接收事件进行处理,每当串口有数据发送到上位机时,都使用串口的DataReceived事件接收下位机发送过来的数据。串口选择部分源代码如下所示。

private void Form1_Load(object sender,EventArgs e)

{ for(int i=0;i<256;i++)

{SerialPort sp=new SerialPort("COM"+(i+1). ToString();

sp.Open();

sp.Close();

this.listBox1.Items.Add("COM"+(i+1). ToString();}

s.Forms.Control.CheckForIllegalCrossThreadCalls= false;

this.sp.DataReceived+=new SerialDataReceivedEventHandler(sp_DataReceived);}

选择好要使用的串口后,还需要对串口的波特率、停止位、数据位、奇偶校验位等参数进行设置。为了方便在程序其他部分调用对串口参数的设置,这里专门为其定义一个private类型的函数。由于在读取和烧录数据时串口的参数设置并不会有所改变,所以这里的函数是一个无参数的函数,串口参数的设置已经内嵌于此函数中。串口参数设置的函数代码如下所示。

private void setportproperty()

{sp.PortName=listBox1.Text.Trim();

sp.BaudRate=Convert.ToInt32("9600");

sp.StopBits=StopBits.One;

sp.DataBits=Convert.ToInt16("8");

sp.Parity=Parity.None;

sp.ReadTimeout=-1;}

下面着重对负责从串口接收从下位机读取到数据和向下位机发送数据的sp_DataReceived函数进行分析。由于上位机软件主要有写文件、读校验、读操作3种针对下位机的数据操作,因此sp_DataReceived函数中也有3种不同的串口接收数据的方式,这里使用switch语句进行模式之间的转换,读操作、写文件和读校验分别对应model中的1、2、3模式。

当model为1时,进入读操作模式。为了将串口发送来的数据保存下来,首先需要定义一个一维8位无符号整数数组receiveddata用来存储从串口缓冲区读取到的数据,而该数组的长度则由SerialPort的BytesToRead属性(获取串口输入缓冲区中需要读取的字节数)决定。然后使用SerialPort的Read方法将从串口输入缓冲区读取的数据写入到receiveddata数组中,这里将写入的起始点设置为0,偏移量设置为receiveddata.Length,这样receiveddata数组中的数据就被需要读取的数据全部覆盖了。接下来使用 SerialPort的DiscardInBuffer()方法释放来自串口的接收缓冲区的数据,防止接收缓冲区一直被旧的数据占用而不能再接收来自下位机的新数据。最后定义一个字符型变量strRcv,用来将receiveddata数组中的无符号整数元素转换为字符弄并显示到PC屏幕上。这里使用一个for循环将receiveddata数组中的所有元素强制转换为char型按顺序依次添加到strRcv中,再显示到textBox2即软件的接收数据区域中,这样就完成了对下位机上OTP存储芯片中数据的读取操作。此部分主要代码如下所示。

Byte[]receiveddata=new Byte[sp.BytesToRead];

sp.Read(receiveddata,0,receiveddata.Length);

sp.DiscardInBuffer();

string strRcv=null;

for(int i=0;i

{strRcv+=(char)receiveddata[i];}

this.textBox2.Text+=strRcv;

当model为2时,进入写文件模式。在写文件模式中,也需要先将从下位机接收到的数据转换为字符型显示到接收数据区域中,因此这部分也需要读操作的功能,将case1中的代码复制下来即可。然而为了实现写文件,不仅需要读取下位机通过串口发送来的数据,还需要将HEX文件中的数据通过串口发送给下位机。在发出将接收到的数据显示到屏幕上的指令后,这里需要将当前进程挂起200 ms使用的是Thread. Sleep()语句。这样做的原因是下位机发送数据到上位机是需要一定时间的,必需留有足够的时间以确保上位机已经完全接收到了下位机发送来的数据。在写文件模式下,当下位机准备好接收来自上位机HEX文件中的数据时,会向上位机发送一个“OK”,之后每接收到一行HEX文件中的数据之后也会向上位机发送一个“OK”。这样上位机就必须检测接收到的数据中是否含有“OK”字符,这一步是通过字符串的Contains()方法实现的。当检测到接收的数据中包含“OK”,程序需要进一步检测当前上位机发送的数据是否在HEX文件流的最后一行,通过获取当前文件的EndOfStream属性来实现。如果当前发送的数据不是在当前文件的最后一行,就通过StreamReader的ReadLine()方法读取当前文件流中的一行字符数据并将其作为字符串返回,然后将这个字符串通过SerialPort的Write()方法写入到串口,即将要写入到OTP存储器芯片的数据发送给下位机。为了使此软件界面可视化更强,这里还使用了进度条控件以显示写文件时HEX文件中数据加载的进度。为了实现进度条的显示,这里定义了一个整型数据total,初始值为0,每当将一行HEX数据发送给下位机后,total的值就+1,并且将total/512(此处以64kOTP存储芯片为例,一行HEX数据为16Byte,一共有512行HEX数据)的值赋给进度条控件的Value属性。最后使用SteamReader类的Close()释放被占用的HEX文件以及读取器,使用户可以重新对HEX文件进行编辑。此模式不同于读操作模式的主要代码如下所示。

if(strRcv.Contains("OK"))

{if(!readfile.EndOfStream)

{sp.Write(readfile.ReadLine().Trim();

sp.Write(Environment.NewLine);

total++;

toolStripProgressBar1.Value=total/512;}

else{MessageBox.Show("data end");

readfile.Close();}

当model为3时,进入读校验模式。读校验模式和读操作模式的区别在于:读校验模式在读出OTP存储器芯片的数据后需要与提前加载的HEX文件进行比对,主要用来校验已烧录到芯片中的数据与原有的HEX文件中的数据是否匹配;而读操作模式是直接把存储器芯片给定地址区间的数据读取出来。因此读校验模式和写文件模式都需要将HEX文件中的数据通过串口加载到下位机当中。而具体数据比较匹配的工作是由下位机完成的。这样读校验模式部分的代码和写文件模式的代码可以基本上保持一致,两者的主要区别在于:在将下位机发送来的数据显示到屏幕上后,读校验模式需要将线程挂起500 ms而不是200 ms。这样做的原因主要是下位机中读写模式的不同造成的。在写文件模式中,下位机每接收到一行HEX数据就会向上位机反馈一个“OK”,当所有HEX数据都向下位机发送完毕后下位机才根据已经接收到的数据开始对存储器芯片进行数据烧录。虽然OTP存储器烧录数据的时间比较长,但是上位机程序中只需要给下位机发送“OK”和将其打印至屏幕上的过程留足时间,因此写文件模式中在打印字符串指令发出后只需要将当前进程挂起200ms。而读校验模式中,在下位机接收到HEX数据后,并不只是反馈给上位机一个 “OK”,还需要将读取到的OTP存储器中的数据和HEX数据对比匹配后把结果返回给上位机。当二者一行的数据完全匹配时,下位机返回一个“OK”,而当二者数据有不匹配的位时,下位机会分别把读取到的数据和HEX数据一同返回到上位机并打印至屏幕上。正如上文所述,一行数据为16Byte,最不匹配的情况为二者数据每一个Byte都不一致,这样就需要打印16行数据到PC的屏幕上。虽然下位机完成接收HEX数据、读取OTP存储器中的数据和比较二者数据所需的时间很短,但是将16行数据打印到屏幕上的时间较长。因此在读校验模式中需要将当前进程挂起500 ms以等待下位机返回的数据全部都打印至屏幕上,而后再检测返回的数据中是否包含“OK”,准备下一次的数据接收。由于篇幅所限而且此部分代码基本上与写文件模式的代码相同在此就不列出读校验模式的主要代码。

4 对OTP存储器的读写测试

通过制定测试方案,对国内某反熔丝OTP存储器件进行了编程测试,以验证本上位机软件的基本功能。

读操作模式如图2所示。在设定好起始地址与结束地址后,点击“读操作”按钮,软件将依次读取出存储芯片上每一位地址上所存储的数据。

图2 读操作模式

写文件模式接收数据如图3所示。当加载好要烧录的HEX数据文件之后,点击“写文件”按钮,软件将从下位机接收到若干个“OK”字符,以表示下位机接收HEX数据成功。此处选择了烧录10行HEX数据,因此软件在一共接收到10个“OK”后显示“programming!”,此时下位机正在对存储芯片进行数据的烧录。当烧录完成后,下位机返回一个“done!”,提示用户已完成HEX数据的烧录操作。

图3 写文件模式

读校验模式如图4所示。当加载好要校验的HEX数据文件之后,点击“读检验”按钮,软件将接收到下位机对数据进行校验之后的结果。可以看出,当存储器芯片一位地址存储的数据和要校验的HEX数据一致时,下位机返回一个“OK”。而当二者数据不匹配时,下位机刚会返回不匹配数据的地址以及该地址实际存储的数据以及对应的HEX数据,并显示“UNMATCH”。

图4 读校验模式

5 结论

该上位机以C#语言编写,与基于ARM的下位机烧录器通过串口进行数据交换,再配合以特殊格式的HEX数据文件,可实现对OTP存储器数据的读取、烧录与校验操作。通过友好的可视化图形用户界面,该上位机软件提供自动化、高效的数据读写方式。对国内某反熔丝OTP器件进行了读写测试,实际烧录实验表明,该上位机通过与下位机的串口通信可实现对反熔丝OTP器件的高效读写操作,并可根据预加载的HEX文件进行数据的校验,显示出与HEX文件中不匹配的数据,使OTP存储器的测试工作变得更加简单、便捷。

[1]王刚,李平,李威,等.反熔丝的研究与应用[J].材料导报,2011, 25(11):30-33.

[2]张颉夫.OTP存储器编程与测试系统的设计技术研究[D].成都:电子科技大学,2012.

[3]张剑.OTP存储器应用开发技术研究[D].成都:电子科技大学,2015.

[4]孙承松,张丽娟,李新.ONO反熔丝的研究[J].沈阳工业大学学报,2006,28(5):546-548.

[5]潘方.RS232串口通信在PC机与单片机通信中的应用[J].现代电子技术,2012,35(13):69-71.

[6]Jack.Purdum.C#3.0面向对象编程[M].叶雄兵,黄谦,译.北京清华大学出版社,2009.

The design and implementation of the upper computer software of OTP memory's programmer based on C#

YAO Yuan1,TANG Ya-hua2
(1.School of Microelectronics and Solid-state Electronics,University of Electronic Science and Technology,Chengdu 610054,China;2.College of Optoelectronic Technology,Chengdu University of Information Technology,Chengdu 610225,China)

One Time Programmable OTP memory device data programming need special programmer,the reading and writing of data accessing requires specialized upper computer software to carry on the corresponding operation.For a domestic antifuse OTP memory device,this paper mainly introduces how to use C#language design a through the serial communication to achieve opt memory data read and write test software on the PC.Due to the necessary of OTP memory function test can be opt memory be burned the correct data.Therefore,how to use PC software to read the data through the serial port and PC connected to the high performance of the OTP memory becomes a subject of a matter of great concern to us.C#'s grammer is simple, code reusing is high,and it is easy to maintain,so the designed software is convenient for testing personnel to operate.In the PC and lower computer hardware platform based on the STM32 connection of actual testing experiments show that PC software written by C#quickly and accurately to the opt memory to read and write.

C#;serial communication;OTP memory;chip testing

TN302

A

1674-6236(2016)13-0030-04

2015-07-16稿件编号:201507118

姚 远(1991—),男,山西晋中人,硕士。研究方向:大规模集成电路设计。

猜你喜欢
下位熔丝存储器
熔丝制造的三维连续编织填充图案
静态随机存储器在轨自检算法
2017款别克君越车蓄电池经常亏电
发射机房监控系统之下位机
任意2~k点存储器结构傅里叶处理器
景洪电厂监控系统下位机数据传输网络改造
围观党“下位”,吐槽帝“登基”
CAN总线并发通信时下位机应用软件设计
存储器——安格尔(墨西哥)▲
别克君威车散热风扇熔丝频繁熔断