This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

用MSP430F155操作外部Flash存储器SST25VF016B

Other Parts Discussed in Thread: MSP430F155

用MSP430F155连接一个Flash存储器SST25VF016B,通过SPI同步串行通信方式实现通信。现在是SPI通信解决了。可是存储芯片现在只能读不能写。有没有可能是SST25VF016B坏了?

以下是MSP430F155的SPI程序:
#define CE0   P1OUT&=~BIT6
#define CE1   P1OUT|=BIT6

//unsigned char RxFlag=0;
//unsigned char TxFlag=0;

void SPI_init()           
{            
        P1SEL  &=~BIT6;
        P1DIR  |=BIT6;  //P5.3 CE
/*        
        P5SEL  &=~BIT2;
        P5DIR  |=BIT2;
        P5OUT  |=BIT2;//WP引脚

        P5SEL  &=~BIT0;
        P5DIR  |=BIT0;  //P5.0 Hold
        P5OUT  |=BIT0;
  
        P5SEL  &=~BIT1;
        P5DIR  |=BIT1;  //P5.1 Vcc
        P5OUT  |=BIT1;
        */
        P3SEL  |=BIT1+BIT2+BIT3;  //SIMO SOMI UCLK                   
          U0CTL  =CHAR+SYNC+MM+SWRST;  //8位SPI,SPI模式,主机模式,保持在复位状态   
          U0TCTL =SSEL1+STC;     //时钟源为SMCLK,3线模式;   
          U0BR0  =0x002;   
          U0BR1  =0x000;                //波特率设定   
          U0MCTL =0x000;                //调整寄存器没有调整; 
        ME1    =USPIE0;               //打开SPI使能  
          U0CTL &=~SWRST;               //关复位 
        //U0IE |= URXIE0 + UTXIE0;
       
        WriteEnable();
        Write_Status_Register(0x00);                 //Flash去保护
        WriteDisable();
}   
unsigned char SPI_send(unsigned char byte)   //发送一个数据 
{         
        unsigned char in;
              //while(TxFlag == 0);
        //TxFlag=0;
        while((IFG1 & UTXIFG0) == 0); //等待发送数据缓存是否准备好接收新数据      
        TXBUF0=byte;            //发送一个字节; 
        while((IFG1 & URXIFG0) == 0);
        in=U0RXBUF;
           return in;        
}
以下是SST25VF016B程序,参考别人程序写的,但是我测试了一下,只能读出来不能写进去:
void WriteEnable()
{
            CE0;          
        SPI_send(0x06);
        CE1;   
}
void WriteDisable()
{
            CE0;          
        SPI_send(0x04);
        CE1;   
}
void WaitBusy()
{
    unsigned char FlashStatus=0;
  
    FlashStatus=Read_Status_Register();
    while((FlashStatus&0x01) == 1);
}
unsigned char Read_Status_Register()                   //读取状态寄存器,并返回状态寄存器的值
{   
            unsigned char byte = 0;   
        
            CE0;           
            SPI_send(0x05);        //发送读状态寄存器的命令 
            byte=SPI_send(0xFF);  //发送垃圾值,产生脉冲
        //byte = SPI_get();      //读取状态寄存器 
            CE1;   
        
            return byte;   
}     
void Write_Status_Register(unsigned char byte)           //往状态寄存器里写一个字节 系统启动首先写Write_Status_Register(0x00)去除写保护
{   
        //WriteEnable();
        CE0;  
            SPI_send(0x01);        //发送写状态寄存器   
            SPI_send(byte);        
            CE1;    
        //WaitBusy();
        delay();
}   

unsigned char HighSpeed_Read(unsigned long add)            //高速读取一个字节 
{   
            unsigned char byte = 0;    
        
            CE0;           
            SPI_send(0x0B);        //发送高速读取指令
            SPI_send(((add & 0xFFFFFF) >> 16));     
            SPI_send(((add & 0xFFFF) >> 8));   
            SPI_send(add & 0xFF);   
            byte=SPI_send(0xFF);        //虚拟字节   
            //byte = SPI_get();  
        CE1;
         
            return byte;              
}  
void Byte_write(unsigned long add, unsigned char byte)    //写入一个字节的数据

        WriteEnable();
        Write_Status_Register(0x00);
        
        CE0; 
        SPI_send(0x02); 
        SPI_send(((add & 0xFFFFFF) >> 16)); 
        SPI_send(((add & 0xFFFF) >> 8)); 
        SPI_send(add & 0xFF); 
        SPI_send(byte);  
        CE1; 
        
        WriteDisable();
        delay();
        
        //WaitBusy();

void Block_Erase_4K(unsigned long add)           //4k擦除
{   
        WriteEnable();
            Write_Status_Register(0x00);        //去除写保护  
        
            CE0;                 
            SPI_send(0x20);            
            SPI_send(((add & 0xFFFFFF) >> 16));      //由高位到低位发送3个地址
            SPI_send(((add & 0xFFFF) >> 8));   
            SPI_send(add & 0xFF);    
        CE1;  
        delay();
        

void delay()  //大约15ms ?????????
{
    unsigned int tmp;        
    for(tmp=12000;tmp>0;tmp--);
}