5回答

1收藏

[求助] msp430进行SPI模式下的flash存储器

TI TI 6408 人阅读 | 5 人回复 | 2013-02-26

本帖最后由 洛川子 于 2013-2-26 12:39 编辑

首先说明下。。用MSP430F2618对一个flash存储器进行读写,但是一直没有结果。。
我的想法是:要想知道读写是不是成功只需要将一串数字先写入flash存储器,如果可以在那个位置读取出来的话就说明写操作和读操作都是争取的。
但是不管我怎么读写读出来的都是0或者说是空。
附上代码
/**********************************************
初始化
***********************************************/
void Spi_Init()
{
   UCB0CTL1 = UCSWRST;//使能

   UCB0CTL0 |= UCMSB + UCMST + UCMODE_0+ UCSYNC + UCCKPL;
   UCB0CTL0 &= ~UC7BIT;//8位
   //UCB0CTL0 |= UCMSB + UCMST + UCSYNC + UCCKPL;
   //UCMSB 起始选择  MSB开始
   //UCMST 主机模式
   //UCMODE_0 3线SPI(SCLK,SIMO,SOMI)
   //UCSYNC 选择了spi模式
   //UCCKPL 选择时钟极性
   UCB0CTL1 |= UCSSEL_2;  //SMCLK
   UCB0BR0 =0xe2;                     
   UCB0BR1 =0x04; //9600

   P3SEL = 0x0e;  
   UCB0CTL1 &= ~UCSWRST; //模块使能
}

/**********************************************
函数功能:写data
函数参数:uchar Data
***********************************************/
void Write_Data(uchar Data)
{
  UCB0TXBUF = Data;
  while(!(IFG2&UCB0TXIFG));
}

/**********************************************
函数功能:等待不忙
函数参数:

//读取状态寄存器   
//bit7      bit6    bit6    bit6    bit6    bit6    bit6    bit6   
//RDY/BUSY  COMP    1   0   1   1   PROTECT PAGE SIZE
If bit 7 is a 1, then the device is
not busy and is ready to accept the next command
***********************************************/
void Until_Ready()//这里没有跳出循环
{
  uchar x=0x00;  
  while(!(x&0x10))
  {
  AT45_CS_0;
  Write_Data(0xd7);
  x = UCB0RXBUF;


  AT45_CS_1;
  }
}
/**********************************************
函数功能:写Buffer
函数参数:uchar Buffer_Num 选择写的是那个缓存区
int Buffer_Addr   在缓存区的那个位置写
char* Buffer_Data 写的数据
int size 存放的数据有多少个
***********************************************/
void Write_Buffer(uchar Buffer_Num,int Buffer_Addr,char* Buffer_Data,int size)
{
  char Choose_Buffer_Num;
  int i;
  AT45_CS_0;
  Until_Ready();
  if(Buffer_Num)//如果Buffer_Num为0,选择缓存区1
    Choose_Buffer_Num = 0x87;//缓存区2
  else
    Choose_Buffer_Num = 0x84;//缓存区1
  Write_Data(Choose_Buffer_Num);

  Write_Data(Buffer_Addr >> 16);
  Delay(Flash_Delay);
  Write_Data(Buffer_Addr >> 8);
  Delay(Flash_Delay);
  Write_Data(Buffer_Addr >> 0);
  Delay(Flash_Delay);

  for(i=0;i<SIZE;i++)
  {
    UCB0TXBUF = Buffer_Data;
  }
  Until_Ready();
  AT45_CS_1;
}
/**********************************************
函数功能:读Buffer的内容
函数参数:uchar Buffer_Num 选择写的是那个缓存区
int Page_Addr   开始读缓存区的地址
char* Buffer_Data 存放读出的数据
int size  数据的个数
***********************************************/
void Read_Buffer(uchar Buffer_Num,int Buffer_Addr,char* Buffer_Data,int size)
{
  char Choose_Buffer_Num;
  int i;
  AT45_CS_0;
  Until_Ready();

  if(Buffer_Num)//如果Buffer_Num为0,选择缓存区1
    Choose_Buffer_Num = 0xd6;//缓存区2
  else
    Choose_Buffer_Num = 0xd4;//缓存区1
  Write_Data(Choose_Buffer_Num);

  Write_Data(Buffer_Addr >> 16);
  Delay(Flash_Delay);
  Write_Data(Buffer_Addr >> 8);
  Delay(Flash_Delay);
  Write_Data(Buffer_Addr >> 0);
  Delay(Flash_Delay);

  for(i=0;i<SIZE;i++)
  {
    Buffer_Data = UCB0RXBUF;
  }
  Until_Ready();
  AT45_CS_1;
}

主函数就是直接调用读写函数,但是输出的不对,求教各位大神吧。

真诚要求各位大神指教


分享到:
回复

使用道具 举报

回答|共 5 个

倒序浏览

沙发

GY@艳

发表于 2013-2-26 13:35:09 | 只看该作者

貌似不简单,坐等大侠们帮忙解答
爱板  爱板  爱板     https://www.cirmall.com
板凳

hanpeiliang1989

发表于 2013-2-27 09:30:16 | 只看该作者

GY@艳 发表于 2013-2-26 13:35
貌似不简单,坐等大侠们帮忙解答

估计没戏了,这个帖子我在基本的很多430的论坛都发过了。。。貌似都是没人回答。
地板

GY@艳

发表于 2013-2-27 10:50:26 | 只看该作者

洛川子 发表于 2013-2-27 09:30
估计没戏了,这个帖子我在基本的很多430的论坛都发过了。。。貌似都是没人回答。 ...

这么厉害???????
爱板  爱板  爱板     https://www.cirmall.com
5#

mengyun2801

发表于 2013-2-27 10:55:14 | 只看该作者

不行就直接跟TI技术支持交流吧,我还没搞过这个~~~
6#

hanpeiliang1989

发表于 2013-2-27 11:11:28 | 只看该作者

其实不是大家不会,只是大家没有搞这个,或者不愿仔细看而已。嗨。我自己搞吧
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条