M25P32芯片擦除的问题

[复制链接]
1690|4
手机看帖
扫描二维码
随时随地手机跟帖
hlln20100410|  楼主 | 2015-9-21 20:15 | 显示全部楼层 |阅读模式
本帖最后由 hlln20100410 于 2015-9-22 10:09 编辑

M25P32驱动程序调试时发现首次读写都正常,由于flash每次写必须要擦除,执行擦除指令后,片内变成0XFF,这也正常,但是擦除指令后不能再写入新的数据了,始终都是0XFF,求解
#include <MSP430x14x.h>
#include <MSP430x14x.h>
#define uchar unsigned char
#define uint  unsigned int
/*****************************/
   
#define Busy     0x80
#define Q_IN  P4IN & BIT3                //Q  P4.3  FLASH  OUT
#define CLR_clock P4OUT &= ~BIT1;    //C = P4.1  
#define SET_clock P4OUT |= BIT1;

#define CLR_CS1 P4OUT &= ~BIT2;   //S1 = P4.2
#define SET_CS1 P4OUT |= BIT2;

#define CLR_DOUT P4OUT &= ~BIT0;   //D = P4.0 --FLASH  DIN
#define SET_DOUT P4OUT |= BIT0;
/***********************************/
uchar addr[3],r_data32[256];
void check();
/***********m25p32???******************/
void InitM25p32(void)
{
P4DIR &= ~BIT3;             //Q     25P32????
P4DIR |= BIT0;              //D     25P32????
P4DIR |= BIT1;              //C     25P32????  
P4DIR |= BIT2;              //S1     25P32??
SET_CS1;                       //?S1
}
//*****************************************
void delayy(uint s)
{
     uint tmp,ms;
     for(ms=0;ms<s;ms++)
     {
       for(tmp=0;tmp<100;tmp++);
     }
     
}
//******************************************
void write_yOrn(uchar instr)  
{
    uchar p,data;
    data=instr;
    SET_CS1;
    delayy(10);
    CLR_CS1;
    delayy(10);
    for(p=1;p<=8;p++)
      {
         CLR_clock;
         delayy(10);
         if((data&0x80)==0x80)
               {SET_DOUT;}
         else
               {CLR_DOUT;}
         SET_clock;
         data=data<<1;
         delayy(10);
      }
   SET_CS1;
}
//*************//??3 ????? ??????****************
void write_addr(uchar add_hh,uchar add_h,uchar add_l)  
{
    uchar add_data[3],j,i;
    add_data[0]=add_hh;
    add_data[1]=add_h;
    add_data[2]=add_l;
  for(j=0;j<3;j++)
   {
      for(i=0;i<8;i++)
       {
         CLR_clock;
         delayy(10);
         if((add_data[j]&0x80)==0x80)
              {SET_DOUT;}
         else
             { CLR_DOUT;}
         SET_clock;
         add_data[j]=add_data[j]<<1;         
         delayy(10);
       }
   }
}
//********************************
void write_instruction(uchar win)
{
  uchar i,x_data;
  x_data=win;
  for(i=0;i<8;i++)
    {  
       CLR_clock;
       delayy(10);
       if((x_data&0x80)==0x80)
           { SET_DOUT;}
       else
           {CLR_DOUT;}     
       SET_clock;//?? ????????                        
       delayy(10);
       x_data=x_data<<1;
    }
}
//**************************
uchar readbyte(void)//???????
{  uchar s;
   uchar  read_data=0x00;  
   for(s=0;s<8;s++)
      {             //?? ??? ????
         CLR_clock;
         delayy(10);
         read_data=read_data<<1;
         if(Q_IN)  read_data |= 0x01;     //???
         else      read_data&=0xfe;
         
         SET_clock;
         delayy(10);
      }
  return(read_data);
}
//******************??????*****************
void readsome(uchar r_addhh,uchar r_addh,uchar r_addl,uint data_count,uchar *flash_256)
{
  uint i;
  SET_CS1;
  SET_clock;
  CLR_CS1;
  write_instruction(0x03);      //read data bytes      
  write_addr(r_addhh,r_addh,r_addl);
  delayy(10);
  for( i=0;i<data_count;i++)        
    {
     *flash_256=readbyte();
      flash_256++;  
    }
    SET_CS1;      
}
//************************
//***********************
void writeinPacket(unsigned char w_addHH,unsigned char w_addH,unsigned char w_addL,unsigned char sdat[256]) //??????
{ uchar xx,i;
  uint w;
  write_yOrn(0x06);
  delayy(10);
  CLR_CS1;  
  write_instruction(0x02);         
  write_addr(w_addHH,w_addH,w_addL);
  delayy(10);
  for(w=0;w<256;w++)
     {  
       xx=sdat[w];
       for(i=0;i<8;i++)
         {
            CLR_clock;
            delayy(10);
            if(xx&0x80)
            {
                SET_DOUT;
            }
            else
              CLR_DOUT;  
            SET_clock;         
            xx=xx<<1;
            delayy(10);
        }
     }
        SET_CS1;
    //   delayy(1000);
}

//**********************
void SE(uchar hex2,uchar hex1,uchar hex0)  //????  D8H Delay(1000);
{
     uchar addr2[3];
     addr2[0]=hex0;
     addr2[1]=hex1;
     addr2[2]=hex2;
     write_yOrn(0x06);//写使能
     CLR_CS1;//片选
     write_instruction(0xd8);
     write_addr(addr2[2],addr2[1],addr2[0]);
     SET_CS1;
     check();
     write_yOrn(0x04);
}
//**********************
void BE(void)//???? C7H Delay(17000);
{
write_yOrn(0x06);   
CLR_CS1;
write_instruction(0xc7);   
SET_CS1;
check();
write_yOrn(0x04);

}
void Write_Status(uchar data)
{
    write_yOrn(0x06);   
    delayy(100);
    CLR_CS1;
    write_instruction(0x01);  
    write_instruction(data);
    SET_CS1;
    check();
    write_yOrn(0x04);
    delayy(10);
}
void check()
{
    uchar temp;
    CLR_CS1;
    write_instruction(0x05); //读状态寄存器
    temp=readbyte();
    SET_CS1;
    delayy(10);
    while(temp&0x01!=0)
    {
        ;
    }
   
}
青鸟的虚像| | 2015-9-22 15:11 | 显示全部楼层
您好,您的程序我并没有具体怎么去看,但说点个人之前的经历。
我是用PIC24F编写bootloader,需要对程序存储器进行编程操作,调试器是用PICKiT3.
我也遇到过类似的问题,当时无论怎么也查不出程序有什么问题,但是调试时进行擦、写操作后查看Program Memory 窗口时发现对应的地址单元总是0xFF不变。
假设您的程序也是没有问题,但打开Program Memory之后也查看不到变化,那你可以试一下进行这样的操作:
1.烧写好你的程序到单片机中(如果你也是在程序中修改某些单元的内容的话,直接在调试时打开Program Memory窗口时没用的,我猜是因为这时看到的是编译时生成的内容);
2.点击MPLABX中的Read Device Memory;
3.再次打开Program Memory窗口,如果真的编程程序存储器成功了的话,这时是能够看到变化了的。
希望对你的疑问有帮助。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
hlln20100410 + 3
hlln20100410|  楼主 | 2015-9-23 13:29 | 显示全部楼层
青鸟的虚像 发表于 2015-9-22 15:11
您好,您的程序我并没有具体怎么去看,但说点个人之前的经历。
我是用PIC24F编写bootloader,需要对程序存 ...

好的我试试 谢谢您

使用特权

评论回复
青鸟的虚像| | 2015-9-24 09:34 | 显示全部楼层
hlln20100410 发表于 2015-9-23 13:29
好的我试试 谢谢您

不用谢。楼主有什么新的解决方法也一起交流下吧。

使用特权

评论回复
小米拍客光| | 2018-11-8 16:41 | 显示全部楼层
你好 看到您之前遇到M25P32 SPI FLASH只能烧写一次的问题?这个您怎么解决的?能讲讲吗?求教 十分感谢  QQ:1252007672  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

63

帖子

2

粉丝