/***************************************************************** * 文件名稱: * exflash.c * 文件說(shuō)明: * 對(duì)擴(kuò)展FlashAT45DB041進(jìn)行讀寫(xiě)操作 * ****************************************************************** * 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,//發(fā)送數(shù)據(jù)的緩存 read_Buf; // 接收數(shù)據(jù)的緩存 /***************************************************************** * 初始化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 } /*************************************************************** * 讀寫(xiě)期間的時(shí)延 ****************************************************************/ void flash_Delay() { _NOP(); _NOP(); _NOP(); } /*************************************************************** * 發(fā)送“1”到AT45DB041 ***************************************************************/ void write_ONE() { P6OUT |= 0x10;//si=1 P6OUT |= 0x20;//sck=1 } /*************************************************************** * 發(fā)送“0”到AT45DB041 ****************************************************************/ void write_ZERO() { P6OUT &= 0xEF; //si=0 P6OUT |= 0x20; //sck=1 } /**************************************************************** * 發(fā)送一個(gè)Byte到AT45DB041 *****************************************************************/ void write_Data() { char tmp,tmpv=0x80; for(tmp=0;tmp<8;tmp++) { P6OUT &= 0xdf; //sck=0 if ((write_Buf&tmpv)==0x00) { //檢查相應(yīng)的位是0還是1 write_ZERO(); // 發(fā)送0 }else{ write_ONE(); // 發(fā)送1 } tmpv /= 2; } } /************************************************************** * 停止對(duì)AT45DB041的操作 **************************************************************/ void op_Stop() { P6OUT |= 0x40; //cs=1,去除片選 } /************************************************************* * 為對(duì)AT45DB041做好準(zhǔn)備工作 **************************************************************/ 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(); }
/************************************************************ * 讀數(shù)據(jù)之前,進(jìn)行IO端口的調(diào)整 ************************************************************/ void opr_Start() { P6DIR &= 0xF7;//so=0 輸入模式 P6DIR |= 0x20;//sck =1 flash_Delay(); }; /********************************************************** * 從AT45DB041讀一個(gè)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; //讀取數(shù)據(jù) } tmpv/=2; } }
/*************************************************** * 文件名稱: * main.c * 文件說(shuō)明: * 對(duì)擴(kuò)展FlashAT45DB041進(jìn)行操作,在Flash的0x08 * 位置寫(xiě)0x08,寫(xiě)入數(shù)據(jù)顯示到 LED[0],讀出的數(shù)據(jù)顯示到LED[1] ****************************************************/
#define MSP430F449_H 0 #include <msp430x44x.h> #ifndef LED_IN_USE #include "led.c" #endif
#include "exflash.c" /**************************************************** * main函數(shù) *****************************************************/ void main(void) { char wData=0x09; //存放要寫(xiě)的內(nèi)容 /**** 初始化 ****/ WDTCTL = WDTHOLD + WDTPW; //關(guān)閉看門(mén)狗 init_LED(); //初始化LED init_EXFlash(); //初始化Flash /**** 寫(xiě)數(shù)據(jù)到Flash ***/ write_Buf = 0x84; //寫(xiě)緩沖區(qū)1,指令格式:84H + 15位無(wú)關(guān)位 + 9位地址位 op_Start(); //做操作前的準(zhǔn)備工作 write_Data(); //寫(xiě)操作指令到Flash write_Buf = 0x00; //設(shè)置八位無(wú)關(guān)位 write_Data(); //寫(xiě)八位無(wú)關(guān)位 write_Buf = 0x00; //設(shè)置7位無(wú)關(guān)位和一位地址位 write_Data(); //寫(xiě)7位無(wú)關(guān)位和一位數(shù)據(jù)位 write_Buf= 0x08; //設(shè)置地址 write_Data(); //寫(xiě)地址 write_Buf = wData; //設(shè)置要寫(xiě)到Flash的內(nèi)容 write_Data(); //寫(xiě)數(shù)據(jù)到Flash op_Stop(); //停止操作 /******** 讀操作 ************/ op_Start(); //啟動(dòng)操作 write_Buf = 0x54; //讀數(shù)據(jù)的指令格式:54H + 15位無(wú)關(guān)位 + 9位地址位 + 8位無(wú)關(guān)位 write_Data(); //寫(xiě)讀指令到Flash write_Buf = 0x00; //設(shè)置8位無(wú)關(guān)位 write_Data(); //寫(xiě)數(shù)據(jù) write_Buf = 0x00; //設(shè)置7位無(wú)關(guān)位和一位地址位 write_Data(); //寫(xiě)數(shù)據(jù) write_Buf = 0x08; //設(shè)置另外8位地址 write_Data(); //寫(xiě)地址 write_Buf = 0xff; //設(shè)置8位無(wú)關(guān)位 write_Data(); //寫(xiě)數(shù)據(jù) //附加脈沖 opr_Start(); //準(zhǔn)備接收數(shù)據(jù) read_Data(); //接收數(shù)據(jù)到read_buf op_Stop(); //停止操作 /**** 把寫(xiě)的內(nèi)容和讀出的內(nèi)容顯示到LED ****/ while(1) { led_Buf[0]= wData; led_Buf[1] =read_Buf; led_Display(); // 顯示到LED }; } |