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

📄 at45db161.c

📁 使用STR710的SPI接口访问外部EEPROM的例子程序.使用KEIL UV3编译.使用了MDK3.05操作系统.
💻 C
📖 第 1 页 / 共 2 页
字号:
	u8 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 < 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, u16 data_len)
{
	u16 PageNum,SubAddress;
	u16 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写入数据
		while ( IS_DATA_FLASH_BUSY()  );				// 等待芯片空闲
		ProgramBuffer1ToMainMemory(PageNum);				// 将buffer1的内容写入flash
		while ( IS_DATA_FLASH_BUSY()  );

		data_len -= w_len;
		save_data += w_len;
		PageNum += 1;
		SubAddress = 0;
	}
	return ;
}

/********************************************************************** 
*
* 名称: 	WritePaseData
* 说明: 	
* 功能: 	将N页数据写入主存储区
* 调用: 	none
* 输入: 	PageNum:写入页的起始地址
            nByte:写入的数据长度
            Data:写入数据的起始缓冲区
* 返回值: 	写成功:true  写错误:flase
*
***********************************************************************/
void WritePageData(u16 PageNum, u8 *save_data, u16 data_len)
{
	u16 SubAddress;
	u16 w_len;

	if(!data_len)
		return ;
	SubAddress = 0;		
	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;
}

/********************************************************************** 
*
* 名称: 	ReadPageData
* 说明: 	
* 功能: 	将N页数据读出
* 调用: 	none
* 输入: 	PageNum:读出页的起始地址
            nByte:读数据长度
            msg:读数据缓冲区
* 返回值: 	读成功:true  读错误:flase
*
***********************************************************************/
u8 ReadPageData( u16 PageNum, u16 nByte, u8 *msg)
{
	
	u16 i;
	u8 SubAddress = 0;
	i = 255;
	
	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 + -