sky-Hawk where 发表于 2013-2-26 12:36:29

msp430进行SPI模式下的flash存储器

本帖最后由 洛川子 于 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/BUSYCOMP    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;
}

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


sky-Hawk where 发表于 2013-2-27 11:11:28

其实不是大家不会,只是大家没有搞这个,或者不愿仔细看而已。嗨。我自己搞吧

sky-Hawk where 发表于 2013-2-27 10:55:14

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

sky-Hawk where 发表于 2013-2-27 10:50:26

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

这么厉害???????

sky-Hawk where 发表于 2013-2-27 09:30:16

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

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

sky-Hawk where 发表于 2013-2-26 13:35:09

貌似不简单,坐等大侠们帮忙解答
页: [1]
查看完整版本: msp430进行SPI模式下的flash存储器

Baidu
map