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

📄 at45db161.c.bak

📁 使用STR710的SPI接口访问外部EEPROM的例子程序.使用KEIL UV3编译.使用了MDK3.05操作系统.
💻 BAK
📖 第 1 页 / 共 2 页
字号:
	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 + -