本人最近用PIC18F8720外扩一片28F320来作为256色彩屏LCD的显存。对28F320的解锁,擦除,读取操作已成功,可是对FLASH的BUFFER编程操作总是出问题,每次对大约4Kbytes左右的空间进行buffer编程(一次写入32字节)时,总是会有6、7个或者10来个buffer编程不成功。高手请指点一下!以下是本人的代码<br />/*****************************************************************************<br />*功能说明:对FLASH缓冲区编程操作(一次性写入16WROD)<br />*入口参数:<br />* BufferAddr-写入首地址(BufferAddr须为32的倍数)<br />* DataBuff-待写入FLASH的数据缓冲区首址<br />*返回参数:<br />*****************************************************************************/<br />void Flash_WriteBuffer(uint32 BuffAddr,uchar *DataBuff)<br />{<br /> uchar blocknum=0;<br /> uchar portbnum=0;<br /> uchar addrU=0;<br /> uchar addrH=0;<br /> uchar addrL=0;<br /> uchar Temp1=0,Temp2=0;<br /> uint overtime=0;<br /> uchar i=0;<br /> portbnum=(uchar)((BuffAddr&0x300000)>>20); //取出地址的最高2位<br /> blocknum=(uchar)((BuffAddr&0x3e0000)>>16); //取出BLOCI地址<br /> addrU=(uchar)((BuffAddr&0x3f0000)>>16); <br /> addrH=(uchar)((BuffAddr&0x00ff00)>>8);<br /> addrL=(uchar)(BuffAddr&0x0000ff);<br /> MEMCON=0X22;<br />do{<br /> Choose_Portb_Addr(portbnum);<br /> TBLPTRU=blocknum&0x0e;<br /> TBLPTRH=0X00;<br /> TBLPTRL=0X00;<br /> TABLAT=0x50; //Clear the Status register<br /> asm("TBLWT*+");<br /> TABLAT=0x50;<br /> asm("TBLWT*");<br /> OverTimeCount1=0x00; //Clear the overtime counter<br /> while(1)<br /> {<br /> Choose_Portb_Addr(portbnum);<br /> TBLPTRU=blocknum&0x0e;<br /> TBLPTRH=0X00;<br /> TBLPTRL=0X00;<br /> TABLAT=0xE8; //Write Buffer Porgram Command<br /> asm("TBLWT*+");<br /> TABLAT=0XE8;<br /> asm("TBLWT*");<br /> <br /> Choose_Portb_Addr(portbnum);<br /> TBLPTRU=blocknum&0x0e;<br /> TBLPTRH=0X00;<br /> TBLPTRL=0X00;<br /> asm("TBLRD*+");<br /> Temp1=TABLAT; //Read XSR status register<br /> asm("TBLRD*");<br /> Temp2=TABLAT;<br /> if(Temp1&0x80) //如果缓冲区有效,则对缓冲区进行编程<br /> {<br /> Choose_Portb_Addr(portbnum);<br /> TBLPTRU=blocknum&0x0e;<br /> TBLPTRH=0X00;<br /> TBLPTRL=0X00;<br /> TABLAT=0x0f; //Write Buffer length<br /> asm("TBLWT*+");<br /> TABLAT=0X0f;<br /> asm("TBLWT*");<br /><br /> GIE=0; //关闭系统所有中断<br /> Choose_Portb_Addr(portbnum);<br /> TBLPTRU=addrU;<br /> TBLPTRH=addrH;<br /> TBLPTRL=addrL;<br /> <br /> for(i=0;i<16;i++)<br /> {<br /> TABLAT=DataBuff[2*i];//Write Even byte<br /> asm("TBLWT*+");<br /> asm("nop");asm("nop");<br /> TABLAT=DataBuff[2*i+1];//Write Odd byte<br /> asm("TBLWT*+");<br /> asm("nop");asm("nop");<br /> }<br /> Choose_Portb_Addr(portbnum);<br /> TBLPTRU=blocknum&0x0e;<br /> TBLPTRH=0X00;<br /> TBLPTRL=0X00;<br /> TABLAT=0xd0; //Confirm buffer porgram<br /> asm("TBLWT*+");<br /> TABLAT=0XD0;<br /> asm("TBLWT*");<br /> GIE=1; //打开系统所有中断<br /> break;<br /> }<br /> if(OverTimeCount1>3)<br /> break;<br /> }<br /> OverTimeCount1=0x00; //Clear the overtime counter<br /> while(1)<br /> {<br /> Choose_Portb_Addr(portbnum);<br /> TBLPTRU=blocknum&0x0e;<br /> TBLPTRH=0X00;<br /> TBLPTRL=0X00;<br /> TABLAT=0x70;<br /> asm("TBLWT*+");<br /> TABLAT=0X70;<br /> asm("TBLWT*");<br /> Choose_Portb_Addr(portbnum);<br /> TBLPTRU=blocknum&0x0e;<br /> TBLPTRH=0X00;<br /> TBLPTRL=0X00;<br /> asm("TBLRD*+");<br /> Temp1=TABLAT;<br /> if(Temp1&0x80)<br /> break;<br /> asm("TBLRD*");<br /> Temp2=TABLAT;<br /> if(OverTimeCount1>2)<br /> break;<br /> }<br /> WriteFlag=Temp1;<br />// if(overtime>1000)<br /> // break;<br />// overtime++;<br /> DelayNus(100);<br />}while(WriteFlag&0X3A);<br />}<br /> |
|