⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.c

📁 MSP430平带的AT45B081型flash驱动
💻 C
字号:
////////////////////////////////////////////////////////////////
//              无线传感器网络节点程序                        //
//                Flash部分                                   //
//                编写:蒋路茸                                //
//                日期:2008.6                                //
//                版本:0.1                                   //
////////////////////////////////////////////////////////////////
//                P46     FLASH_BUSY                          //
//                P47     FLASH_RESET                         //
//                P50     FLASH_CS          STE1              //
//                P51     SPI_SIMO          SIMO1             //
//                P52     SPI_SOMI          SOMI1             //
//                P53     SPI_UCLK          UCLK1             //
////////////////////////////////////////////////////////////////


#include <msp430x14x.h>
#include "flash.h"


///////////////////////////////////////////////////
//    名称:Init_Spi
//    功能:SPI接口初始化
//    输入:null
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Init_Spi(void)                                
{
  P5SEL = 0x0E;                                   //设置P5为SPI模式
  P5DIR |= 0x01;                                  // 片选位为输出模式
  P4DIR &= ~BIT6;                                 //  BUSY为输入模式
  
  P3SEL &= ~BIT6;                                 //取消设置UART1的相应管脚功能
  P3SEL &= ~BIT7;
  
  U1CTL = CHAR + SYNC + MM + SWRST;               // 8位,SPI模式,主机控制模式
  U1TCTL = CKPL + SSEL1 + STC;                    //SMCLK,3线制
  U1BR0 = 0x02;                                   // 时钟配置 SPICLK = SMCLK/2
  U1BR1 = 0x00;
  U1MCTL = 0x00;
  ME2 = USPIE1;                                   //模块使能
  U1CTL &= ~SWRST;                                // SPI使能
  FLASH_CS_HI;                                    // 置高不选中
//  BCSCTL2 += SELM1;                               //MCLK的时钟源为时钟晶振
//  BCSCTL2 += SELM0;
  
//  BCSCTL2 &= ~SELS;                               //  辅助时钟设为dco
  
}


///////////////////////////////////////////////////
//    名称:Exit_Spi
//    功能:退出SPI
//    输入:null
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Exit_Spi(void)
{
  BCSCTL2 |= SELS;                                //  辅助时钟设为xt2  
  P5SEL = 0x00;                                   //  P5相应管脚的复用功能取消
/* 
  U1CTL = 0x10;                    //8bit数据,无校验位
  U1TCTL = 0x20;                   //波特率发生器选择SMCLK 16M Hz
  UBR0_1 = 0x82;                   //选择波特率  9600 kbps
  UBR1_1 = 0x06;
  UMCTL_1 = 0x00;  
  ME2 |= UTXE1 + URXE1;             //使能Uart1的TXD和RXD
  IE2 |= URXIE1;                    //使能Uart1的RX中断
//  IE2 |= UTXIE1;                   //使能Uart1的TX中断
  P3SEL |= BIT6;                   //设置P3.6为Uart0的TXD
  P3SEL |= BIT7;                   //设置P3.7为Uart0的RXD
  P3DIR |= BIT6;                    // P3.4输出
  P3DIR &= (~(BIT7));               // P3.5输入
*/
}


///////////////////////////////////////////////////
//    名称:Flash_Send_Byte
//    功能:SPI接口初始化
//    输入:null
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Flash_Send_Byte(unsigned char byte)          //通过SPI发送一个字节至Flash
{
  while(FLASH_BUSY == 0);                         //等待AT45DB081空闲
  U1TXBUF = byte;                                 //发送一个字节数据
  while((U1TCTL & 0x01) == 0);                    // 等待发送完毕
}


///////////////////////////////////////////////////
//    名称:Flash_Busy
//    功能:检查flash是否忙 
//    输入:null
//    输出:null
//    返回:如果忙返回1,不忙返回0 
///////////////////////////////////////////////////
unsigned char Flash_Busy(void)
{
  unsigned char flag_busy;
  FLASH_CS_LO;                                    //置cs低选中
  Flash_Send_Byte(0xD7);
  Flash_Send_Byte(0xFF);                                //写字节数据,使字节数据从SO移出
  flag_busy = U1RXBUF;                            //Receive_Byte();
  FLASH_CS_HI;                                    //置cs高不选中     
  if (flag_busy & 0x80)
      flag_busy = 0;
  else
      flag_busy = 1;
  return flag_busy;              
}


///////////////////////////////////////////////////
//    名称:Flash_Write_Buffer1
//    功能:向flash缓冲区buffer1或写入指定数量的数据 
//    输入:null
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Flash_Write_Buffer1(unsigned char *inbuffer,unsigned int buffer_offset,unsigned int count)   
                                                  //  offset和count都必须小于264
{ 
  unsigned int i;
  unsigned char *tempbuffer;
  tempbuffer = inbuffer;
  FLASH_CS_LO;                                    //  置cs低选中
  Flash_Send_Byte(0x84);                                //  写buffer1指令
  Flash_Send_Byte(0x00);                                //  写无关位  
  Flash_Send_Byte((unsigned char) (buffer_offset >> 8));//  强制转换高位
  Flash_Send_Byte((unsigned char) buffer_offset);       //  强制转换低位
  for(i=0;i<count;i++)                            //  将count个字节写入FLASH Buffer1
  {
    Flash_Send_Byte(*tempbuffer);
    tempbuffer++;
  }
  FLASH_CS_HI;                                //置cs高不选中     
}


///////////////////////////////////////////////////
//    名称:Flash_Read_Buffer1
//    功能:从buffer1向datasave_buff数组读指定数量的数据
//    输入:null
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Flash_Read_Buffer1(unsigned char *inbuffer,unsigned int buffer_offset,unsigned count)
                                                  //  offset和count都必须小于264
{
  unsigned int i;
  unsigned char *tempbuffer;
  tempbuffer = inbuffer;
  FLASH_CS_LO;                                    //置cs低选中
  Flash_Send_Byte(0xD4);
  Flash_Send_Byte(0X00);
  Flash_Send_Byte((unsigned char) (buffer_offset >> 8));//  强制转换高位
  Flash_Send_Byte((unsigned char) buffer_offset);       //  强制转换低位
  Flash_Send_Byte(0);
  for(i=0;i<count;i++)
  {
    Flash_Send_Byte(0x11);
    *tempbuffer= U1RXBUF;                         //Receive_Byte
    tempbuffer++;
  }    
  FLASH_CS_HI;                                    //置cs高不选中
}


///////////////////////////////////////////////////
//    名称:Flash_Read_Page
//    功能:从flash存贮区向buffer1写一页 
//    输入:null
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Flash_Read_Page_Buffer1(unsigned int page_address)
{ 
   FLASH_CS_LO;                                   //置cs低选中
   Flash_Send_Byte(0x53);
   page_address = page_address << 1;
   Flash_Send_Byte((unsigned char)(page_address>>8));
   Flash_Send_Byte((unsigned char)page_address); 
   Flash_Send_Byte(0);                            //写无关位
   FLASH_CS_HI;                                   //置cs高不选中
   while(Flash_Busy());                           //等待器件写完结束     
}

///////////////////////////////////////////////////
//    名称:Flash_Write_Page
//    功能:从buffer1向flash存贮区带擦除 
//    输入:null
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Flash_Write_Page_Buffer1(unsigned int page_address)
{ 
   FLASH_CS_LO;                                   //置cs低选中
   Flash_Send_Byte(0x83);
   page_address = page_address << 1;
   Flash_Send_Byte((unsigned char)(page_address>>8));
   Flash_Send_Byte((unsigned char)page_address); 
   Flash_Send_Byte(0);                            //写无关位
   FLASH_CS_HI;                                   //置cs高不选中
   while(Flash_Busy());                           //等待器件写完结束     
}

///////////////////////////////////////////////////
//    名称:Flash_Write_Buffer2
//    功能:向flash缓冲区buffer2或写入指定数量的数据 
//    输入:null
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Flash_Write_Buffer2(unsigned char *inbuffer,unsigned int buffer_offset,unsigned int count)   
                                                  //  offset和count都必须小于264
{ 
  unsigned int i;
  unsigned char *tempbuffer;
  tempbuffer = inbuffer;
  FLASH_CS_LO;                                    //  置cs低选中
  Flash_Send_Byte(0x87);                                //  写buffer1指令
  Flash_Send_Byte(0x00);                                //  写无关位  
  Flash_Send_Byte((unsigned char) (buffer_offset >> 8));//  强制转换高位
  Flash_Send_Byte((unsigned char) buffer_offset);       //  强制转换低位
  for(i=0;i<count;i++)                            //  将count个字节写入FLASH Buffer1
  {
    Flash_Send_Byte(*tempbuffer);
    tempbuffer++;
  }
  FLASH_CS_HI;                                //置cs高不选中     
}


///////////////////////////////////////////////////
//    名称:Flash_Read_Buffer2
//    功能:从buffer2向datasave_buff数组读指定数量的数据
//    输入:null
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Flash_Read_Buffer2(unsigned char *inbuffer,unsigned int buffer_offset,unsigned count)
                                                  //  offset和count都必须小于264
{
  unsigned int i;
  unsigned char *tempbuffer;
  tempbuffer = inbuffer;
  FLASH_CS_LO;                                    //置cs低选中
  Flash_Send_Byte(0xD6);
  Flash_Send_Byte(0X00);
  Flash_Send_Byte((unsigned char) (buffer_offset >> 8));//  强制转换高位
  Flash_Send_Byte((unsigned char) buffer_offset);       //  强制转换低位
  Flash_Send_Byte(0);
  for(i=0;i<count;i++)
  {
    Flash_Send_Byte(0x11);
    *tempbuffer= U1RXBUF;                         //Receive_Byte
    tempbuffer++;
  }    
  FLASH_CS_HI;                                    //置cs高不选中
}


///////////////////////////////////////////////////
//    名称:Flash_Read_Page
//    功能:从flash存贮区向buffer2写一页 
//    输入:null
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Flash_Read_Page_Buffer2(unsigned int page_address)
{ 
   FLASH_CS_LO;                                   //置cs低选中
   Flash_Send_Byte(0x55);
   page_address = page_address << 1;
   Flash_Send_Byte((unsigned char)(page_address>>8));
   Flash_Send_Byte((unsigned char)page_address); 
   Flash_Send_Byte(0);                            //写无关位
   FLASH_CS_HI;                                   //置cs高不选中
   while(Flash_Busy());                           //等待器件写完结束     
}

///////////////////////////////////////////////////
//    名称:Flash_Write_Page
//    功能:从buffer1向flash存贮区带擦除 
//    输入:null
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Flash_Write_Page_Buffer2(unsigned int page_address)
{ 
   FLASH_CS_LO;                                   //置cs低选中
   Flash_Send_Byte(0x86);
   page_address = page_address << 1;
   Flash_Send_Byte((unsigned char)(page_address>>8));
   Flash_Send_Byte((unsigned char)page_address); 
   Flash_Send_Byte(0);                            //写无关位
   FLASH_CS_HI;                                   //置cs高不选中
   while(Flash_Busy());                           //等待器件写完结束     
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -