📄 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 + -