pic30f4011的eeprom读写问题

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

官方网站有例程

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2620<br />CE017
 楼主| gamezm 发表于 2009-3-13 12:42 | 显示全部楼层

我用的是c30 主要是想大家帮我看看我的这个程序哪不对

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部