原创 PIC18F25J10的内部FLASH读写

2007-2-9 17:15 5814 7 10 分类: MCU/ 嵌入式

一个困扰了好久的问题,对18F25J10片内FLASH的写总是有问题。对照了microchip的datasheet,感觉没什么问题呀。郁闷。


今天microchip的石老师和goldenchip的李工大驾光临公司,三个人反复试了半天。最后........终于搞定。


NND,microchip的datasheet不太对头。照着那个去写一定不对。


对照一下,microchip的


/*----------------------------------------------------------*/


   MOVLW CODE_ADDR_UPPER  ; Load TBLPTR with the base
   MOVWF TBLPTRU   ; address of the memory block
   MOVLW CODE_ADDR_HIGH
   MOVWF TBLPTRH
   MOVLW CODE_ADDR_LOW
   MOVWF TBLPTRL
ERASE_BLOCK
   BSF EECON1, WREN  ; enable write to memory
   BSF EECON1, FREE  ; enable Row Erase operation
   BCF INTCON, GIE  ; disable interrupts
   MOVLW 55h
   MOVWF EECON2   ; write 55h
   MOVLW 0AAh
   MOVWF EECON2   ; write 0AAh
   BSF EECON1, WR   ; start erase (CPU stall)
   BSF INTCON, GIE  ; re-enable interrupts
   MOVLW D'16'
   MOVWF WRITE_COUNTER  ; Need to write 16 blocks of 64 to write
      ; one erase block of 1024
RESTART_BUFFER
   MOVLW D'64'
   MOVWF COUNTER
   MOVLW BUFFER_ADDR_HIGH  ; point to buffer
   MOVWF FSR0H
   MOVLW BUFFER_ADDR_LOW
   MOVWF FSR0L
   ILL_BUFFER
   ...    ; read the new data from I2C, SPI,
      ; PSP, USART, etc.
WRITE_BUFFER
   MOVLW D'64'         ; number of bytes in holding register
   MOVWF COUNTER
   RITE_BYTE_TO_HREGS
   MOVFF POSTINC0, WREG  ; get low byte of buffer data
   MOVWF TABLAT   ; present data to table latch
   TBLWT+*   ; write data, perform a short write
      ; to internal TBLWT holding register.
   DECFSZ COUNTER   ; loop until buffers are full
   BRA WRITE_WORD_TO_HREGS
PROGRAM_MEMORY
   BSF EECON1, WREN  ; enable write to memory
   BCF INTCON, GIE  ; disable interrupts
   MOVLW 55h
   MOVWF EECON2   ; write 55h
   MOVLW 0AAh
   MOVWF EECON2   ; write 0AAh
   BSF EECON1, WR   ; start program (CPU stall)
   BSF INTCON, GIE  ; re-enable interrupts
   BCF EECON1, WREN  ; disable write to memory
   DECFSZ WRITE_COUNTER  ; done with one write cycle
   BRA RESTART_BUFFER  ; if not done replacing the erase block


/*------------------------------------------------------------*/


俺自己的:


 


/*-------------------------------------------------------------*/


void Flash_Write(const UINT8 *pDest,UINT8 *pSour,UINT8 length)
{
 UINT8 i;
 UINT16 *ppp;
 ppp=&pDest ;
 TBLPTRU=0;
 TBLPTRH=(*ppp )>>8;
 TBLPTRL=(*ppp) &0xff;
 for(i=0;i<64;i++) {
 TABLAT = *pSour;
 pSour++;
 asm("TBLWT *+");
 }
 ppp=&pDest;
 TBLPTRU=0;
 TBLPTRH=(*ppp )>>8;
 TBLPTRL=(*ppp) & 0xff;
 WREN=1;
 GIE=0;
 EECON2=0x55;
 EECON2=0xaa;
 WR=1;
 GIE=1;
 WREN=0;
}


/*--------------------------------------------------------------*/


microchip的代码有两个问题


1。没有在写入之前重新对TBLPTR置数


2。 "TBLWT+*  " 是错误的。应该是"TBLWT *+"。


要了亲命了。搞了一个多礼拜。


希望microchip赔我


也希望microchip能更快修改datasheet。


对microchip的石老师表示衷心的感谢!


注:用HT-PICC18编译的C代码。目前的写入代码还有一点点小问题。嘿嘿。有没有发现?


void Flash_Write(const UINT8 *pDest,UINT8 *pSour,UINT8 length)
目前最后一个参数length并没有用在程序中,实际应用要注意。length一定要小于64


因为18F25J10的FLASH写是一次写入64个字节。无论你的pSour和pDest是多长的数组,都是一次写64个字节到pDest。因为写之前有擦除过程,即使写入的是小于64个字节,length后面的字节也都是0xff。换句话说,无论length是多少,length后面的数据都是无意义的。


你一次写入的数据一定是小于64的。如果要写入的数据多于64个,那就要多次写入。切记!


 

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户742281 2010-1-20 22:43

大哥你好,我是经营IC的。不知道PIC18F25J10这个型号你还有没有在用,小弟这里有绝对的价格优势绝对的正品,有需要请联系;0755-61306836郑生或http://wangzhe8.ic.net.cn/newhome/style1.asp咨询。打搅之处请见谅。

用户212008 2009-7-4 15:46

学习了,我也要写FLASH, 回头实验下.

用户1177633 2008-7-8 14:50

大哥,你这个写FLASH函数不太对,应该改为: TBLPTRU=0; TBLPTRH=(*ppp )>>8; TBLPTRL=(*ppp) &0xff; for(i=0;i<64;i++) { TABLAT = *pSour; pSour++; if(i != 0) asm("TBLWT *+"); else asm("TBLWT *"); } //ppp=&pDest; //TBLPTRU=0; //TBLPTRH=(*ppp )>>8; //TBLPTRL=(*ppp) & 0xff;

用户1053025 2006-11-27 12:49

应该是南方吧,北京都下过一场小雪了。

相关推荐阅读
用户81954 2007-02-09 17:50
用ICD2读芯片FLASH会改写FLASH?
PIC仿真一直用ICD2。因为和MPLAB整合得好,所以尽管功能受限,可还是一直在用。前一段仿真18F25J10,发现一个邪门的问题:我向FLASH烧写并校验了数据,可再用ICD2一读出,就发现FLA...
用户81954 2006-11-20 14:42
开通了
呼..........好歹也在这有这么一苗三分地了。此博是我开,此树是我栽,要从此处过..............................................Guy欢迎欢迎...
我要评论
3
7
关闭 站长推荐上一条 /3 下一条