姚 遠(yuǎn),唐亞華
(1.電子科技大學(xué) 微電子與固體電子學(xué)院,四川 成都 610054;2.成都信息工程大學(xué) 光電技術(shù)學(xué)院,四川 成都 610225)
基于C#的OTP存儲器燒錄器上位機軟件的設(shè)計與實現(xiàn)
姚 遠(yuǎn)1,唐亞華2
(1.電子科技大學(xué) 微電子與固體電子學(xué)院,四川 成都610054;2.成都信息工程大學(xué) 光電技術(shù)學(xué)院,四川 成都 610225)
一次性可編程OTP存儲器件的數(shù)據(jù)燒錄需要專門的燒錄器,而獲取讀取與燒寫的數(shù)據(jù)則需要專門上位機軟件來進(jìn)行相應(yīng)的操作。針對國內(nèi)某反熔絲OTP存儲器件,本文主要介紹了如何使用C#語言設(shè)計一個通過串口通信實現(xiàn)在PC上進(jìn)行OPT存儲器數(shù)據(jù)的讀寫的測試軟件。由于必需對OTP存儲器的功能進(jìn)行測試才能得到OPT存儲器中被燒錄的正確數(shù)據(jù),因此怎樣使用上位機軟件讀取到通過串口與PC相連的高性能的OTP存儲器中的數(shù)據(jù)成為一個我們非常關(guān)心的課題。C#語法簡單,代碼重用性高,易于維護(hù),設(shè)計出的軟件便于測試人員進(jìn)行操作。在PC與基于STM32的下位機硬件平臺連接進(jìn)行實際測試的實驗中表明,利用C#編寫出的上位機軟件能快速、準(zhǔn)確地對OPT存儲器進(jìn)行讀取和寫入。
C#;串口通信;OPT存儲器;芯片測試
一次性可編程OTP存儲器由于其存儲數(shù)據(jù)的非易失性、抗輻射性、高可靠性、高保密性[1],在密鑰存儲、軍工設(shè)備、航空航天等領(lǐng)域獲得了廣泛的應(yīng)用。然而目前,與反熔絲相關(guān)的大部分技術(shù)都被西方發(fā)達(dá)國家所掌握,我國處于相對落后地的位。因此,必須走自主創(chuàng)新的道路,開發(fā)出相應(yīng)的編程設(shè)備與軟件,逐步縮短我國與西方發(fā)達(dá)國家的差距。
存儲器測試是指在設(shè)計或者生產(chǎn)半導(dǎo)體存儲器芯片時,對它的的功能進(jìn)行驗證,以及測量它的一些主要電學(xué)特性參數(shù)。測試的目的是為了判斷存儲器產(chǎn)品質(zhì)量的好壞以及獲得一些重要參數(shù),為今后的改進(jìn)設(shè)計提供幫助[2]。一套合格的存儲器測試/燒錄系統(tǒng)可以大大減少測試人員的工作量,使得芯片測試工作更加智能、高效、便捷。
OTP存儲器中的原始數(shù)據(jù)全為“1”或者全為“0”,通過外加電壓可以實現(xiàn)OTP存儲器的編程。OTP存儲器只能編程一次,不能擦除已經(jīng)寫入的數(shù)據(jù)而重新編程[3]。反熔絲是一種可編程單元,未編程時,反熔絲相當(dāng)于一個電容,呈高阻抗?fàn)顟B(tài),高壓編程后,反熔絲被擊穿,呈低阻抗?fàn)顟B(tài)[4],通過這種物理狀態(tài)上的差異達(dá)到穩(wěn)定存儲二進(jìn)制數(shù)值的目的。C#是兼顧系統(tǒng)開發(fā)和應(yīng)用開發(fā)的最佳實用語言,相比于C/C++,C#的語法更簡單,代碼重用性更高,軟件更易于維護(hù),且能夠設(shè)計出非常友好的可視化圖形用戶界面,便于測試人員進(jìn)行操作。針對國內(nèi)某反熔絲OTP存儲器件,文中主要介紹了如何使用C#語言設(shè)計一個通過串口通信實現(xiàn)在PC上進(jìn)行OPT存儲器數(shù)據(jù)的讀寫的測試軟件,主要具有以下特點:通過RS232串口與計算機通信;友好的圖形用戶界面;提供自動化、高效的讀取與燒錄方式;可兼容多種反熔絲OPT存儲器件;可兼容不同的使用串口進(jìn)行通信的測試平臺。
該燒錄器系統(tǒng)總體結(jié)構(gòu)如圖1所示,整個系統(tǒng)分為PC上位機軟件和硬件燒錄平臺下位機兩個部分。在對反熔絲OPT存儲器進(jìn)行燒錄的過程中,PC上位機產(chǎn)生燒寫與讀取控制指令控制燒錄器對反熔絲OTP存儲器進(jìn)行數(shù)據(jù)的燒寫與讀取。將編程數(shù)據(jù)存儲在Hex文件中,在上位機軟件中加載Hex文件即可自動高效地將編程數(shù)據(jù)燒錄到反熔絲OTP存儲器中。讀校驗指令用于校驗反熔絲OTP存儲器中已燒錄的數(shù)據(jù)是否與Hex文件中的數(shù)據(jù)一致。此外,燒錄器還將燒錄狀態(tài)以及讀寫結(jié)果反饋回計算機,并在上位機軟件上顯示出來,實時監(jiān)控?zé)涍^程,一旦出現(xiàn)故障,可及時進(jìn)行故障排除。
圖1 燒錄系統(tǒng)總體結(jié)構(gòu)圖
由于只有通過串口上位機軟件才能向下位機發(fā)送數(shù)據(jù)、接收下位機讀取到的數(shù)據(jù),所以這里著重介紹此燒錄系統(tǒng)的串口通信電路。RS232串口通信電路負(fù)責(zé)上位機與下位機的通信功能,上位機通過RS232串口通信電路向下位機發(fā)送指令與數(shù)據(jù),下位機通過RS232串口通信電路向上位機反饋下位機的運行及對OTP存儲器的讀寫狀況。
近距離通信時,通過三根線(TXD、RXD、GND)就可以實現(xiàn)計算機與編程器的全雙工異步串口通信。在TXD(發(fā)送)和RXD(接收)上:邏輯“1”為-3 V至-15 V,邏輯“0”為+3 V至+ 15 V[5]。由于本燒錄器為+3.3 V電壓系統(tǒng),使用的是TTL或CMOS邏輯電平,因此采用電平轉(zhuǎn)換芯片SP3222EEA,該芯片能實現(xiàn)TTL或CMOS邏輯電平與RS-232電平之間的轉(zhuǎn)換。
軟件界面主要分為串口設(shè)置、HEX數(shù)據(jù)發(fā)送、讀操作、功能操作、數(shù)據(jù)接收幾個部分。串口設(shè)置讓用戶可以選擇使用PC上的某一個串口;HEX數(shù)據(jù)發(fā)送部分讓用戶可以從PC硬盤上選擇某個想要寫入或者讀檢驗的HEX文件,并且進(jìn)行寫文件或者讀校驗操作;讀操作部分可以讓用戶自定義讀校驗的起始和結(jié)束地址,讀取OTP存儲器中某個特定部分的數(shù)據(jù);功能操作部分可以讓用戶清空數(shù)據(jù)窗口中的內(nèi)容以及退出上位機軟件程序;接收數(shù)據(jù)部分用來顯示從OTP存儲器讀取出來的數(shù)據(jù)以及下位機反饋回來的一些讀取狀態(tài)與信息。
首先對連接到PC的串口進(jìn)行設(shè)置。當(dāng)打開軟件,主窗口進(jìn)行裝載時,軟件就自動對PC上的串口進(jìn)行遍歷搜索,并對每個串口進(jìn)行檢測,如果串口可用則在listBox1中顯示可用串口的編號。如果打開串口失敗那么sp.Open()語句無法正常運行,try中的語句拋出異常,不會執(zhí)行try中的其余語句,轉(zhuǎn)而執(zhí)行catch中的語句[6],在label6中顯示出不可用的COM口。同時通過SerialDataReceivedEventHandler()方法委派sp_DataReceived函數(shù)對串口的數(shù)據(jù)接收事件進(jìn)行處理,每當(dāng)串口有數(shù)據(jù)發(fā)送到上位機時,都使用串口的DataReceived事件接收下位機發(fā)送過來的數(shù)據(jù)。串口選擇部分源代碼如下所示。
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);}
選擇好要使用的串口后,還需要對串口的波特率、停止位、數(shù)據(jù)位、奇偶校驗位等參數(shù)進(jìn)行設(shè)置。為了方便在程序其他部分調(diào)用對串口參數(shù)的設(shè)置,這里專門為其定義一個private類型的函數(shù)。由于在讀取和燒錄數(shù)據(jù)時串口的參數(shù)設(shè)置并不會有所改變,所以這里的函數(shù)是一個無參數(shù)的函數(shù),串口參數(shù)的設(shè)置已經(jīng)內(nèi)嵌于此函數(shù)中。串口參數(shù)設(shè)置的函數(shù)代碼如下所示。
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;}
下面著重對負(fù)責(zé)從串口接收從下位機讀取到數(shù)據(jù)和向下位機發(fā)送數(shù)據(jù)的sp_DataReceived函數(shù)進(jìn)行分析。由于上位機軟件主要有寫文件、讀校驗、讀操作3種針對下位機的數(shù)據(jù)操作,因此sp_DataReceived函數(shù)中也有3種不同的串口接收數(shù)據(jù)的方式,這里使用switch語句進(jìn)行模式之間的轉(zhuǎn)換,讀操作、寫文件和讀校驗分別對應(yīng)model中的1、2、3模式。
當(dāng)model為1時,進(jìn)入讀操作模式。為了將串口發(fā)送來的數(shù)據(jù)保存下來,首先需要定義一個一維8位無符號整數(shù)數(shù)組receiveddata用來存儲從串口緩沖區(qū)讀取到的數(shù)據(jù),而該數(shù)組的長度則由SerialPort的BytesToRead屬性(獲取串口輸入緩沖區(qū)中需要讀取的字節(jié)數(shù))決定。然后使用SerialPort的Read方法將從串口輸入緩沖區(qū)讀取的數(shù)據(jù)寫入到receiveddata數(shù)組中,這里將寫入的起始點設(shè)置為0,偏移量設(shè)置為receiveddata.Length,這樣receiveddata數(shù)組中的數(shù)據(jù)就被需要讀取的數(shù)據(jù)全部覆蓋了。接下來使用 SerialPort的DiscardInBuffer()方法釋放來自串口的接收緩沖區(qū)的數(shù)據(jù),防止接收緩沖區(qū)一直被舊的數(shù)據(jù)占用而不能再接收來自下位機的新數(shù)據(jù)。最后定義一個字符型變量strRcv,用來將receiveddata數(shù)組中的無符號整數(shù)元素轉(zhuǎn)換為字符弄并顯示到PC屏幕上。這里使用一個for循環(huán)將receiveddata數(shù)組中的所有元素強制轉(zhuǎn)換為char型按順序依次添加到strRcv中,再顯示到textBox2即軟件的接收數(shù)據(jù)區(qū)域中,這樣就完成了對下位機上OTP存儲芯片中數(shù)據(jù)的讀取操作。此部分主要代碼如下所示。
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; 當(dāng)model為2時,進(jìn)入寫文件模式。在寫文件模式中,也需要先將從下位機接收到的數(shù)據(jù)轉(zhuǎn)換為字符型顯示到接收數(shù)據(jù)區(qū)域中,因此這部分也需要讀操作的功能,將case1中的代碼復(fù)制下來即可。然而為了實現(xiàn)寫文件,不僅需要讀取下位機通過串口發(fā)送來的數(shù)據(jù),還需要將HEX文件中的數(shù)據(jù)通過串口發(fā)送給下位機。在發(fā)出將接收到的數(shù)據(jù)顯示到屏幕上的指令后,這里需要將當(dāng)前進(jìn)程掛起200 ms使用的是Thread. Sleep()語句。這樣做的原因是下位機發(fā)送數(shù)據(jù)到上位機是需要一定時間的,必需留有足夠的時間以確保上位機已經(jīng)完全接收到了下位機發(fā)送來的數(shù)據(jù)。在寫文件模式下,當(dāng)下位機準(zhǔn)備好接收來自上位機HEX文件中的數(shù)據(jù)時,會向上位機發(fā)送一個“OK”,之后每接收到一行HEX文件中的數(shù)據(jù)之后也會向上位機發(fā)送一個“OK”。這樣上位機就必須檢測接收到的數(shù)據(jù)中是否含有“OK”字符,這一步是通過字符串的Contains()方法實現(xiàn)的。當(dāng)檢測到接收的數(shù)據(jù)中包含“OK”,程序需要進(jìn)一步檢測當(dāng)前上位機發(fā)送的數(shù)據(jù)是否在HEX文件流的最后一行,通過獲取當(dāng)前文件的EndOfStream屬性來實現(xiàn)。如果當(dāng)前發(fā)送的數(shù)據(jù)不是在當(dāng)前文件的最后一行,就通過StreamReader的ReadLine()方法讀取當(dāng)前文件流中的一行字符數(shù)據(jù)并將其作為字符串返回,然后將這個字符串通過SerialPort的Write()方法寫入到串口,即將要寫入到OTP存儲器芯片的數(shù)據(jù)發(fā)送給下位機。為了使此軟件界面可視化更強,這里還使用了進(jìn)度條控件以顯示寫文件時HEX文件中數(shù)據(jù)加載的進(jìn)度。為了實現(xiàn)進(jìn)度條的顯示,這里定義了一個整型數(shù)據(jù)total,初始值為0,每當(dāng)將一行HEX數(shù)據(jù)發(fā)送給下位機后,total的值就+1,并且將total/512(此處以64kOTP存儲芯片為例,一行HEX數(shù)據(jù)為16Byte,一共有512行HEX數(shù)據(jù))的值賦給進(jìn)度條控件的Value屬性。最后使用SteamReader類的Close()釋放被占用的HEX文件以及讀取器,使用戶可以重新對HEX文件進(jìn)行編輯。此模式不同于讀操作模式的主要代碼如下所示。 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();} 當(dāng)model為3時,進(jìn)入讀校驗?zāi)J?。讀校驗?zāi)J胶妥x操作模式的區(qū)別在于:讀校驗?zāi)J皆谧x出OTP存儲器芯片的數(shù)據(jù)后需要與提前加載的HEX文件進(jìn)行比對,主要用來校驗已燒錄到芯片中的數(shù)據(jù)與原有的HEX文件中的數(shù)據(jù)是否匹配;而讀操作模式是直接把存儲器芯片給定地址區(qū)間的數(shù)據(jù)讀取出來。因此讀校驗?zāi)J胶蛯懳募J蕉夹枰獙EX文件中的數(shù)據(jù)通過串口加載到下位機當(dāng)中。而具體數(shù)據(jù)比較匹配的工作是由下位機完成的。這樣讀校驗?zāi)J讲糠值拇a和寫文件模式的代碼可以基本上保持一致,兩者的主要區(qū)別在于:在將下位機發(fā)送來的數(shù)據(jù)顯示到屏幕上后,讀校驗?zāi)J叫枰獙⒕€程掛起500 ms而不是200 ms。這樣做的原因主要是下位機中讀寫模式的不同造成的。在寫文件模式中,下位機每接收到一行HEX數(shù)據(jù)就會向上位機反饋一個“OK”,當(dāng)所有HEX數(shù)據(jù)都向下位機發(fā)送完畢后下位機才根據(jù)已經(jīng)接收到的數(shù)據(jù)開始對存儲器芯片進(jìn)行數(shù)據(jù)燒錄。雖然OTP存儲器燒錄數(shù)據(jù)的時間比較長,但是上位機程序中只需要給下位機發(fā)送“OK”和將其打印至屏幕上的過程留足時間,因此寫文件模式中在打印字符串指令發(fā)出后只需要將當(dāng)前進(jìn)程掛起200ms。而讀校驗?zāi)J街?,在下位機接收到HEX數(shù)據(jù)后,并不只是反饋給上位機一個 “OK”,還需要將讀取到的OTP存儲器中的數(shù)據(jù)和HEX數(shù)據(jù)對比匹配后把結(jié)果返回給上位機。當(dāng)二者一行的數(shù)據(jù)完全匹配時,下位機返回一個“OK”,而當(dāng)二者數(shù)據(jù)有不匹配的位時,下位機會分別把讀取到的數(shù)據(jù)和HEX數(shù)據(jù)一同返回到上位機并打印至屏幕上。正如上文所述,一行數(shù)據(jù)為16Byte,最不匹配的情況為二者數(shù)據(jù)每一個Byte都不一致,這樣就需要打印16行數(shù)據(jù)到PC的屏幕上。雖然下位機完成接收HEX數(shù)據(jù)、讀取OTP存儲器中的數(shù)據(jù)和比較二者數(shù)據(jù)所需的時間很短,但是將16行數(shù)據(jù)打印到屏幕上的時間較長。因此在讀校驗?zāi)J街行枰獙?dāng)前進(jìn)程掛起500 ms以等待下位機返回的數(shù)據(jù)全部都打印至屏幕上,而后再檢測返回的數(shù)據(jù)中是否包含“OK”,準(zhǔn)備下一次的數(shù)據(jù)接收。由于篇幅所限而且此部分代碼基本上與寫文件模式的代碼相同在此就不列出讀校驗?zāi)J降闹饕a。 通過制定測試方案,對國內(nèi)某反熔絲OTP存儲器件進(jìn)行了編程測試,以驗證本上位機軟件的基本功能。 讀操作模式如圖2所示。在設(shè)定好起始地址與結(jié)束地址后,點擊“讀操作”按鈕,軟件將依次讀取出存儲芯片上每一位地址上所存儲的數(shù)據(jù)。 圖2 讀操作模式 寫文件模式接收數(shù)據(jù)如圖3所示。當(dāng)加載好要燒錄的HEX數(shù)據(jù)文件之后,點擊“寫文件”按鈕,軟件將從下位機接收到若干個“OK”字符,以表示下位機接收HEX數(shù)據(jù)成功。此處選擇了燒錄10行HEX數(shù)據(jù),因此軟件在一共接收到10個“OK”后顯示“programming!”,此時下位機正在對存儲芯片進(jìn)行數(shù)據(jù)的燒錄。當(dāng)燒錄完成后,下位機返回一個“done!”,提示用戶已完成HEX數(shù)據(jù)的燒錄操作。 圖3 寫文件模式 讀校驗?zāi)J饺鐖D4所示。當(dāng)加載好要校驗的HEX數(shù)據(jù)文件之后,點擊“讀檢驗”按鈕,軟件將接收到下位機對數(shù)據(jù)進(jìn)行校驗之后的結(jié)果??梢钥闯?,當(dāng)存儲器芯片一位地址存儲的數(shù)據(jù)和要校驗的HEX數(shù)據(jù)一致時,下位機返回一個“OK”。而當(dāng)二者數(shù)據(jù)不匹配時,下位機剛會返回不匹配數(shù)據(jù)的地址以及該地址實際存儲的數(shù)據(jù)以及對應(yīng)的HEX數(shù)據(jù),并顯示“UNMATCH”。 圖4 讀校驗?zāi)J?/p> 該上位機以C#語言編寫,與基于ARM的下位機燒錄器通過串口進(jìn)行數(shù)據(jù)交換,再配合以特殊格式的HEX數(shù)據(jù)文件,可實現(xiàn)對OTP存儲器數(shù)據(jù)的讀取、燒錄與校驗操作。通過友好的可視化圖形用戶界面,該上位機軟件提供自動化、高效的數(shù)據(jù)讀寫方式。對國內(nèi)某反熔絲OTP器件進(jìn)行了讀寫測試,實際燒錄實驗表明,該上位機通過與下位機的串口通信可實現(xiàn)對反熔絲OTP器件的高效讀寫操作,并可根據(jù)預(yù)加載的HEX文件進(jìn)行數(shù)據(jù)的校驗,顯示出與HEX文件中不匹配的數(shù)據(jù),使OTP存儲器的測試工作變得更加簡單、便捷。 [1]王剛,李平,李威,等.反熔絲的研究與應(yīng)用[J].材料導(dǎo)報,2011, 25(11):30-33. [2]張頡夫.OTP存儲器編程與測試系統(tǒng)的設(shè)計技術(shù)研究[D].成都:電子科技大學(xué),2012. [3]張劍.OTP存儲器應(yīng)用開發(fā)技術(shù)研究[D].成都:電子科技大學(xué),2015. [4]孫承松,張麗娟,李新.ONO反熔絲的研究[J].沈陽工業(yè)大學(xué)學(xué)報,2006,28(5):546-548. [5]潘方.RS232串口通信在PC機與單片機通信中的應(yīng)用[J].現(xiàn)代電子技術(shù),2012,35(13):69-71. [6]Jack.Purdum.C#3.0面向?qū)ο缶幊蹋跰].葉雄兵,黃謙,譯.北京清華大學(xué)出版社,2009. The design and implementation of the upper computer software of OTP memory's programmer based on C# YAO Yuan1,TANG Ya-hua2 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 姚 遠(yuǎn)(1991—),男,山西晉中人,碩士。研究方向:大規(guī)模集成電路設(shè)計。4 對OTP存儲器的讀寫測試
5 結(jié)論
(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)