一个困扰了好久的问题,对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个,那就要多次写入。切记!
用户742281 2010-1-20 22:43
用户212008 2009-7-4 15:46
用户1177633 2008-7-8 14:50
用户1053025 2006-11-27 12:49
应该是南方吧,北京都下过一场小雪了。