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

📄 at45db081b.c

📁 基于MSP430F1611处理器的使用硬件SPI0控制闪存芯片AT45DB081B的代码,编写了底层命令和页写,读命令
💻 C
字号:
#include "AT45DB081B.h"
#include "MSP430X16X.h"
#include "General.h"

void Init_AT45DB_IO( )  //AT45DB IO口初始化
{
  P4DIR |= FLASHWP+FLASHRST+FLASHCS;
  P4OUT |= FLASHWP+FLASHRST+FLASHCS;
}

void Disable_AT45DB_IO( )  //AT45DB IO口初始化
{
  P4DIR &= ~(FLASHWP+FLASHRST+FLASHCS);
}

void Write_AT45DB_Byte( unsigned char udata)  //对AT45DB写入一个字节
{
  U1TXBUF=udata;
  while((IFG2 & URXIFG1)==0);
  IFG2 &= ~URXIFG1;
}

unsigned char Read_AT45DB_Byte( ) //从AT45DB读取一个字节
{
  unsigned char temp=0;
  U1TXBUF=0;
  while((IFG2 & URXIFG1)==0);
  temp=U1RXBUF;
  return temp;
}
			
unsigned char Read_AT45DB_Status( ) //读取AT45DB的状态字节
{
  unsigned char temp;

  AT45DB_EN;
          
  Write_AT45DB_Byte(AT45DB_READSTATUS);
  temp = Read_AT45DB_Byte( );
  
  AT45DB_DA;

  return temp;
}

void AT45DB_WaitReady( )   //等待AT45DB直至Ready
{
  while((P4IN & FLASHRDY) == 0);
//  do
//  {
//    status = Read_AT45DB_Status( );
//  }
//  while( (status&0x80) == 0);
}

////////////////////////////////////////////////////////////////////////////////
//  向AT45DB数据缓冲器写入数据                                                //
//  BufferNum: 写入Buffer的号码, 取值1或2,分别对应Buffer1和Buffer2            //
//  *pubWriteData: 写入数据的指针   uiBufAdr: 写入Buffer的首地址, 0-263       //
//  uiByteNum: 写入数据的个数                                                 //
////////////////////////////////////////////////////////////////////////////////
void WriteToBuffer( unsigned char BufferNum, unsigned char *pudWriteData,
                    unsigned int uiBufAdr, unsigned int uiByteNum)
{
  unsigned char cmd;
  unsigned int  i;
  unsigned char *temp;

  switch(BufferNum)         //判断写入Buffer1还是Buffer2
  {
    case BUFFER1:
    {
      cmd = FLASHBUFFER1;
      break;
    }     
    case BUFFER2:
    {
      cmd = FLASHBUFFER2;
      break;
    }
  }
  temp = pudWriteData;

  AT45DB_EN;                //使能AT45DB
  Write_AT45DB_Byte(cmd);   //写入命令
  Write_AT45DB_Byte(0);     //8位Don't Care bit
  Write_AT45DB_Byte( (unsigned char)(uiBufAdr>>8) );  //写入7位Don't Care bit+地址最高位
  Write_AT45DB_Byte( (unsigned char)uiBufAdr );       //写入地址低8位

  for( i = 0; i<uiByteNum; i++)                       //连续写入字节
  {
    Write_AT45DB_Byte(*temp);
    temp++;
  }

  AT45DB_DA;                //禁止AT45DB
}
		 
////////////////////////////////////////////////////////////////////////////////
//  把AT45DB数据缓冲器中的内容写入页                                          //
//  BufferNum: Buffer的号码, 取值1或2,分别对应Buffer1和Buffer2                //
//  uiPageAdr: 写入Page的地址, 0-4095                                         //
////////////////////////////////////////////////////////////////////////////////	
void BufferToPage(unsigned char BufferNum, unsigned int uiPageAdr)
{
  unsigned char cmd;

  switch(BufferNum)         //判断写入Buffer1还是Buffer2
  {
    case BUFFER1:
    {
      cmd = FLASHBUFFER1_TO_MAIN;
      break;
    }
    case BUFFER2:
    {
      cmd = FLASHBUFFER2_TO_MAIN;
      break;
    }
  }
  AT45DB_WaitReady( );

  AT45DB_EN;
  Write_AT45DB_Byte(cmd);
  uiPageAdr<<=1;
  Write_AT45DB_Byte( (unsigned char)(uiPageAdr>>8) ); //3个保留位+Page地址高5位
  Write_AT45DB_Byte( (unsigned char)uiPageAdr );      //Page地址低7位+1位Dont' Care bit
  Write_AT45DB_Byte(0);                               //8bits Don't Care bit

  AT45DB_DA;

}

////////////////////////////////////////////////////////////////////////////////
//  向AD45D的主内存进行页读取                                                 //
//  *pubReadData: 读取数据后存放的指针  uiStartAdr: 读取Page内的首地址, 0-263 //
//  uiByteNum: 读取数据的个数           uiPageAdr:  页地址 0-4095             //
////////////////////////////////////////////////////////////////////////////////
void ReadPage( unsigned char *pucReadData, unsigned int uiByteNum,
               unsigned int uiPageAdr, unsigned int uiStartAdr)
{
  unsigned char ucPageStartMixAdr;
  unsigned int  i;

  AT45DB_WaitReady( );
  AT45DB_EN;
  Write_AT45DB_Byte(READMAINPAGE);
  uiPageAdr<<=1;
  Write_AT45DB_Byte( (unsigned char)(uiPageAdr>>8) ); //3个保留位+Page地址高5位
  ucPageStartMixAdr = (unsigned char)uiPageAdr | (unsigned char)(uiStartAdr>>8);
  Write_AT45DB_Byte(ucPageStartMixAdr);               //Page地址低7位+Page起始地址最高位
  Write_AT45DB_Byte( (unsigned char)uiStartAdr );     //Page起始地址低8位

  for( i= 0; i<4; i++)                                //32个Don't Care bits
    Write_AT45DB_Byte(0);

  for( i = 0; i< uiByteNum; i++)                      //读取数据到指定位置
  {
    *pucReadData = Read_AT45DB_Byte( );
    pucReadData ++;
  }

  AT45DB_DA;

}

void WritePage(unsigned char *pucWriteData, unsigned int uiByteNum,
               unsigned int uiPageAdr, unsigned int uiStartAdr)
{
  AT45DB_WaitReady( );
  WriteToBuffer(BUFFER1, pucWriteData,uiStartAdr,uiByteNum);
  AT45DB_WaitReady( );
  BufferToPage(BUFFER1,uiPageAdr);
}

void PageErase(unsigned int uiPageAdr)
{
  AT45DB_WaitReady( );

  AT45DB_EN;                    //使能AT45DB
  Write_AT45DB_Byte(PAGEERASE); //写入命令
  uiPageAdr<<=1;
  Write_AT45DB_Byte((unsigned char)(uiPageAdr>>8));   //3个保留位+Page地址高5位
  Write_AT45DB_Byte((unsigned char)(uiPageAdr));      //Page地址低7位+1位Dont' Care bit
  Write_AT45DB_Byte(0);                               //8bits Don't Care bit

  AT45DB_DA;
}

void BlockErase(unsigned int uiBlockAdr)
{
  AT45DB_WaitReady( );

  AT45DB_EN;                      //使能AT45DB
  Write_AT45DB_Byte(BLOCKERASE);  //写入命令
  uiBlockAdr<<=4;
  Write_AT45DB_Byte((unsigned char)(uiBlockAdr>>8));   //3个保留位+Page地址高5位
  Write_AT45DB_Byte((unsigned char)(uiBlockAdr));      //Page地址低4位+4位Dont' Care bit
  Write_AT45DB_Byte(0);                                //8bits Don't Care bit

  AT45DB_DA;
}

⌨️ 快捷键说明

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