1系忙、準(zhǔn)備
(1)D-Flash的全局地址范圍0x100000-0x107FFF诵盼,共32K。全分頁(yè)银还。
(2)D-Flash讀取時(shí)风宁,都需要分頁(yè)符訪問(wèn)。
(3)分頁(yè)映射空間大小1K蛹疯,地址范圍0x800-0xBFF戒财。
(4)分頁(yè)符0x00-0x1F。
(5)注意捺弦,F(xiàn)lash空間里面的變化不能通過(guò)TBDML仿真觀察饮寞,可以通過(guò)CAN/SCI等通信接口孝扛,將讀回的數(shù)據(jù)上傳到電腦端驗(yàn)證。
2幽崩、擦除苦始、寫編程的步驟
(1)設(shè)置合適的FCLK,XEP100型號(hào)建議頻率設(shè)定在1MHz慌申。
(2)讀取FCLK陌选,檢查其最高位FDIVLD是否為1,如果為1蹄溉,說(shuō)明時(shí)鐘初始化完成咨油,可進(jìn)行下一步。
(3)檢查FSTAT的ACCERR柒爵、FPVIOL是否為1役电,如果為1,則向該位寫1棉胀,清除該位(使其變?yōu)?)法瑟。
(4)按照NVM指令模式,先向FCCOBIX寫索引號(hào)膏蚓,再根據(jù)索引號(hào)對(duì)應(yīng)的項(xiàng)瓢谢,向FCCOB寫入指令或地址或數(shù)據(jù)畸写。具體按步驟(5)分步寫驮瞧。
(5)擦除操作如下:
??????????? MOVB #$00,FCCOBIX???????????????????????? ;索引號(hào)00枯芬,對(duì)應(yīng)需向FCCOB寫入指令和D-Flash的高(22:16)位的地址
? ? ? ? ? ? MOVW? ? #$1210,FCCOB???????????????????? 论笔; 擦除D-Flash指令 0x12,? D-Flash全局地址從0x100000千所,所以這里寫入10
? ? ? ? ? ? MOVB? ? #$01,FCCOBIX?????????????????????? 狂魔;索引號(hào)01,對(duì)應(yīng)需向FCCOB寫入D-Flash的低(15:0)位地址
? ? ? ? ? ? MOVW? ? #$0000,FCCOB????????????????????? 淫痰;這里寫入0x0000最楷,D-Flash地址就是0x100000, 對(duì)應(yīng).prm里面的映射地址 第0頁(yè)0x800開始待错。
?????? 編程4個(gè)字(8個(gè)字節(jié))籽孙,每次寫D-Flash,至少一次性寫8個(gè)字節(jié)火俄。操作如下:
?????????? MOVB #$00,FCCOBIX????????????????????????????? 犯建;索引號(hào)00
? ? ? ? ? ? MOVW? ? #$1110,FCCOB
? ? ? ? ? ? MOVB? ? #$01,FCCOBIX?????????????????????????? ;索引號(hào)01
? ? ? ? ? ? MOVW? ? #$0000,FCCOB
? ? ? ? ? ? MOVB? ? #$02,FCCOBIX??????????????????????????? 瓜客;索引號(hào)02開始适瓦,陸續(xù)向FCCOB寫入4個(gè)字的數(shù)據(jù)
? ? ? ? ? ? LDX? ? #d_flash_dt
? ? ? ? ? ? MOVW? ? 2,X+,FCCOB
? ? ? ? ? ? MOVB? ? #$03,FCCOBIX?????????????????????????????? 竿开;索引號(hào)03,第二個(gè)字
? ? ? ? ? ? MOVW? ? 2,X+,FCCOB
? ? ? ? ? ? MOVB? ? #$04,FCCOBIX?????????????????????????????? 玻熙;索引號(hào)04否彩,第三個(gè)字
? ? ? ? ? ? MOVW? ? 2,X+,FCCOB
? ? ? ? ? ? MOVB? ? #$05,FCCOBIX??????????????????????????????? ;索引號(hào)05嗦随,第四個(gè)字
? ? ? ? ? ? MOVW? ? 2,X+,FCCOB
(6)寫入指令或相關(guān)的數(shù)據(jù)后胳搞,向FSTAT寫入0x80,將其最高位CCIF置1称杨,啟動(dòng)Flash指令的執(zhí)行肌毅,然后檢查FSTAT最高位是否變?yōu)?,檢查指令是否執(zhí)行完成姑原,代碼如下:
??????????? MOVB #$80,FSTAT
? ? ? ? ? ? BRCLR? FSTAT,mFSTAT_CCIF,*??????????????????? 悬而; 指令執(zhí)行時(shí),最高位為0锭汛,如果再次變?yōu)?笨奠,則表示指令執(zhí)行完畢。
3唤殴、讀D-Flash
(1)先保存當(dāng)前的EPAGE寄存器值般婆,讀數(shù)據(jù)操作完成后,需恢復(fù)EPAGE朵逝。假設(shè)需讀取地址為addr的D-Flash中的數(shù)據(jù)蔚袍。將addr右移10位,取低字節(jié)作為分頁(yè)符EPAGE的值配名,? EPAGE=addr>>10啤咽。?????????? D-Flash全局地址空間 100000-107FFF(32K)。
(2)讀D-Flash時(shí)渠脉,需要映射到0x800-0xBFF地址空間宇整,空間大小為0x0-0x3FF, 因此將addr和0x3FF作&運(yùn)算芋膘,再加上起始地址鳞青,就是實(shí)際用到的讀取地址。???? e_addr=(addr&0x3FF)+0x800
(3)分頁(yè)符EPAGE設(shè)置完成为朋,映射地址計(jì)算好后臂拓,就可以使用64k地址空間尋址的方式,讀取D-Flash的數(shù)據(jù)了潜腻,代碼如下:
??????????? addr??????? DS.W ? 1 ????????????????????????? 埃儿;2個(gè)字節(jié)變量表示需要尋址的D-Flash地址,由于高位始終是10融涣, 所以只取低16位地址來(lái)表示
??????? ?? e_addr???? DS.W?? 1
??????????? LDAA EPAGE
? ? ? ? ? ? STAA? ? last_epage????????????????????? 童番;保存當(dāng)前的EPAGE值
??????????? LDX????? #10
??????????? LDD????? addr
lsr_addr:??????? LSRD ?????
????????????????????? DEX
????????????????????? CPX ? ? ? #0 ?????????
????????????????????? BNE?????? lsr_addr??????????????? 精钮;addr? 右移10位
??????????? STAB ?? EPAGE ???????????????????? ;取addr的低字節(jié)值作為EPAGE
??????????? LDD????? addr
??????????? ANDA?? #$03
??????????? ANDB??? #$FF
?????????? ADDD??? #$800
??????????? STD?????? e_addr?????????????????????? 剃斧;計(jì)算得到全局地址對(duì)應(yīng)的 映射地址
? ? ? ? ? ? LDAA? ? #$00
? ? ? ? ? ? STAA? ? EPAGE
? ? ? ? ? ? LDX? ? #sci_data??????????????????????? 轨香;變量:保存讀取到的數(shù)據(jù)
? ? ? ? ? ? LDY? ? #e_addr
? ? ? ? ? ? LDAB? ? #4
read_df:? ? MOVW? ? 2,Y+,2,X+
? ? ? ? ? ? ? ?? DBNE? ? B,read_df
? ? ? ? ? ?????? MOVB? ? last_epage,EPAGE????????????? ;恢復(fù)EPAGE