📄 at45db161.c.bak
字号:
PageNum <<= PAGE_RL;
AT45_Chip_Select_ENABLE;
BPSI_DataSendReceive( CONTINUOUS_ARRAY_READ ); // 命令
BPSI_DataSendReceive( PageNum / 256 ); // 高7位页地址
BPSI_DataSendReceive( ( ( PageNum % 256 ) & ADDR_MASK) | ( ( SubAddress / 256 ) & (~ADDR_MASK) ) );
/*低6位页地址和高2位页内地址*/
BPSI_DataSendReceive( SubAddress % 256 ); // 低8位页内地址
BPSI_DataSendReceive( 0 );
BPSI_DataSendReceive( 0 );
BPSI_DataSendReceive( 0 );
BPSI_DataSendReceive( 0 );
for ( i = 0; i < len; i++ )
{
*msg = BPSI_DataSendReceive(0xff); // 读出数据
msg ++;
}
AT45_Chip_Select_DISABLE;
return TRUE;
}
/**********************************************************************
*
* 名称: MainMemoryPageToBuffer1
* 说明:
* 功能: 将主存储区的指定页数据传送到buffer1
* 调用: none
* 输入: 页地址
* 返回值:
*
***********************************************************************/
void MainMemoryPageToBuffer1( u16 PageNum )
{
u8 i;
AT45_Chip_Select_ENABLE;
PageNum <<= PAGE_RL;
BPSI_DataSendReceive( MAIN_MEMORY_PAGE_TO_BUFFER1_COPY ); // 命令
BPSI_DataSendReceive( PageNum / 256 ); // 高7位地址
BPSI_DataSendReceive( PageNum % 256 ); // 低6位地址
BPSI_DataSendReceive( 0 );
AT45_Chip_Select_DISABLE;
i = 255;
while ( IS_DATA_FLASH_BUSY() && ( --i ) );
}
/**********************************************************************
*
* 名称: ProgramBuffer1ToMainMemory
* 说明:
* 功能: 将buffer1的数据写入主存储区
* 调用: none
* 输入: 页地址
* 返回值:
*
***********************************************************************/
void ProgramBuffer1ToMainMemory( u16 PageNum )
{
PageNum <<= PAGE_RL;
AT45_Chip_Select_ENABLE;
BPSI_DataSendReceive( BUFFER1_PROGRAM_WITH_ERASE ); // 命令
BPSI_DataSendReceive( PageNum / 256 ); // 高7位地址
BPSI_DataSendReceive( PageNum % 256 ); // 低6位地址
BPSI_DataSendReceive( 0 );
AT45_Chip_Select_DISABLE;
}
/**********************************************************************
*
* 名称: WriteMultiByteToMainMemory
* 说明:
* 功能: 将buffer1的数据写入主存储区
* 调用: none
* 输入: 页地址
* 返回值:
*
***********************************************************************/
u8 WriteMultiByteToMainMemory( u16 PageNum, u16 SubAddress, u8 *MultiByte, u8 len )
{
u8 i;
if ( !len )
{
return FALSE;
}
//if (IS_DATA_FLASH_BUSY()) return FALSE;
i = 255;
while ( IS_DATA_FLASH_BUSY() && ( --i ) ); // 等待芯片空闲
if ( i == 0)
{
//phase.Dsp_Pages = 1;return FALSE;
return FALSE;
} //test
MainMemoryPageToBuffer1( PageNum ); // 把指定页读取到buffer1
i = 255;
while ( IS_DATA_FLASH_BUSY() && ( --i ) ); // 等待芯片空闲
if ( !i )
{
//phase.Dsp_Pages = 1;return FALSE;
return FALSE;
} //test
WriteMultiByteToBuffer1( SubAddress, MultiByte, len ); // 向buffer1写入数据
ProgramBuffer1ToMainMemory( PageNum ); // 将buffer1的内容写入flash
// phase.Dsp_Pages = 0;
return TRUE;
}
/*=============================================================================
* 名称: WriteDataToFlash
* 描述: 将数据连续写入Flash,自动分页
* 创建: LXF、GTX 2006年4月20日
* 最后修订: 2006年4月20日 10:05:08
* 调用: None
* 输入参数: None
* 返回值: None
* 特殊说明: IAR Embedded Workbench for MSP430 V3.40a
*=============================================================================*/
void WriteDataToFlash(u32 TargetAddr, u8 *save_data, u8 data_len)
{
u16 PageNum,SubAddress;
u8 w_len;
if(!data_len)
return ;
PageNum = TargetAddr / PAGE_BYTE;
SubAddress = TargetAddr % PAGE_BYTE;
while(data_len)
{
if(data_len > (PAGE_BYTE - SubAddress))
w_len = PAGE_BYTE - SubAddress;
else
w_len = data_len;
while ( IS_DATA_FLASH_BUSY() ); // 等待芯片空闲
MainMemoryPageToBuffer1(PageNum); // 把指定页读取到buffer1
while ( IS_DATA_FLASH_BUSY() ); // 等待芯片空闲
WriteMultiByteToBuffer1(SubAddress,save_data,w_len); // 向buffer1写入数据
ProgramBuffer1ToMainMemory(PageNum); // 将buffer1的内容写入flash
data_len -= w_len;
save_data += w_len;
PageNum += 1;
SubAddress = 0;
}
return ;
}
/*=============================================================================
* 名称: ReadDataFromFlash
* 描述: 从Flash中连续读出数据
* 创建: LXF、GTX 2006年4月21日
* 最后修订: 2006年4月21日 15:33:10
* 调用: None
* 输入参数: None
* 返回值: None
* 特殊说明: IAR Embedded Workbench for MSP430 V3.40a
*=============================================================================*/
u8 ReadDataFromFlash(u32 TargetAddr, u8 *read_data, u8 data_len)
{
u16 PageNum,SubAddress;
u8 i;
i = 255;
if ( data_len == 0 )
{
return FALSE;
}
while ( IS_DATA_FLASH_BUSY() && i-- )
{
;
}
if ( i == 0 )
{
return FALSE;
}
PageNum = TargetAddr / PAGE_BYTE;
SubAddress = TargetAddr % PAGE_BYTE;
PageNum <<= PAGE_RL;
AT45_Chip_Select_ENABLE;
BPSI_DataSendReceive( CONTINUOUS_ARRAY_READ ); // 命令
BPSI_DataSendReceive( PageNum / 256 ); // 高7位页地址
BPSI_DataSendReceive( ( ( PageNum % 256 ) & ADDR_MASK) | ( ( SubAddress / 256 ) & (~ADDR_MASK) ) ); /*低6位页地址和高2位页内地址*/
BPSI_DataSendReceive( SubAddress % 256 ); // 低8位页内地址
BPSI_DataSendReceive( 0 );
BPSI_DataSendReceive( 0 );
BPSI_DataSendReceive( 0 );
BPSI_DataSendReceive( 0 );
for ( i = 0; i < data_len; i++ )
{
*read_data = BPSI_DataSendReceive(0xff); // 读出数据
read_data ++;
}
AT45_Chip_Select_DISABLE;
return TRUE;
}
/**********************************************************************
*
* 名称: AutoPageRewriteThroughBuffer2
* 说明:
* 功能: 重写一页
* 调用: none
* 输入: 地址
* 返回值: none
*
***********************************************************************/
void AutoPageRewriteThroughBuffer2( u16 PageNum )
{
AT45_Chip_Select_ENABLE;
PageNum <<= PAGE_RL;
BPSI_DataSendReceive( AUTO_PAGE_THROUGH_BUFFER2_REWRITE ); // 命令
BPSI_DataSendReceive( PageNum / 256 ); // 高7位地址
BPSI_DataSendReceive( PageNum % 256 ); // 低6位地址
BPSI_DataSendReceive( 0 );
AT45_Chip_Select_DISABLE;
}
/**********************************************************************
*
* 名称: WritePaseData
* 说明:
* 功能: 将N页数据写入主存储区
* 调用: none
* 输入: PageNum:写入页的起始地址
nByte:写入的数据长度
Data:写入数据的起始缓冲区
* 返回值: 写成功:true 写错误:flase
*
***********************************************************************/
u8 WritePaseData( u16 PageNum, u16 nByte, u8 *Data)
{
u16 i;
u8 nPage;
nPage = nByte / PAGE_BYTE + 1;
while(nPage--)
{
i = 255;
while ( IS_DATA_FLASH_BUSY() && ( --i ) ); // 等待芯片空闲
if ( i == 0)
{
return FALSE;
}
MainMemoryPageToBuffer1( PageNum ); // 把指定页读取到buffer1
i = 255;
while ( IS_DATA_FLASH_BUSY() && ( --i ) ); // 等待芯片空闲
if ( !i )
{
return FALSE;
}
//WriteMultiByteToBuffer1( SubAddress, MultiByte, len ); // 向buffer1写入数据
//ProgramBuffer1ToMainMemory( PageNum ); // 将buffer1的内容写入flash
PageNum <<= PAGE_RL;
AT45_Chip_Select_ENABLE;
BPSI_DataSendReceive( MAIN_MEMORY_THROUGH_BUFFER1_PROGRAM ); // 命令
BPSI_DataSendReceive( PageNum / 256 ); // 写页地址,页内子地址为0
BPSI_DataSendReceive( PageNum % 256 );
BPSI_DataSendReceive( 0 );
if(nPage == 0) //写到数据存放的最后一页
{
for ( i = 0; i < (nByte % PAGE_BYTE); i++ )
{
BPSI_DataSendReceive( *Data ); // 写入数据
Data++;
}
}
else
{
for ( i = 0; i < PAGE_BYTE; i++ )
{
BPSI_DataSendReceive( *Data ); // 写入数据
Data++;
}
}
AT45_Chip_Select_DISABLE;
PageNum++;
}
return TRUE;
}
/**********************************************************************
*
* 名称: ReadPaseData
* 说明:
* 功能: 将N页数据读出
* 调用: none
* 输入: PageNum:读出页的起始地址
nByte:读数据长度
msg:读数据缓冲区
* 返回值: 写成功:true 写错误:flase
*
***********************************************************************/
u8 ReadPaseData( u16 PageNum, u16 nByte, u8 *msg)
{
u16 i;
i = 255;
if ( len == 0 )
{
return FALSE;
}
while ( IS_DATA_FLASH_BUSY() && i-- )
{
;
}
if ( i == 0 )
{
return FALSE;
}
PageNum <<= PAGE_RL;
AT45_Chip_Select_ENABLE;
BPSI_DataSendReceive( CONTINUOUS_ARRAY_READ ); // 命令
BPSI_DataSendReceive( PageNum / 256 ); // 高7位页地址
BPSI_DataSendReceive( ( ( PageNum % 256 ) & ADDR_MASK) | ( ( SubAddress / 256 ) & (~ADDR_MASK) ) );
/*低6位页地址和高2位页内地址*/
BPSI_DataSendReceive( SubAddress % 256 ); // 低8位页内地址
BPSI_DataSendReceive( 0 );
BPSI_DataSendReceive( 0 );
BPSI_DataSendReceive( 0 );
BPSI_DataSendReceive( 0 );
for ( i = 0; i < nByte; i++ )
{
*msg = BPSI_DataSendReceive(0xff); // 读出数据
msg ++;
}
AT45_Chip_Select_DISABLE;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -