诸位大侠我的这段eeprom的程序在app009开发板上调试时,我设计的是先写入ee一个数,再读出来,判断读的是那个数,点亮相应的led,现在读写这有问题谁帮我看一下谢谢<br />#include<p30f4011.h><br />#include<math.h><br />int failmemory[40];<br /><br />int a,b;//EE读写地址<br />int *eew_data,*eer_data;//EE读,写指针<br /><br />int medium;//中转寄存器<br /><br />int led;<br /><br /><br />void InitializeSys()//程序初始化<br />{<br /> INTCON1 = 0x0000; //关中断 <br /> INTCON2 = 0x0000; <br /> IEC0 = 0x0000; //IECx中断禁止 <br /> IEC1 = 0x0000;<br /> IEC2 = 0x0000;<br /> <br /> TRISEbits.TRISE0=0; <br /> TRISEbits.TRISE1=0; <br /> TRISEbits.TRISE2=0; <br /> TRISEbits.TRISE3=0;<br /> TRISEbits.TRISE4=0;<br /> TRISEbits.TRISE5=0;<br /> TRISEbits.TRISE8=0;<br /> TRISBbits.TRISB3=0;<br /> TRISBbits.TRISB4=0;<br /> TRISBbits.TRISB5=0;//模拟输入出端口<br /><br />}<br /><br />//*****************擦除FLASH EEPROM的一个字子程序***************************<br />void ex_write()<br />{<br /> NVMCON=0x4044;//WR,REN,WRERR,xxxxx,PROGOP<7:0> <br /> // 0, 1, 0,00000, 44<br /> //写(编程或擦除)控制位'1写',<br /> //写(擦除或编程)使能位<br /> //闪存错误标志位<br /> //未用,用户代码应该在这些单元中写入0<br /> //编程操作命令字节位<br /> //擦除操作:<br /> //0x41 = 从程序闪存中的一个板擦除1 行(32 个指令字)<br /> //0x44 = 从数据闪存擦除1 个数据字<br /> //0x45 = 从数据闪存擦除1 行(16 个数据字)<br /> //编程操作:<br /> //0x01 = 将1 行(32 指令字)编程入闪存程序存储器<br /> //0x04 = 将1 个数据字编入数据EEPROM<br /> //0x05 = 将1 行(16 个数据字)编程入数据EEPROM<br /> //0x08 = 将1 个数据字编程入器件配置寄存器<br /><br /> IFS0bits.NVMIF=0;//中断标志状态寄存器0,非易失性存储器写完成中断标志状态位,未发生中断请求<br /> IEC0bits.NVMIE=0;//中断允许控制寄存器0,非易失性存储器写完成中断允许位,不允许中断请求<br /> NVMKEY=0x55;//防止EEPROM的误写/误擦除,<br /> NVMKEY=0xaa;<br /> NVMCONbits.WR=1;//控制开始eeprom写,只能由硬件清‘0’<br /> __asm__( "NOP");//插入两个指令周期的等待时间,单片机将读取指定单元内容,并且放入EEDATA中<br /> __asm__( "NOP");<br /> while (IFS0bits.NVMIF==0){;}//在写操作完成时,IFS0 寄存器中的中断标志位NVMIF 将置1。它必须用软件清零。<br /> IFS0bits.NVMIF=0;<br />}<br />//*****************写EEPROM子程序*************************这里是不是应该写入一个数,在读eeprom拿来判断这个数,是led亮,不是led不亮<br />void ee_write()<br />{<br /> __asm__( "MOV 0x0850,W1 " );//指针指向的地址,a的地址<br /> __asm__( "TBLWTL W1,[W0]");<br /><br /> NVMCON=0x4004;<br /> IFS0bits.NVMIF=0;<br /> IEC0bits.NVMIE=0;<br /> NVMKEY=0x55;<br /> NVMKEY=0xaa;<br /> NVMCONbits.WR=1;<br /> __asm__( "NOP");<br /> __asm__( "NOP");<br /> while (IFS0bits.NVMIF==0){;} <br /> IFS0bits.NVMIF=0;<br />}<br /><br />//*****************读EEPROM子程序**************************<br />void ee_read()<br />{<br /> __asm__( "MOV #tblpage(0x7ffc02),W0" );<br /> __asm__( "MOV W0,TBLPAG" ); <br /> __asm__( "MOV #tbloffset(0x7ffc02),W0");<br /> __asm__( "TBLRDL [W0], W4 " );<br /> __asm__( "MOV W4,0x0852");<br /> led=*eer_data;<br />}<br />//*********************延时******************************<br />void delay_1ms(int delay)// 1ms delay<br />{<br /> unsigned int delay1, delay2;<br /> for(delay2=0;delay2<=delay;delay2++)<br /> {for(delay1=0;delay1<=10000;delay1++) ;}<br />}<br /> //**************主程序**************************<br />int main(void)<br /> {<br /> InitializeSys(); //系统初始化<br /> eew_data=&a; //指针指向<br /> eer_data=&b;<br /><br /><br /><br /> *eew_data=1; <br /> __asm__( "MOV #tblpage(0x7ffc02),W0" );<br /> __asm__( "MOV W0,NVMADRU" ); <br /> __asm__( "MOV #tbloffset(0x7ffc02),W0");<br /> __asm__( "MOV W0,NVMADR" );<br /> ex_write();<br /> <br /> __asm__( "MOV #tblpage(0x7ffc02),W0" );<br /> __asm__( "MOV W0,TBLPAG" );<br /> __asm__( "MOV #tbloffset(0x7ffc02),W0" );<br /> ee_write(); <br /><br /> delay_1ms(100);<br /><br /> ee_read();<br /><br /> if(led==1)<br /> {<br /> LATEbits.LATE0=1;<br /> LATEbits.LATE1=0;//亮<br /> }<br /> else if(led==2)<br /> {<br /> LATEbits.LATE0=0;<br /> LATEbits.LATE1=1;//亮<br /> }<br /> }<br /> |
|