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

📄 at45db161.c.bak

📁 使用STR710的SPI接口访问外部EEPROM的例子程序.使用KEIL UV3编译.使用了MDK3.05操作系统.
💻 BAK
📖 第 1 页 / 共 2 页
字号:
/*=========================================================================*
 * 项目:		
 * 文件:		.\src\bsp\at45db161.c
 * 描述:		at45db161的驱动程序
 * 编译:		
 * 版本:		0.1
 * 创建日期:	2007年6月21日
 * 最后修订:	
 * 函数列表:
 * 修改历史:		
 * 编译环境:	RVMDK 3.05 + RTL-ARM 3.05
 * ----------------------------------------------------------------------
 * 使用BSPI1,主模式,BSPI1的SSN脚接10K上拉电阻
 * AT45DB的片选CS脚接str710的P1。1
*=========================================================================*/
#define _BSP_DB161_C
#include <71x_lib.h>
#include <RTL.h>
#include"AT45DB161.h"
/*
#define BSPI1_SO		0x10
#define BSPI1_SI		0x20
#define BSPI1_SCLK		0x40
#define BSPI1_SSN		0x80
#define AT45_CS			0x02

#define  AT45_Chip_Select_ENABLE  GPIO1->PD &= ~AT45_CS
#define  AT45_Chip_Select_DISABLE GPIO1->PD |=  AT45_CS
*/
#define SPI1_ERR_EXIT(v)		v -= 1; if(v == 0)	return( 0 );

/*=============================================================================
 * 名称:			SC752Delay
 * 描述:			延时
 * 创建:			2007年6月22日
 * 最后修订:		
 * 调用:			None
 * 输入参数:		延时时间
 * 返回值:			None
 * 特殊说明:		RVMDK 3.05 + RTL-ARM 3.05
 *=============================================================================*/
void AT45Delay( u32 n )
{
	while ( n-- )
 	;
}
/*=============================================================================
 * 名称:			init BSPI1 for AT45DB161
 * 描述:			初始化BSPI1
 * 创建:			2007年6月20日
 * 最后修订:		
 * 调用:			None
 * 输入参数:		None
 * 返回值:			None
 * 特殊说明:		RVMDK 3.05 + RTL-ARM 3.05
 *=============================================================================*/
void initAT45DB161(void)
{

	GPIO_Config (GPIO0, BSPI1_SO | BSPI1_SI | BSPI1_SCLK, GPIO_AF_PP);
	GPIO_Config (GPIO1, AT45_CS, GPIO_OUT_PP);
	GPIO_Config (GPIO0, BSPI1_SSN, GPIO_IN_TRI_CMOS);
	AT45_Chip_Select_DISABLE;
/* -------------------------------------------
Configue BSPI1 as a Master
------------------------------------------- */
  /* Initialize BSPI1 */
	BSPI_Init ( BSPI1 ) ;
	BSPI_ClockDividerConfig ( BSPI1, 6); // Configure Baud rate Frequency :-->APB1/8 
	BSPI_Enable ( BSPI1, ENABLE );	 //Enable BSPI1 */
	BSPI_MasterEnable ( BSPI1, ENABLE);//Configure BSPI0 as a Master */
	BSPI_ClkActiveHigh( BSPI1, DISABLE);//Configure the clock to be active high */
	BSPI_ClkFEdge( BSPI1, DISABLE);	//Enable capturing the first Data sample on the first edge of SCK */
	BSPI_8bLEn( BSPI1, ENABLE);	//Set the word length to 8 bit */
//	BSPI_TrFifoDepth(BSPI1, 1);	//Set tx fifo 1 word
//	BSPI_RcFifoDepth(BSPI1, 1);	//Set rx fifo 1 word
}

/*=============================================================================
 * 名称:			SEND and receive data from AT45DB
 * 描述:			以8位方式从AT45DB发送和接收数据
 * 创建:			2007年6月20日
 * 最后修订:		
 * 调用:			None
 * 输入参数:		需要发送的8位数据
 * 返回值:			接收到的8位数据
 * 特殊说明:		RVMDK 3.05 + RTL-ARM 3.05
 *=============================================================================*/
u8 BPSI_DataSendReceive(u8 data)    
{
	u8 temp;
	u32 i;
	i = 1000000;
	while ( BSPI1->CSR2 & BSPI_RFNE )
	{
		temp = BSPI0->RXR;
		SPI1_ERR_EXIT(i);
	}
	while ( !( BSPI1->CSR2 & BSPI_TFE ) )
	{
		SPI1_ERR_EXIT(i);
	}
	BSPI0->TXR = data << 8; 			
	while ( !( BSPI1->CSR2 & BSPI_RFF ) )
	{
		SPI1_ERR_EXIT(i);
	}
	
	temp = ( BSPI1->RXR >> 8 );   	   
	return temp;                   
}
/*=============================================================================
 * 名称:			Reset AT45DB
 * 描述:			复位AT45DB
 * 创建:			2007年6月20日
 * 最后修订:		
 * 调用:			None
 * 输入参数:		None
 * 返回值:			None
 * 特殊说明:		RVMDK 3.05 + RTL-ARM 3.05
 					at45->cs:str710->p1.15
 *=============================================================================*/
void AT45_Reset(void)
{
	AT45_Chip_Select_DISABLE;
	os_dly_wait (8);
	AT45_Chip_Select_ENABLE; //select dataflash
}

u8 AT45_Read_REG(void)
{
	u8 tmp;
	AT45_Chip_Select_ENABLE;
	BPSI_DataSendReceive(0xD7);
	tmp = BPSI_DataSendReceive(0x0);
	AT45_Chip_Select_DISABLE;

	return tmp;
}

/*=============================================================================
 * 名称:			Wait for AT45DB ready
 * 描述:			等待AT45DB进入就绪状态
 * 创建:			2007年6月20日
 * 最后修订:		
 * 调用:			None
 * 输入参数:		None
 * 返回值:			None
 * 特殊说明:		RVMDK 3.05 + RTL-ARM 3.05
 *=============================================================================*/
void AT45_Ready(void)
{
	u8 tmp = 0x00;

	while(!(tmp & 0x80))
	{
	   tmp = AT45_Read_REG();
	}
}
/*=============================================================================
 * 名称:			Detect AT45DB
 * 描述:			检测AT45DB
 * 创建:			2007年6月20日
 * 最后修订:		
 * 调用:			None
 * 输入参数:		None
 * 返回值:			AT45DB的状态寄存器中的容量位,根据容量可确定AT45DB型号
 * 特殊说明:		RVMDK 3.05 + RTL-ARM 3.05
 *=============================================================================*/
u8 Detect_AT45DB(void)
{
	u8 temp;

	AT45_Ready(); //wait until dataflash is ready
	temp = AT45_Read_REG();

	return (temp>>2)&0x0f;
}


/********************************************************************** 
*
* 名称: 	WriteByteToBuffer1
* 说明: 	
* 功能: 	向buffer1写入一个字节
* 调用: 	none
* 输入: 	地址,数据
* 返回值: 	none
*
***********************************************************************/
/*
void WriteByteToBuffer1(u16 Address, u8 Data)
{
	AT45_Chip_Select_ENABLE;
	BPSI_DataSendReceive(BUFFER1_WRITE);		// 写入命令
	BPSI_DataSendReceive(0);
	BPSI_DataSendReceive(Address/256);			// 2位高位地址
	BPSI_DataSendReceive(Address%256);		// 8位低位地址
	BPSI_DataSendReceive(Data);				// 写入数据
	AT45_Chip_Select_DISABLE;
}
*/
/********************************************************************** 
*
* 名称: 	WriteMultiByteToBuffer1
* 说明: 	
* 功能: 	向buffer1写入多个字节
* 调用: 	none
* 输入: 	地址,数据,数据长度
* 返回值: 	none
*
***********************************************************************/
void WriteMultiByteToBuffer1( u16 Address, u8 *Data, u8 len )
{
	u8 i;
	if ( len == 0 )
	{
		return ;
	}
	AT45_Chip_Select_ENABLE;
	BPSI_DataSendReceive( BUFFER1_WRITE );		// 写入命令
	BPSI_DataSendReceive( 0 );
	BPSI_DataSendReceive( Address / 256 );			// 2位高位地址
	BPSI_DataSendReceive( Address % 256 );		// 8位低位地址
	for ( i = 0; i < len; i++ )
	{
		BPSI_DataSendReceive( *Data );			// 写入数据
		Data++;
	}
	AT45_Chip_Select_DISABLE;
}

/********************************************************************** 
*
* 名称: 	ReadByteFromBuffer1
* 说明: 	
* 功能: 	从buffer1读出一个字节
* 调用: 	none
* 输入: 	地址,数据
* 返回值: 	none
*
***********************************************************************/
/*
u8 ReadByteFromBuffer1(u16 Address)
{
	u8 Data;
	AT45_Chip_Select_ENABLE;
	BPSI_DataSendReceive(BUFFER1_READ);		// 命令
	BPSI_DataSendReceive(0);
	BPSI_DataSendReceive(Address/256);			// 2位高位地址
	BPSI_DataSendReceive(Address%256);		// 8位低位地址
	BPSI_DataSendReceive(0);
	Data = BPSI_DataSendReceive(0xff);				// 读出数据
	AT45_Chip_Select_DISABLE;
	return (Data);
}
*/
/********************************************************************** 
*
* 名称: 	ErasePage
* 说明: 	
* 功能: 	擦除一页
* 调用: 	none
* 输入: 	地址,数据
* 返回值: 	none
*
***********************************************************************/

void ErasePage(u16 PageNum)
{
	AT45_Chip_Select_ENABLE;
	PageNum <<= PAGE_RL;
	BPSI_DataSendReceive(PAGE_ERASE);				// 命令
	BPSI_DataSendReceive(PageNum/256);			// 高7位地址
	BPSI_DataSendReceive(PageNum%256);			// 低6位地址
	BPSI_DataSendReceive(0);
	AT45_Chip_Select_DISABLE;
}

/********************************************************************** 
*
* 名称: 	ReadByteFromMainMemory
* 说明: 	
* 功能: 	从主存区读取一个字节
* 调用: 	none
* 输入: 	页地址,页内地址
* 返回值: 	读出的数据
*
***********************************************************************/
#if 0
#ifdef VER_10003
u8 ReadByteFromMainMemory( u16 PageNum, u16 SubAddress )
{
	u8 Data;
	PageNum <<= PAGE_RL;
	AT45_Chip_Select_ENABLE;
	BPSI_DataSendReceive( MAIN_MEMORY_PAGE_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 );
	Data = BPSI_DataSendReceive(0xff);							// 读出数据
	AT45_Chip_Select_DISABLE;
	return ( Data );
}
#endif
#endif
/********************************************************************** 
*
* 名称: 	ReadMultiByteFromMainMemory
* 说明: 	
* 功能: 	从主存区读取多个字节
* 调用: 	none
* 输入: 	页地址,页内地址,数据存放缓冲区指针,读出长度
* 返回值: 	
*
***********************************************************************/
u8 ReadMultiByteFromMainMemory( u16 PageNum, u16 SubAddress, u8 *msg, u8 len )
{
	u8 i;
	i = 255;
	if ( len == 0 )
	{
		return FALSE;
	}
	while ( IS_DATA_FLASH_BUSY() && i-- )
	{
		;
	}
	if ( i == 0 )
	{
		return FALSE;
	}

⌨️ 快捷键说明

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