本發(fā)明涉及嵌入式通信技術(shù)領(lǐng)域,尤其涉及一種光模塊固件(firmware)的實(shí)現(xiàn)方法。
背景技術(shù):
固件是一般存儲(chǔ)于設(shè)備中的EEPROM或FLASH芯片中的程序,通俗的理解就是“固化的軟件”。固件擔(dān)任著一個(gè)系統(tǒng)最基礎(chǔ)最底層工作的軟件。在硬件設(shè)備中,固件就是硬件設(shè)備的靈魂,因?yàn)橐恍┯布O(shè)備除了固件以外沒(méi)有其它軟件組成,因此固件也就決定著硬件設(shè)備的功能及性能。
光模塊是實(shí)現(xiàn)光電轉(zhuǎn)換的器件,由光電子器件、功能電路和光接口組成。光模塊固件是固化在光模塊內(nèi)部的PROM或EEPROM或FLASH ROM中的可執(zhí)行程序,負(fù)責(zé)協(xié)調(diào)和控制整個(gè)光模塊內(nèi)部的各種器件,使其按照預(yù)定的功能正常工作。在生產(chǎn)通信光模塊的過(guò)程中,需要對(duì)光模塊進(jìn)行各種性能參數(shù)測(cè)試。在當(dāng)前光模塊測(cè)試領(lǐng)域,通常的測(cè)試模式為:由一臺(tái)上位機(jī)(一般為電腦)通過(guò)中間轉(zhuǎn)接板(也可稱(chēng)之為協(xié)議轉(zhuǎn)換轉(zhuǎn)發(fā)模塊,其負(fù)責(zé)將上位機(jī)發(fā)送的協(xié)議轉(zhuǎn)換為待測(cè)試光模塊可以識(shí)別的協(xié)議,如RS232轉(zhuǎn)IIC、USB轉(zhuǎn)IIC等)向待測(cè)試光模塊發(fā)送測(cè)試數(shù)據(jù)?,F(xiàn)有的這種測(cè)試數(shù)據(jù)遷移保存方式,其操作較為復(fù)雜,且數(shù)據(jù)讀寫(xiě)效率不高,不符合現(xiàn)代工業(yè)對(duì)高效率及低成本的要求。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于,提出一種光模塊對(duì)批量測(cè)試數(shù)據(jù)整體遷移保存的方法,其操作簡(jiǎn)單靈活,且讀寫(xiě)效率較高,可以提高生產(chǎn)效率,降低生產(chǎn)成本。
為實(shí)現(xiàn)上述目的,本發(fā)明提供了一種光模塊對(duì)批量測(cè)試數(shù)據(jù)整體遷移保存的方法,其包括如下步驟:
步驟a,將待測(cè)光模塊通過(guò)數(shù)據(jù)總線(xiàn)與一主機(jī)通信;
步驟b,主機(jī)通過(guò)數(shù)據(jù)總線(xiàn)將模塊的測(cè)試數(shù)據(jù)寫(xiě)入到光模塊,或者讀取存儲(chǔ)在光模塊里面的測(cè)試數(shù)據(jù);
步驟c,光模塊通過(guò)其MCU的固件將寄存器RAM區(qū)的測(cè)試數(shù)據(jù)和存儲(chǔ)器FLASH區(qū)的測(cè)試數(shù)據(jù)整體映射;
步驟d,映射完成后,主機(jī)將光模塊RAM區(qū)和FLASH區(qū)的測(cè)試數(shù)據(jù)作為一個(gè)區(qū)域通過(guò)數(shù)據(jù)總線(xiàn)進(jìn)行整體大批量的讀寫(xiě)操作。
優(yōu)選的,本發(fā)明中所述的數(shù)據(jù)總線(xiàn)采用12C總線(xiàn)。
進(jìn)一步地,所述步驟c中,測(cè)試數(shù)據(jù)的整體映射包括:
步驟c1,固件將MCU的寄存器RAM區(qū)和存儲(chǔ)器FLASH區(qū)以單字節(jié)物理地址方式映射;
步驟c2,模塊上電后,固件將存儲(chǔ)器FLASH區(qū)的數(shù)據(jù)復(fù)制到對(duì)應(yīng)物理地址的存儲(chǔ)器RAM數(shù)據(jù)區(qū);
步驟c3,主機(jī)與光模塊之間的I2C通信數(shù)據(jù)全部在寄存器RAM區(qū);
步驟c4,主機(jī)通過(guò)I2C寫(xiě)數(shù)據(jù)到光模塊,光模塊MCU的固件記錄收到數(shù)據(jù)的寄存器RAM區(qū)物理地址,并記錄收到數(shù)據(jù)的總個(gè)數(shù),當(dāng)光模塊收到主機(jī)發(fā)送的I2C通信停止STOP命令,固件開(kāi)始將寄存器RAM區(qū)數(shù)據(jù)遷移入對(duì)應(yīng)映射的存儲(chǔ)器FLASH區(qū)。
更近一步地,所述將寄存器RAM區(qū)數(shù)據(jù)遷移入對(duì)應(yīng)映射的存儲(chǔ)器FLASH區(qū)的步驟還包括:
步驟c41,判斷12C總線(xiàn)寫(xiě)入的數(shù)據(jù)計(jì)數(shù)器是否大于測(cè)試數(shù)據(jù)總數(shù)減FLASH區(qū)頁(yè)字節(jié)數(shù);若是,則擦除所有測(cè)試數(shù)據(jù)映射存儲(chǔ)器FLASH區(qū)然后寫(xiě)入數(shù)據(jù);若否,則進(jìn)入步驟c42;
步驟c42,判斷接收數(shù)據(jù)起始地址是否大于接收數(shù)據(jù)結(jié)束地址;若是,則擦除起始地址所在頁(yè)到結(jié)束地址所在頁(yè)的存儲(chǔ)器FLASH區(qū),再將鏡像寄存器RAM區(qū)對(duì)應(yīng)地址空間的數(shù)據(jù)更新到擦除過(guò)的存儲(chǔ)器FLASH區(qū);若否,則進(jìn)入步驟c43;
步驟c43,擦除起始數(shù)據(jù)地址所在存儲(chǔ)器FLASH區(qū)頁(yè)一直到測(cè)試數(shù)據(jù)映射存儲(chǔ)器FLASH區(qū)的最后一頁(yè),再擦除測(cè)試數(shù)據(jù)映射存儲(chǔ)器FLASH區(qū)的起始頁(yè)一直到結(jié)束數(shù)據(jù)地址所在FLASH區(qū)頁(yè),然后將鏡像寄存器RAM區(qū)對(duì)應(yīng)地址空間的數(shù)據(jù)更新到擦除過(guò)的FLASH區(qū)域;
步驟c44,更新完FLASH后,清FLASH更新標(biāo)志,退出保存程序。
特別的,本發(fā)明所述主機(jī)與光模塊之間的12C通信按照光模塊實(shí)際測(cè)試數(shù)據(jù)的最大個(gè)數(shù)來(lái)拓展I2C總線(xiàn)通信的數(shù)據(jù)偏移地址,并拓展I2C總線(xiàn)讀取和寫(xiě)入的計(jì)數(shù)器。
本發(fā)明的光模塊對(duì)批量測(cè)試數(shù)據(jù)整體遷移保存的方法,其通過(guò)I2C總線(xiàn)實(shí)現(xiàn)光模塊對(duì)批量測(cè)試大數(shù)據(jù)的整體遷移保存,其讀寫(xiě)操作靈活簡(jiǎn)單高效,且提高了生產(chǎn)效率,降低生產(chǎn)成本。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明光模塊對(duì)批量測(cè)試數(shù)據(jù)整體遷移保存的方法一種具體實(shí)施例的流程圖;
圖2為本發(fā)明的原理框圖;
圖3為本發(fā)明一種具體實(shí)施例的I2C寫(xiě)數(shù)據(jù)示例時(shí)序圖;
圖4為本發(fā)明一種具體實(shí)施例的I2C讀數(shù)據(jù)示例時(shí)序圖;
圖5為本發(fā)明中MCU的I2C中斷處理流程圖;
圖6位本發(fā)明中RAM區(qū)和FLASH區(qū)鏡像保存流程圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
如圖1所示,本發(fā)明提供了一種光模塊對(duì)批量測(cè)試數(shù)據(jù)整體遷移保存的方法,其包括如下步驟:
步驟a,將待測(cè)光模塊通過(guò)數(shù)據(jù)總線(xiàn)與一主機(jī)通信。作為本發(fā)明的一種優(yōu)選實(shí)施例,所述的數(shù)據(jù)總線(xiàn)采用12C總線(xiàn)。該I2C(Inter-Integrated-Circuit)總線(xiàn)是由PHILIPS公司開(kāi)發(fā)的兩線(xiàn)式串行通信總線(xiàn),由數(shù)據(jù)線(xiàn)SDA和時(shí)鐘線(xiàn)SCL構(gòu)成同步串行總線(xiàn),可接收和發(fā)送數(shù)據(jù),最高速率可支持到400KHz。I2C作為一種兩線(xiàn)串行總線(xiàn),具有通信速率較高,占用硬件資源少的特點(diǎn),并且I2C總線(xiàn)減少了PCB板空間和芯片管腳,降低了互聯(lián)成本,而且它具有多主控特性。
步驟b,主機(jī)通過(guò)數(shù)據(jù)總線(xiàn)將模塊的測(cè)試數(shù)據(jù)寫(xiě)入到光模塊,或者讀取存儲(chǔ)在光模塊里面的測(cè)試數(shù)據(jù)。
步驟c,光模塊通過(guò)其MCU的固件將寄存器RAM區(qū)的測(cè)試數(shù)據(jù)和存儲(chǔ)器FLASH區(qū)的測(cè)試數(shù)據(jù)整體映射。進(jìn)一步地,該步驟c中,測(cè)試數(shù)據(jù)的整體映射包括:步驟c1,固件將MCU的寄存器RAM區(qū)和存儲(chǔ)器FLASH區(qū)以單字節(jié)物理地址方式映射;步驟c2,模塊上電后,固件將存儲(chǔ)器FLASH區(qū)的數(shù)據(jù)復(fù)制到對(duì)應(yīng)物理地址的存儲(chǔ)器RAM數(shù)據(jù)區(qū);步驟c3,主機(jī)與光模塊之間的I2C通信數(shù)據(jù)全部在寄存器RAM區(qū);步驟c4,主機(jī)通過(guò)I2C寫(xiě)數(shù)據(jù)到光模塊,光模塊MCU的固件記錄收到數(shù)據(jù)的寄存器RAM區(qū)物理地址,并記錄收到數(shù)據(jù)的總個(gè)數(shù),當(dāng)光模塊收到主機(jī)發(fā)送的I2C通信停止STOP命令,固件開(kāi)始將寄存器RAM區(qū)數(shù)據(jù)遷移入對(duì)應(yīng)映射的存儲(chǔ)器FLASH區(qū)。
在本發(fā)明具體實(shí)施例中,為了保證通信的實(shí)時(shí)性,光模塊集成的MCU采用中斷方式處理I2C總線(xiàn)通信。為了保證存儲(chǔ)器FLASH程序正常運(yùn)行,MCU在中斷里面必須把I2C需要讀寫(xiě)的數(shù)據(jù)緩存在寄存器RAM,等待I2C的Master主設(shè)備完成數(shù)據(jù)寫(xiě)操作,MCU再將寄存器RAM緩存數(shù)據(jù)保存到對(duì)應(yīng)的存儲(chǔ)器FLASH空間。因此必須建立寄存器RAM區(qū)和存儲(chǔ)器FLASH區(qū)的物理地址映射關(guān)系。
需要注意的是,由于存儲(chǔ)器FLASH區(qū)是按頁(yè)的物理格式,所以將寄存器RAM區(qū)數(shù)據(jù)遷移入對(duì)應(yīng)映射的存儲(chǔ)器FLASH區(qū)必須按FLASH頁(yè)格式處理。因此本發(fā)明中將寄存器RAM區(qū)數(shù)據(jù)遷移入對(duì)應(yīng)映射的存儲(chǔ)器FLASH區(qū)的步驟還包括:
步驟c41,判斷12C總線(xiàn)寫(xiě)入的數(shù)據(jù)計(jì)數(shù)器是否大于測(cè)試數(shù)據(jù)總數(shù)減FLASH區(qū)頁(yè)字節(jié)數(shù);若是,則擦除所有測(cè)試數(shù)據(jù)映射存儲(chǔ)器FLASH區(qū)然后寫(xiě)入數(shù)據(jù);若否,則進(jìn)入步驟c42;
步驟c42,判斷接收數(shù)據(jù)起始地址是否大于接收數(shù)據(jù)結(jié)束地址;若是,則擦除起始地址所在頁(yè)到結(jié)束地址所在頁(yè)的存儲(chǔ)器FLASH區(qū),再將鏡像寄存器RAM區(qū)對(duì)應(yīng)地址空間的數(shù)據(jù)更新到擦除過(guò)的存儲(chǔ)器FLASH區(qū);若否,則進(jìn)入步驟c43;
步驟c43,擦除起始數(shù)據(jù)地址所在存儲(chǔ)器FLASH區(qū)頁(yè)一直到測(cè)試數(shù)據(jù)映射存儲(chǔ)器FLASH區(qū)的最后一頁(yè),再擦除測(cè)試數(shù)據(jù)映射存儲(chǔ)器FLASH區(qū)的起始頁(yè)一直到結(jié)束數(shù)據(jù)地址所在FLASH區(qū)頁(yè),然后將鏡像寄存器RAM區(qū)對(duì)應(yīng)地址空間的數(shù)據(jù)更新到擦除過(guò)的FLASH區(qū)域;
步驟c44,更新完FLASH后,清FLASH更新標(biāo)志,退出保存程序。
步驟d,映射完成后,主機(jī)將光模塊RAM區(qū)和FLASH區(qū)的測(cè)試數(shù)據(jù)作為一個(gè)區(qū)域通過(guò)數(shù)據(jù)總線(xiàn)進(jìn)行整體大批量的讀寫(xiě)操作。
特別的,本發(fā)明所述主機(jī)與光模塊之間的12C通信按照光模塊實(shí)際測(cè)試數(shù)據(jù)的最大個(gè)數(shù)來(lái)拓展I2C總線(xiàn)通信的數(shù)據(jù)偏移地址,并拓展I2C總線(xiàn)讀取和寫(xiě)入的計(jì)數(shù)器。MCU在I2C通信過(guò)程中將接收到的數(shù)據(jù)緩存在寄存器RAM,記錄接收數(shù)據(jù)的數(shù)據(jù)地址和數(shù)據(jù)個(gè)數(shù),并判斷數(shù)據(jù)地址是否大于寄存器RAM邊界尾地址,若大于,則將數(shù)據(jù)地址重置為寄存器RAM邊界首地址。MCU在主循環(huán)程序中讀取I2C狀態(tài)寄存器,判斷I2C總線(xiàn)是否空閑。若I2C總線(xiàn)忙,說(shuō)明此次I2C通信還未結(jié)束,主程序跳過(guò)存儲(chǔ)器FLASH保存操作;若I2C總線(xiàn)空閑,則主程序執(zhí)行存儲(chǔ)器FLASH數(shù)據(jù)保存操作,將接收到的數(shù)據(jù)從寄存器RAM整體映射到對(duì)應(yīng)的存儲(chǔ)器FLASH區(qū)域。
如圖2所示,為本發(fā)明的原理框圖,光模塊的MCU將存儲(chǔ)器FLASH區(qū)測(cè)試數(shù)據(jù)映射到寄存器RAM區(qū),I2C總線(xiàn)讀寫(xiě)數(shù)據(jù)全部緩存在寄存器RAM區(qū),當(dāng)有數(shù)據(jù)寫(xiě)入寄存器RAM區(qū)時(shí),MCU將寄存器RAM區(qū)數(shù)據(jù)映射到對(duì)應(yīng)的存儲(chǔ)器FLASH區(qū)。具體的,I2C主設(shè)備發(fā)送I2C從器件設(shè)備地址和“寫(xiě)”操作,等待I2C從器件應(yīng)答信號(hào)ACK后,I2C主設(shè)備發(fā)送數(shù)據(jù)偏移地址RegAddr,RegAddr可為單字節(jié)或多字節(jié),每發(fā)送一個(gè)字節(jié)偏移地址,I2C從器件接受成功都會(huì)返回應(yīng)答信號(hào)ACK,若為多字節(jié)地址,則I2C從器件在接受完數(shù)據(jù)偏移地址后,必須按約定時(shí)序計(jì)算數(shù)據(jù)偏移地址,并且將起始地址緩存記憶;I2C主設(shè)備成功發(fā)送完數(shù)據(jù)偏移地址后,I2C主設(shè)備繼續(xù)發(fā)送數(shù)據(jù)Data,I2C從器件每接收到一個(gè)字節(jié)數(shù)據(jù)后,將數(shù)據(jù)Data緩存到對(duì)應(yīng)數(shù)據(jù)偏移地址的寄存器RAM并返回應(yīng)答信號(hào)ACK,并自動(dòng)將數(shù)據(jù)偏移地址加1,并記錄寫(xiě)入數(shù)據(jù)個(gè)數(shù).當(dāng)數(shù)據(jù)偏移地址達(dá)到最大值后,數(shù)據(jù)偏移地址會(huì)自動(dòng)翻轉(zhuǎn),即數(shù)據(jù)偏移地址變成最小值。I2C主設(shè)備發(fā)送I2C從器件設(shè)備地址和“讀”操作,I2C從器件正確的I2C地址后會(huì)返回應(yīng)答信號(hào)ACK,I2C從器件根據(jù)記錄的數(shù)據(jù)偏移地址將對(duì)應(yīng)的寄存器RAM區(qū)數(shù)據(jù)跟隨I2C主設(shè)備緊接的一個(gè)字節(jié)SCL時(shí)鐘將數(shù)據(jù)發(fā)送給I2C主設(shè)備;I2C主設(shè)備依據(jù)自己需求,如果需要繼續(xù)讀取數(shù)據(jù)則給I2C從器件下發(fā)應(yīng)答信號(hào)ACK,I2C從器件則會(huì)把下一地址數(shù)據(jù)在I2C主設(shè)備的緊接的一個(gè)字節(jié)SCL時(shí)鐘發(fā)送給I2C主設(shè)備;如果不需要繼續(xù)讀數(shù)據(jù)I2C主設(shè)備則下發(fā)無(wú)應(yīng)答信號(hào)NO ACK。I2C主設(shè)備不需要再進(jìn)行讀寫(xiě)數(shù)據(jù)后,向I2C從器件發(fā)送停止命令STOP。模塊在判斷到寫(xiě)數(shù)據(jù)和停止命令STOP,開(kāi)始保存數(shù)據(jù),步驟如下:
在保存數(shù)據(jù)函數(shù)里面,根據(jù)緩存記憶的起始地址將該地址的寄存器RAM區(qū)數(shù)據(jù)起始地址和存儲(chǔ)器FLASH區(qū)數(shù)據(jù)起始地址一一映射,并根據(jù)寫(xiě)入數(shù)據(jù)個(gè)數(shù)計(jì)算出寄存器RAM區(qū)數(shù)據(jù)結(jié)束地址和相對(duì)應(yīng)的存儲(chǔ)器FLASH區(qū)數(shù)據(jù)結(jié)束地址;由于FLASH是按頁(yè)擦除,所以存儲(chǔ)器FLASH區(qū)數(shù)據(jù)起始地址和數(shù)據(jù)結(jié)束地址必須偏移至其該頁(yè)的起始地址。然后根據(jù)起始地址和結(jié)束地址,將對(duì)應(yīng)的寄存器RAM區(qū)數(shù)據(jù)按存儲(chǔ)器FLASH區(qū)頁(yè)方式整體遷移并保存到存儲(chǔ)器FLASH區(qū)中。
圖3是以測(cè)試數(shù)據(jù)為0到64K字節(jié)為例的I2C寫(xiě)時(shí)序圖。I2C主設(shè)備發(fā)送開(kāi)始命令START后,發(fā)送I2C從器件地址和“寫(xiě)”控制位;I2C從器件成功接收正確的I2C器件地址后返回應(yīng)答信號(hào)ACK,I2C主設(shè)備在發(fā)送下一SCL時(shí)鐘會(huì)收到該ACK信號(hào),然后再連續(xù)發(fā)送兩個(gè)字節(jié)的數(shù)據(jù)偏移地址;然后I2C主設(shè)備依據(jù)實(shí)際測(cè)試數(shù)據(jù)量發(fā)送N(1-64K)個(gè)字節(jié),I2C從機(jī)器件在收到字節(jié)數(shù)據(jù)后都會(huì)在緊隨的SCL時(shí)鐘返回ACK。I2C主設(shè)備發(fā)送完數(shù)據(jù)后,發(fā)送停止命令STOP。
圖4是以測(cè)試數(shù)據(jù)為0到64K字節(jié)為例的I2C讀時(shí)序圖,I2C主設(shè)備發(fā)送開(kāi)始命令START后,發(fā)送I2C從器件設(shè)備地址和“寫(xiě)”控制位,I2C從器件接收到正確的器件地址后返回應(yīng)答信號(hào)ACK;I2C主設(shè)備在發(fā)送下一SCL時(shí)鐘會(huì)收到該ACK信號(hào),然后發(fā)送開(kāi)始命令RESTART和I2C從器件設(shè)備地址帶“讀”控制位,I2C從器件接收到正確的器件地址后返回應(yīng)答信號(hào)ACK;I2C主設(shè)備下一SCL時(shí)鐘收到該ACK信號(hào)后,根據(jù)自己實(shí)際需要讀取N(1-64K)個(gè)字節(jié)數(shù)據(jù),I2C主設(shè)備在讀取最后一個(gè)字節(jié)數(shù)據(jù)之前,每接收完一個(gè)字節(jié)數(shù)據(jù)返回應(yīng)答信號(hào)ACK給I2C從器件,最后一個(gè)字節(jié)則返回非應(yīng)答信號(hào)NO ACK;然后I2C主設(shè)備發(fā)送停止命令STOP。
圖5是模塊MCU固件里I2C中斷處理程序流程圖:固件進(jìn)入I2C中斷子程序后,會(huì)根據(jù)I2C中斷狀態(tài)進(jìn)行不同的處理。接收中斷時(shí),會(huì)記錄接收起始數(shù)據(jù)偏移地址DataAdr,并將接收數(shù)據(jù)保存到DataAdr數(shù)據(jù)地址對(duì)應(yīng)的寄存器RAM區(qū);并將數(shù)據(jù)地址DataAdr加1,判斷數(shù)據(jù)地址是否超過(guò)測(cè)試數(shù)據(jù)偏移地址最大值,是則將地址DataAdr清零,實(shí)現(xiàn)數(shù)據(jù)偏移地址自動(dòng)翻轉(zhuǎn)功能;接收計(jì)數(shù)器CNT加1;標(biāo)記FLASH更新標(biāo)志,以便在I2C通信結(jié)束后更新存儲(chǔ)器FLASH區(qū)數(shù)據(jù);最后退出中斷。
MCU產(chǎn)生I2C從器件發(fā)送數(shù)據(jù)中斷時(shí),同樣先記錄待發(fā)送數(shù)據(jù)的起始地址DataAdr,將DataAdr數(shù)據(jù)地址對(duì)應(yīng)的RAM D處數(shù)據(jù)賦給數(shù)據(jù)發(fā)送寄存器;并將數(shù)據(jù)地址DataAdr加1,而且判斷地址是否超過(guò)測(cè)試數(shù)據(jù)偏移地址最大值,是則將數(shù)據(jù)地址DataAdr清零,實(shí)現(xiàn)數(shù)據(jù)偏移地址自動(dòng)翻轉(zhuǎn)功能;然后退出中斷。
圖6是固件將寄存器RAM區(qū)更新的數(shù)據(jù)到保存到映射的FLASH區(qū)的程序流程圖。程序會(huì)先判斷存儲(chǔ)器FLASH區(qū)更新標(biāo)志開(kāi)關(guān)是否置位;否則無(wú)需更新FLASH區(qū)數(shù)據(jù),返回主程序;是則開(kāi)始更新存儲(chǔ)器FLASH區(qū)數(shù)據(jù)。更新流程如下:
判斷I2C寫(xiě)入的數(shù)據(jù)計(jì)數(shù)器是否大于測(cè)試數(shù)據(jù)總數(shù)減FLASH區(qū)頁(yè)字節(jié)數(shù);是則擦除所有測(cè)試數(shù)據(jù)映射存儲(chǔ)器FLASH區(qū)域然后寫(xiě)入數(shù)據(jù);如果不是,則判斷接收數(shù)據(jù)起始地址是否大于接收數(shù)據(jù)結(jié)束地址;如果是,則擦除起始地址所在頁(yè)到結(jié)束地址所在頁(yè)的存儲(chǔ)器FLASH區(qū)域,然后將鏡像寄存器RAM區(qū)對(duì)應(yīng)地址空間的數(shù)據(jù)更新到擦除過(guò)的存儲(chǔ)器FLASH區(qū)域;如果否,則在接收數(shù)據(jù)的過(guò)程中發(fā)生了地址翻轉(zhuǎn),擦除起始數(shù)據(jù)地址所在存儲(chǔ)器FLASH頁(yè)一直到測(cè)試數(shù)據(jù)映射存儲(chǔ)器FLASH區(qū)的最后一頁(yè),再擦除測(cè)試數(shù)據(jù)映射存儲(chǔ)器FLASH的起始頁(yè)一直到結(jié)束數(shù)據(jù)地址所在FLASH頁(yè),然后將鏡像寄存器RAM區(qū)對(duì)應(yīng)地址空間的數(shù)據(jù)更新到擦除過(guò)的FLASH區(qū)域;更新完FLASH區(qū)數(shù)據(jù)后,清FLASH區(qū)更新標(biāo)志,退出保存程序。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。