51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > MSP430单片机 > 详细内容
分享MSP430驱动AT45DB041(Flash)进行读写操作例程
发布时间:2009/7/27  阅读次数:811  字体大小: 【】 【】【

  

/*****************************************************************
*   文件名称:
*                       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
           };
          
}

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号