MSP430驱动AT45DB041(Flash)进行读写操作例程

发布者:SparkleMagic最新更新时间:2016-08-22 来源: eefocus关键字:MSP430  AT45DB041  读写操作 手机看文章 扫描二维码
随时随地手机看文章
/*
分享MSP430驱动AT45DB041(Flash)进行读写操作例程

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

//Microcontrol CODE

//存储器  读写程序
#define    UCHAR                      unsigned char
#define    UINT                       unsigned int
///***********************************************************/
#define cs_1      P3OUT=P3OUT|0X01   //cs  p3.0
#define cs_0      P3OUT=P3OUT&0Xfe
#define sck_1     P3OUT=P3OUT|0X02   //sck p3.1
#define sck_0     P3OUT=P3OUT&0Xfd
#define si_1      P3OUT=P3OUT|0X04   //si  p3.2
#define si_0      P3OUT=P3OUT&0Xfb
#define so        P3IN&0X08          //so  p3.3    so是MCU 输入口   存储器的输出口 P3.3要定义为输入口
#define wp_1      P3OUT=P3OUT|0X10   //wp  p3.4
#define wp_0      P3OUT=P3OUT&0Xef
#define rst_1     P3OUT=P3OUT|0X20   //rst p3.5
#define rst_0     P3OUT=P3OUT&0Xdf
void nop_041(unsigned char p)
{
    while(p--);
}

/////////////从DB041中读一字节的数据
unsigned char SPI_HostReadByte(void)
{
    unsigned char i,rByte=0;
    unsigned char xhshuo=0x80;
    for(i=0;i<8;i++)
    {
        sck_0;// SPI_SCK=0
        nop_041(20);
        sck_1;//SPI_SCK=1
        nop_041(20);
        if(P3IN&0X08)
            rByte=rByte|xhshuo;
        
        xhshuo>>=1;
    }
    
    return rByte;
}

/////////////往DB041中写一字节的数据
void SPI_HostWriteByte(unsigned char wByte)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        if((wByte<         {
            si_1;
        }//SPI_SI=1
        else
        {
            si_0;
        }//SPI_SI=0
        
        sck_0;// SPI_SCK=0;
        nop_041(20);
        sck_1;// SPI_SCK=1;
        nop_041(20);
    }
}

/*Status Register Format:                                                     */
/*   -----------------------------------------------------------------------  */
/*  |  bit7  |  bit6  |  bit5  |  bit4  |  bit3  |  bit2  |  bit1  |  bit0  | */
/*  |--------|--------|--------|--------|--------|--------|--------|--------| */
/*  |RDY/BUSY|  COMP  |   0    |   1    |   1    |   1    |   X    |   X    | */
/*   -----------------------------------------------------------------------  */
/*  bit7 - 忙标记,0为忙1为不忙。                                             */
/*         当Status Register的位0移出之后,接下来的时钟脉冲序列将使SPI器件继续*/
/*         将最新的状态字节送出。                                             */
/*  bit6 - 标记最近一次Main Memory Page和Buffer的比较结果,0相同,1不同。     */
/*  bit5                                                                      */
/*  bit4                                                                      */
/*  bit3                                                                      */
/*  bit2 - 这4位用来标记器件密度,对于AT45DB041B,这4位应该是0111,一共能标记 */
/*         16种不同密度的器件。                                               */
/*  bit1                                                                      */
/*  bit0 - 这2位暂时无效                                                      */
/******************************************************************************/

/////读状态寄存器的内容 0为忙1为不忙
unsigned char AT45DB041B_StatusRegisterRead(void)
{
    unsigned char i;

    cs_0 ;// SPI_CS=0;
    SPI_HostWriteByte(0xd7); ///////////////////////
    i=SPI_HostReadByte();
    cs_1;// SPI_CS=1
    return i;
}

/*参数:                                                                      */
/*    PA      - 页地址,0~2047                                                */
/*    BFA     - 指定BUFFER中的起始写入地址                                    */
/*    pHeader - 指定数据的首地址                                              */
/*    len     - 指定数据的长度                                                */
/******************************************************************************/
void AT45DB041B_ContinuousArrayRead(UINT PA,UINT BFA,unsigned char *pHeader,UINT len)
{
    unsigned int i;
    do
    {
        i=AT45DB041B_StatusRegisterRead()&0x80;
    }while(!i);

    cs_0 ;//SPI_CS=0;
    SPI_HostWriteByte(0x52);
    SPI_HostWriteByte((unsigned char)(PA>>7));
    SPI_HostWriteByte((unsigned char)((PA<<1)|(BFA>>8)));
    SPI_HostWriteByte((unsigned char)BFA);

    for(i=0;i<4;i++)
    {
        SPI_HostWriteByte(0x00);
    }
    
    for(i=0;i     {
        pHeader[I]=SPI_HostReadByte();
    }
    
    cs_1;//SPI_CS=1;
}

/******************************************************************************/
/*描述:                                                                      */
/*    将指定数据写入从某个地址(0~263)开始的BUFFER中。                       */
/*参数:                                                                      */
/*    buffer  - 选择BUFFER,01H选择BUFFER 1,02H选择BUFFER 2                  */
/*              在该指令序列中,操作码84H选择BUFFER 1,87H选择BUFFER 2        */
/*    BFA     - BUFFER中的起始地址,0~263                                     */
/*    pHeader - 待存数据的头指针                                              */
/*    len     - 待存数据的长度1~264                                           */
/******************************************************************************/
void AT45DB041B_BufferWrite(UCHAR buffer,UINT BFA,UCHAR *pHeader,UINT len)
{
    unsigned int i;
    
    do
    {
        i=AT45DB041B_StatusRegisterRead()&0x80;
    }while(!i);

    cs_0;//SPI_CS=0;
    switch(buffer)
    {
    case 1:
        SPI_HostWriteByte(0x84);
        break;
        
    case 2:
        SPI_HostWriteByte(0x87);
        break;
    }
    
    SPI_HostWriteByte(0x00);
    SPI_HostWriteByte((unsigned char)(BFA>>8));
    SPI_HostWriteByte((unsigned char)BFA);

    for(i=0;i     {
        SPI_HostWriteByte(pHeader[I]);
    }
    
    cs_1;//SPI_CS=1
}

/******************************************************************************/
/*描述:                                                                      */
/*    将指定数据写入从某个地址(0~263)开始的页中:包含2个动作,首先将指定数据*/
/*    写入到BUFFER 1或者BUFFER 2中,其中可以指定BUFFER中的起始写入地址,此写入*/
/*    动作不影响BUFFER中其它地址中的数据,然后再将BUFFER中的整个数据写入到某指*/
/*    定页中(带预擦除)。                                                      */
/*参数:                                                                      */
/*    buffer  - 选择BUFFER,01H选择BUFFER 1,02H选择BUFFER 2                  */
/*    PA      - 页地址,0~2047                                                */
/*    BFA     - 指定BUFFER中的起始写入地址                                    */
/*    pHeader - 指定数据的首地址                                              */
/*    len     - 指定数据的长度                                                */
/******************************************************************************/
void AT45DB041B_BufferToMainMemoryPageProgramWithBuilt_inErase(UCHAR buffer,UINT PA,UINT BFA,UCHAR *pHeader,UINT len)
{
    unsigned int i;
    
    AT45DB041B_BufferWrite(buffer,BFA,pHeader,len);
    do
    {
        i=AT45DB041B_StatusRegisterRead()&0x80;
    }while(!i);

    cs_0;// SPI_CS=0;
    switch(buffer)
    {
    case 1:
        SPI_HostWriteByte(0x83);
        break;
    
    case 2:
        SPI_HostWriteByte(0x86);
        break;
    }
    
    SPI_HostWriteByte((unsigned char)(PA>>7));
    SPI_HostWriteByte((unsigned char)(PA<<1));
    SPI_HostWriteByte(0x00);
    cs_1;//SPI_CS=1;
}

/******************************************************************************/
/*描述:                                                                      */
/*    与上一个函数的唯一区别是不带预擦除。                                    */
/******************************************************************************/
/*void AT45DB041B_BufferToMainMemoryPageProgramWithoutBuilt_inErase(UCHAR buffer,UINT PA,UINT BFA,UCHAR *pHeader,UINT len){
   unsigned int i;
    AT45DB041B_BufferWrite(buffer,BFA,pHeader,len);
   do{
      i=AT45DB041B_StatusRegisterRead()&0x80;}
    while(!i);
    cs_0;// SPI_CS=0;
    SPI_HostWriteByte(0x88+buffer);
    SPI_HostWriteByte((unsigned char)(PA>>7));
    SPI_HostWriteByte((unsigned char)(PA<<1));
    SPI_HostWriteByte(0x00);

    for(i=0;i    cs_1;// SPI_CS=1;
}
*/

/*////////////////////////////
void AT45DB041B_BufferToMainMemoryPageProgramWithoutBuilt_inErase(UCHAR buffer,UINT PA,UINT BFA,UCHAR *pHeader,UINT len){
    unsigned int i;
    AT45DB041B_BufferWrite(buffer,BFA,pHeader,len);
   do{
      i=AT45DB041B_StatusRegisterRead()&0x80;}
    while(!i);
    cs_0;// SPI_CS=0;
    switch(buffer){
        case 1:SPI_HostWriteByte(0x88);break;
        case 2:SPI_HostWriteByte(0x89);break;
    }
    SPI_HostWriteByte((unsigned char)(PA>>7));
    SPI_HostWriteByte((unsigned char)(PA<<1));
    SPI_HostWriteByte(0x00);
    cs_1;//SPI_CS=1;
}
关键字:MSP430  AT45DB041  读写操作 引用地址:MSP430驱动AT45DB041(Flash)进行读写操作例程

上一篇:实时记录MSP430编程问题
下一篇:MSP430单片机硬件知识-复位

推荐阅读最新更新时间:2024-03-16 15:06

MSP430电容触摸转轮和LED PWM输出设计
简介 电容触摸技术作为一种实用、时尚的人机交互方式,已经被广泛的应用到各种电子产品,小到电灯开关,大到平板电脑、触摸桌等。随之而来的是考验产品设计者如何发挥智慧,在把产品用户界面设计得方便简洁的同时,又能呈现产品绚丽的外观,从而带来良好的用户体验。 LED显示由于界面友好,可以实时反映触摸的位置信息,在电容触摸产品设计中得到广泛应用。本设计正是利用了大量的LED来实现呼吸灯、轨迹灯的特效,可以为例如灯光、音量、温度等带有调节功能的产品提供设计参考。 德州仪器的MSP430系列单片机以低功耗和外设模块的丰富性而著称,而针对电容触摸应用,MSP430的PIN RO电容触摸检测方式支持IO口直接连接检测电极,不需要
[单片机]
<font color='red'>MSP430</font>电容触摸转轮和LED PWM输出设计
MSP430G2333下位机乘法运算需要注意的一个问题
背景:   最近负责为主板管理电源的电源管理模块编写软体,使用的MCU为MSP430G2333。功能上很简单,即通过板子上的硬件拨码设定,或者通过IIC与主板通信,由主板的BIOS决定开机及关机的延时供电时间。 正文:   所有功能均按预期实现,但有一个bug在最后蹦了出来,即在延时关机设定时,明明设定为15、18、48个小时,却每次在9个多小时的时候,电源被执行关闭动作。9个多小时,很有意思的数字。不用深究,问题直接锁定在时间比对函数内。 1 // when the current time less than the setting time, return 0. Otherwize, return 1.
[单片机]
MSP430按键控制串口发送数据
#include msp430.h //MSP430G2553 - 使用USCI_A0,Up Mode, DCO SMCLK // // 介绍: 该程序利用USCI_A0来与计算机通信 通过接在P1.3口的按键来实现按一次发送一个数据 // 波特率9600,数据格式8N1 // // ACLK = 32768, SMCLK = 32768 MCLK = DCO-16M // // MSP430G2553 // ----------------- // /|| XIN|- // | | | // --|RST XOUT|- // |
[单片机]
UART、IrDA、SPI、I2C MSP430学习
SPI、IIC、UART区别 第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器) 第二,区别在电气信号线上: SPI总线由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现多个SPI设备互相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Sla
[单片机]
MSP430F149单片机实现公交卡/饭卡充值功能模块
实验目的 1. 最基础实现刷卡后显示冲值/扣款说明 2. 实现芯片内部寄存器的读写,实现可记忆性。 设计思路 根据M1射频卡与读写器的通讯过程,程序设计基本流程如下: 主函数架构: void main(void) { WDTCTL = WDTPW + WDTHOLD; // 关看门狗 int i = 0; unsigned char status; BoardConfig(0xf0); Init_Port(); InitUART(); Port_init(); //系统初始化,设置IO口属性 delay_ms(100); //延时100ms LCD_init(); //液晶参数初始化设置 LC
[单片机]
<font color='red'>MSP430</font>F149单片机实现公交卡/饭卡充值功能模块
MSP430的C语言编写注意事项
============================================================================================================================== 微处理器一般用于特定环境和特定用途,出于成本、功耗和体积的考虑,一般都要求尽量节省使用资源,并且,由于微处理器硬件一般都不支持有符号数、浮点数的运算,且运算位有限,因此,分配变量时必须仔细。另外要说明的是,速度和存储器的消耗经常是2个不可兼顾的目标,在多数情况下,编程者必须根据实际情况作出权衡和取舍。 需要注意的事项如下: 1) 通常在满足运算需求的前提下,尽量选择为变量定义字节
[单片机]
MSP430 串口接收指令控制LED亮灭
准备器材:MSP430开发板一块,串口线,PC,串口调试助手(可从网上下载) 八位数据,1个停止位,9600波特率无校验 /******************************************************************** //DM430-L型最小系统板串口测试程序,使用单片机的串口0 //使用板载BSL模块或者用户外接串口线到DB9,要求是直连公对母串口线 //使用串口调试助手发送数据到系统板,比如02,03等 //系统板会将收到的数据再发送到串口调试助手,接收采用中断模块,发送用查询 //板载的BSL模块可以通过跳线帽设置为USB转串口模式,笔记本电脑没有串口可以直接代替 //开发板
[单片机]
基于MSP430F149的无线环境监测传感器系统设计
引言   传感器技术与通信技术、计算机技术相结合构成的智能传感器以其较高的精度、良好的可靠性、功能的多样性等特点在过程控制以及信号监测中得到人们的关注, 已成为当今国内外研究的一大热点。本文设计了一种用于对环境信息进行实时监测的无线传感器系统, 在实际应用中能够对环境参数进行准确的测量并可靠传输, 体现了传感器系统数字化、智能化、无线化的优点。   该系统以 MSP430F149 超低功耗微控制器为核心, 配置新式的微型低功耗传感器, 可实时地对所测环境的温度、湿度、光照强度、有害气体浓度等参数进行测量处理。采用电池供电,无线传输, 避免了布线的烦琐, 而且具有良好的便携性。 系统硬件设计   整个传
[工业控制]
基于<font color='red'>MSP430</font>F149的无线环境监测传感器系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved