导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→我的W29C040的读写程序是这样设计的~!老古帮忙拉[原创

* 80989: 我的W29C040的读写程序是这样设计的~!老古帮忙拉[原创]

   ajaxyynuaa 
ajaxyynuaa发表的帖子 

 我的W29C040的读写程序是这样设计的~!老古帮忙拉[原创]
主程序
main()
{
   
   WDTCN = 0xde;     // 禁止软件看门狗定时器
   WDTCN = 0xad;     //不禁止看门狗,定时器1将工作不正常。
   
   
   //SYSCLK_Internal();
   SYSCLK_External();

   PORT_Init();

   Timer1_Init();     //定时器1,2,3初始化 
   Timer2_Init (SYSCLK_OUT/BAUDRATE/32);

   UART0_Init (); 

   EIE2 |= 0x02;     //允许ADC中断
   IE|=0x10;         //允许UART中断
   EA = 1;           //允许全局中断

   TR1=1;            //启动定时器1,LED动态显示
   TR2=1;            //启动定时器2,波特率发生器
    flash_init();
    flash_erase();
    addl_flash=0;
    count_page=0;
    tempf=0x5A;
    do{loopw();
    }while(1);       

}

延时函数,用的是11.0592M的晶振
void delayms(char ticks)
{
unsigned char count;
for (ticks=ticks; ticks>  =0; ticks--)
 {
   for (count = 0; count  <=13; count++)
    {
     }
  }
}
flash初始化函数
void flash_init(void)
{
 PRT1CF=0x00;
 P1=0xff;           //P1口输入总线

 PRT2CF=0xff;
 P2=0xff;           //允许P2口输出
 
 PRT3CF=0xff;       //允许P3口输出
 P3 &=0x7f;         //LE=0
 P3 |=0x78;         //CE1,CE2,WE,OE=1
}


void select_sec(void)
{
     switch(count_sec) //选择flash存储的段
       { 

       case 0: P3 &=0xf8; break; /* 29c040 a18a17a16= 000 00000-0ffff */ 

       case 1: P3 &=0xf9;P3 |=0x01; break; /* 29c040 a18a17a16= 001 10000-1ffff */ 

       case 2: P3 &=0xfa;P3 |=0x02; break; /* 29c040 a18a17a16= 010 20000-2ffff */ 

       case 3: P3 &=0xfb;P3 |=0x03; break; /* 29c040 a18a17a16= 011 30000-3ffff */ 

       case 4: P3 &=0xfc;P3 |=0x04; break; /* 29c040 a18a17a16= 100 40000-4ffff */ 

       case 5: P3 &=0xfd;P3 |=0x05; break; /* 29c040 a18a17a16= 101 50000-5ffff */ 

       case 6: P3 &=0xfe;P3 |=0x06; break; /* 29c040 a18a17a16= 110 60000-6ffff */ 

       case 7: P3 |=0x07; break; /* 29c040 a18a17a16= 111 70000-7ffff */ 

       } 
}

flash的察除函数
void flash_erase(void)
{
  
  count_page=0x55;
  addl_flash=0x55;            //A0-A7低地址
  tempf=0xAA;
  flash1_w();

  count_page=0x2A;
  addl_flash=0xAA;            //A0-A7低地址
  tempf=0x55;
  flash1_w();
  

  count_page=0x55;
  addl_flash=0x55;            //A0-A7低地址
  tempf=0x80;
  flash1_w();

  count_page=0x55;
  addl_flash=0x55;            //A0-A7低地址
  tempf=0xAA;
  flash1_w();
  
  count_page=0x2A;
  addl_flash=0xAA;            //A0-A7低地址
  tempf=0x55;
  flash1_w();
  
  count_page=0x55;
  addl_flash=0x55;            //A0-A7低地址
  tempf=0x10;
  flash1_w();
  
  delayms(50);
}
flash的写读函数
void flash1_r(void)
{
 CE1=0; 

 select_sec();
 P2=count_page;//A8-A15高地址
             
 PRT1CF=0x0ff;       //允许D为输出
 P1=addl_flash;  
           //A0-A7低地址

 LE=1;
 _nop_();
 LE=0;            //锁存地址

  PRT1CF=0x00;//允许D为输入
 P1=0x0ff;

   OE=0;   //P3&=0xf7//读选通

 _nop_();
         
 tempf=P1;
          
 OE=1;//P3 |=0x08
 
 CE1=1;//P3 |=0x20
}


//flash的写函数
void flash1_w(void)
{
 CE1=0;
 select_sec();
 P2=count_page;           //A8-A15高地址
 PRT1CF=0xff;      //允许D为输出
 P1=addl_flash;           //A0-A7低地址

 LE=1;
 _nop_();
 LE=0;             //锁存地址

 P1=tempf;
 
 WE=0;             //锁存地址到flash
 _nop_();
 
 WE=1;             //锁存数据到flash

 PRT1CF=0x00;
 P1=0xff;          //允许D输入
 CE1=1;

}


//***************************flash1存储**********************
void loopw(void)
{
  
    bit data flage;
    flage=EA;
    EA=0;
  
    flash1_w();
    //loopr();

    addl_flash++;
    if (addl_flash==0)
    { 
     delayms(10);
     EA=flage;
     addl_flash=0;
     count_page=0;
     loopr();
     }
    
       
     
  }

//***************************flash1串口发送**********************
void loopr(void)
  {
      
      flash1_r();
    addl_flash++;
       
      if(addl_flash!=0)
     /* TI=0;
        SBUF=tempf;
        while(!TI);
        TI=0;*/
    {    tempt[addl_flash]=tempf;
      loopr();}
      else
      {
      count_page++;
      if(count_page==0)
      count_sec++;
      }
      if(count_sec>  7)
        {
        count_sec=0;
        choose=1;
        }
      
    }    


这个函数的主要目的是向W29C040中的一页写0x5A,然后再读出来,但我不知道是不是我的写函数有问题,因为读出来都是
FF,应该是没有写进去,那位大侠帮我看下,我不知道写芯片前要作些什么,不知道我的察除函数对不对啊???



发表时间:2005年7月8日14:49:10

  
回复该帖

本主题共有 2 帖,分页:>>>>>该主题的所有内容[2]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  85424.[详细]写有问题
摘要:正确的应该是这样的,能正常地使用 void FLASH_WR_1Byte(void) {  uchar xdata *temp;  temp=0x55......(264字)
- [wjb444][1024次] 2005年11月7日

[上一篇帖子]:我们公司要我用C写单片机,对我有帮助,能发给我吗?我的QQ:519810910,邮箱是:lh8110
[下一篇帖子]:我有.可对你有用吗?