/*****************************************************************
* 文件名称:
* exflash.c
* 文件说明:
* 对扩展FlashAT45DB041进行读写操作
*
******************************************************************
* MSP430F449
* -----------------
* | |
* | |
* | | ________
* | | | |
* | P6.0|-->| A |
* | P6.1| . | T |
* | P6.2| . | 4 |
* | P6.3| . | 5 |
* | P6.4| . | D |
* | P6.5| . | B |
* | P6.6|-->| 0 |
* | | | 4 |
* | | | 1 |
* |________|
*
****************************************************************/
#ifndef MSP430F449_H
#include <msp430x44x.h>
#endif
unsigned char write_Buf,//发送数据的缓存
read_Buf; // 接收数据的缓存
/*****************************************************************
* 初始化AT45DB041B
******************************************************************/
void init_EXFlash()
{
FLL_CTL1 |= SELM_A + FLL_DIV_8;
P6DIR &= 0x80; //si,so,wp,reset,rd_Busy,sck,cs 输入模式
P6SEL &= 0x80;
P6DIR |= 0x63; //wp,rset,sck,cs =1
P6OUT |= 0x63; //wp,rset,sck,cs=1
}
/***************************************************************
* 读写期间的时延
****************************************************************/
void flash_Delay()
{
_NOP();
_NOP();
_NOP();
}
/***************************************************************
* 发送“1”到AT45DB041
***************************************************************/
void write_ONE()
{
P6OUT |= 0x10;//si=1
P6OUT |= 0x20;//sck=1
}
/***************************************************************
* 发送“0”到AT45DB041
****************************************************************/
void write_ZERO()
{
P6OUT &= 0xEF; //si=0
P6OUT |= 0x20; //sck=1
}
/****************************************************************
* 发送一个Byte到AT45DB041
*****************************************************************/
void write_Data()
{
char tmp,tmpv=0x80;
for(tmp=0;tmp<8;tmp++)
{
P6OUT &= 0xdf; //sck=0
if ((write_Buf&tmpv)==0x00)
{ //检查相应的位是0还是1
write_ZERO(); // 发送0
}else{
write_ONE(); // 发送1
}
tmpv /= 2;
}
}
/**************************************************************
* 停止对AT45DB041的操作
**************************************************************/
void op_Stop()
{
P6OUT |= 0x40; //cs=1,去除片选
}
/*************************************************************
* 为对AT45DB041做好准备工作
**************************************************************/
void op_Start()
{
P6DIR |= 0x40;
P6OUT &= 0xbf; //cs=0
flash_Delay();
P6DIR &= 0xCF; //reset
P6DIR |= 0x10; //Si=1
P6DIR |= 0x20; //sck=1
P6OUT |= 0x20; //sck=1
flash_Delay();
}
/************************************************************
* 读数据之前,进行IO端口的调整
************************************************************/
void opr_Start()
{
P6DIR &= 0xF7;//so=0 输入模式
P6DIR |= 0x20;//sck =1
flash_Delay();
};
/**********************************************************
* 从AT45DB041读一个Byte
***********************************************************/
void read_Data()
{
unsigned char tmp,tmpv;
tmpv = 0x80;
read_Buf = 0x00; //清空read_Buf
for(tmp=0;tmp<8;tmp++)
{
P6OUT &= 0xdf; //sck=0
flash_Delay();
P6OUT |= 0x20; //sck=1
if((P6IN & 0x08)!=0x00)
{
read_Buf |= tmpv; //读取数据
}
tmpv/=2;
}
}
/***************************************************
* 文件名称:
* main.c
* 文件说明:
* 对扩展FlashAT45DB041进行操作,在Flash的0x08
* 位置写0x08,写入数据显示到 LED[0],读出的数据显示到LED[1]
****************************************************/
#define MSP430F449_H 0
#include <msp430x44x.h>
#ifndef LED_IN_USE
#include "led.c"
#endif
#include "exflash.c"
/****************************************************
* main函数
*****************************************************/
void main(void)
{
char wData=0x09; //存放要写的内容
/**** 初始化 ****/
WDTCTL = WDTHOLD + WDTPW; //关闭看门狗
init_LED(); //初始化LED
init_EXFlash(); //初始化Flash
/**** 写数据到Flash ***/
write_Buf = 0x84; //写缓冲区1,指令格式:84H + 15位无关位 + 9位地址位
op_Start(); //做操作前的准备工作
write_Data(); //写操作指令到Flash
write_Buf = 0x00; //设置八位无关位
write_Data(); //写八位无关位
write_Buf = 0x00; //设置7位无关位和一位地址位
write_Data(); //写7位无关位和一位数据位
write_Buf= 0x08; //设置地址
write_Data(); //写地址
write_Buf = wData; //设置要写到Flash的内容
write_Data(); //写数据到Flash
op_Stop(); //停止操作
/******** 读操作 ************/
op_Start(); //启动操作
write_Buf = 0x54; //读数据的指令格式:54H + 15位无关位 + 9位地址位 + 8位无关位
write_Data(); //写读指令到Flash
write_Buf = 0x00; //设置8位无关位
write_Data(); //写数据
write_Buf = 0x00; //设置7位无关位和一位地址位
write_Data(); //写数据
write_Buf = 0x08; //设置另外8位地址
write_Data(); //写地址
write_Buf = 0xff; //设置8位无关位
write_Data(); //写数据
//附加脉冲
opr_Start(); //准备接收数据
read_Data(); //接收数据到read_buf
op_Stop(); //停止操作
/**** 把写的内容和读出的内容显示到LED ****/
while(1)
{
led_Buf[0]= wData;
led_Buf[1] =read_Buf;
led_Display(); // 显示到LED
};
}