用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--);
}