打印

MSP430F155和外部Flash存储器SST25VF016B

[复制链接]
1699|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
现在用MSP430F155连接一个Flash存储器SST25VF016B,通过SPI同步串行通信方式实现通信。但是现在程序不能发送和接收(不能进入中断),各位哥哥给看看有什么问题?

以下是SPI程序:

#define CE0   P5OUT&=~BIT3  
#define CE1   P5OUT|=BIT3

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

void SPI_init()          
{           

        P5DIR  |=BIT3;  //P5.3 CE引脚
        
        P5DIR  |=BIT2;
        P5OUT  |=BIT2;//WP引脚

        P5DIR  |=BIT0;  //P5.0 Hold引脚
        P5OUT  |=BIT0;
  
        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;
      
        WRSR(0x00);                 //Flash去保护
}   
void SPI_send(unsigned char byte)   //发送一个数据
{                   
              while(TxFlag == 0);
        TxFlag=0;
        //while((IFG1 & UTXIFG0) == 0); //等待发送数据缓存是否准备好接收新数据      
        TXBUF0=byte;            //发送一个字节;
}
unsigned char SPI_get()       //接收一个数据
{   
            unsigned char in;   
        
            while(RxFlag==0);        //等待接收完成
        RxFlag=0;
        in=U0RXBUF;
           return in;   
}   
#pragma vector=USART0RX_VECTOR
__interrupt void UartRx()
{
    RxFlag=1;     
}
#pragma vector=USART0TX_VECTOR
__interrupt void UartTx ()
{
    TxFlag=1;
}

以下是时钟初始程序:
    WDTCTL=WDTPW+WDTHOLD;   //关闭看门狗
   
    BCSCTL1 |=DIVA_2;   //ACLK 4分频     设置时钟
    BCSCTL1 &=~XT2OFF;   //XT2有效  
    while((IFG1&OFIFG)==1) //当OFIFG等于0的时候结束,说明晶体振荡器正常工作了           
    {  
        IFG1 &=~OFIFG;     //清除晶体振荡器失效标志OFIFG标志
        delay();          //等待50us         
    }
    BCSCTL2 |=SELM1;   //MCLK
    BCSCTL2 |=SELS;    //SMCLK5

相关帖子

沙发
linfeng24| | 2013-10-25 00:24 | 只看该作者
额,我表示,光看程序,好费劲。 咱们可以逐步分析问题,首先楼主是否已经掌握的F155的SPI通信以及中断的程序,这个可以换个简单的SPI器件来验证下,。如果已经掌握了,再来看这个程序。排除本身SPI中断的问题,然后看SST25VF016B的通信时序,楼主是否写对了?好好检查下。别人没有用过该芯片的,或者不是用MSP430来调试用过的,手上又没有这个芯片来实时调试,就很难回答你这个问题了。

使用特权

评论回复
板凳
一二三四五|  楼主 | 2013-10-26 10:42 | 只看该作者
linfeng24 发表于 2013-10-25 00:24
额,我表示,光看程序,好费劲。 咱们可以逐步分析问题,首先楼主是否已经掌握的F155的SPI通信以及中断的程 ...


重新改了SPI程序,并且测试了SPI,正确。

以下是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--);
}

使用特权

评论回复
地板
dirtwillfly| | 2013-10-26 11:30 | 只看该作者
楼主又发到这里来了。

使用特权

评论回复
5
dirtwillfly| | 2013-10-26 11:50 | 只看该作者
问题解决了么?

使用特权

评论回复
6
一二三四五|  楼主 | 2013-10-26 11:52 | 只看该作者
dirtwillfly 发表于 2013-10-26 11:30
楼主又发到这里来了。

是发到这里啦问题没解决呢,现在是SPI通信解决了。可是存储芯片现在只能读不能写。

使用特权

评论回复
7
dirtwillfly| | 2013-10-26 12:14 | 只看该作者
刚才翻了翻那个中文的手册,翻译的很蛋痛,错误百出。
还是看英文的靠谱

按这个操作,试过了么?
我手里没这个器件,不然可以试一下

使用特权

评论回复
8
一二三四五|  楼主 | 2013-10-26 22:05 | 只看该作者
dirtwillfly 发表于 2013-10-26 12:14
刚才翻了翻那个中文的手册,翻译的很蛋痛,错误百出。
还是看英文的靠谱

这个英文的,我这也有,看懂了的。
我觉得有可能是SST25VF016B这芯片坏了—手上带有静电时摸芯片的话芯片很容易就会坏了。反正都弄了好几天了它都不对,有可能是芯片坏了吧:'(

使用特权

评论回复
9
dirtwillfly| | 2013-10-26 23:51 | 只看该作者
一二三四五 发表于 2013-10-26 22:05
这个英文的,我这也有,看懂了的。
我觉得有可能是SST25VF016B这芯片坏了—手上带有静电时摸芯片的话芯片 ...

:funk:

使用特权

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

本版积分规则

4

主题

20

帖子

0

粉丝