1、准备
(1)D-Flash的全局地址范围0x100000-0x107FFF,共32K。全分页。
(2)D-Flash读取时,都需要分页符访问。
(3)分页映射空间大小1K,地址范围0x800-0xBFF。
(4)分页符0x00-0x1F。
(5)注意,Flash空间里面的变化不能通过TBDML仿真观察,可以通过CAN/SCI等通信接口,将读回的数据上传到电脑端验证。
2、擦除、写编程的步骤
(1)设置合适的FCLK,XEP100型号建议频率设定在1MHz。
(2)读取FCLK,检查其最高位FDIVLD是否为1,如果为1,说明时钟初始化完成,可进行下一步。
(3)检查FSTAT的ACCERR、FPVIOL是否为1,如果为1,则向该位写1,清除该位(使其变为0)。
(4)按照NVM指令模式,先向FCCOBIX写索引号,再根据索引号对应的项,向FCCOB写入指令或地址或数据。具体按步骤(5)分步写。
(5)擦除操作如下:
MOVB #$00,FCCOBIX ;索引号00,对应需向FCCOB写入指令和D-Flash的高(22:16)位的地址
MOVW #$1210,FCCOB ; 擦除D-Flash指令 0x12, D-Flash全局地址从0x100000,所以这里写入10
MOVB #$01,FCCOBIX ;索引号01,对应需向FCCOB写入D-Flash的低(15:0)位地址
MOVW #$0000,FCCOB ;这里写入0x0000,D-Flash地址就是0x100000, 对应.prm里面的映射地址 第0页0x800开始。
编程4个字(8个字节),每次写D-Flash,至少一次性写8个字节。操作如下:
MOVB #$00,FCCOBIX ;索引号00
MOVW #$1110,FCCOB
MOVB #$01,FCCOBIX ;索引号01
MOVW #$0000,FCCOB
MOVB #$02,FCCOBIX ;索引号02开始,陆续向FCCOB写入4个字的数据
LDX #d_flash_dt
MOVW 2,X+,FCCOB
MOVB #$03,FCCOBIX ;索引号03,第二个字
MOVW 2,X+,FCCOB
MOVB #$04,FCCOBIX ;索引号04,第三个字
MOVW 2,X+,FCCOB
MOVB #$05,FCCOBIX ;索引号05,第四个字
MOVW 2,X+,FCCOB
(6)写入指令或相关的数据后,向FSTAT写入0x80,将其最高位CCIF置1,启动Flash指令的执行,然后检查FSTAT最高位是否变为0,检查指令是否执行完成,代码如下:
MOVB #$80,FSTAT
BRCLR FSTAT,mFSTAT_CCIF,* ; 指令执行时,最高位为0,如果再次变为1,则表示指令执行完毕。
3、读D-Flash
(1)先保存当前的EPAGE寄存器值,读数据操作完成后,需恢复EPAGE。假设需读取地址为addr的D-Flash中的数据。将addr右移10位,取低字节作为分页符EPAGE的值, EPAGE=addr>>10。 D-Flash全局地址空间 100000-107FFF(32K)。
(2)读D-Flash时,需要映射到0x800-0xBFF地址空间,空间大小为0x0-0x3FF, 因此将addr和0x3FF作&运算,再加上起始地址,就是实际用到的读取地址。 e_addr=(addr&0x3FF)+0x800
(3)分页符EPAGE设置完成,映射地址计算好后,就可以使用64k地址空间寻址的方式,读取D-Flash的数据了,代码如下:
addr DS.W 1 ;2个字节变量表示需要寻址的D-Flash地址,由于高位始终是10, 所以只取低16位地址来表示
e_addr DS.W 1
LDAA EPAGE
STAA last_epage ;保存当前的EPAGE值
LDX #10
LDD addr
lsr_addr: LSRD
DEX
CPX #0
BNE lsr_addr ;addr 右移10位
STAB EPAGE ;取addr的低字节值作为EPAGE
LDD addr
ANDA #$03
ANDB #$FF
ADDD #$800
STD e_addr ;计算得到全局地址对应的 映射地址
LDAA #$00
STAA EPAGE
LDX #sci_data ;变量:保存读取到的数据
LDY #e_addr
LDAB #4
read_df: MOVW 2,Y+,2,X+
DBNE B,read_df
MOVB last_epage,EPAGE ;恢复EPAGE
网友评论