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

📄 at45db161d.c

📁 AT45DB161的驱动程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               上海三浪电子科技有限公司
**
**                                 http://www.san-lang.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: at45db041.c
**创   建   人: 杨春华
**最后修改日期: 2008年6月11日
**描        述: μCOS-II下at45db041应用程序头文件
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 杨春华
** 版  本: v1.0
** 日 期: 2008年6月11日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define AT45DB161D_GLOBAL
#include "main.h"



/*
学问之美,在于使人一头雾水;
诗歌之美,在于煽动男女出轨;
女人之美,在于傻得无怨无悔;
男人之美,在于谎话说得白天见鬼 !
*/
/*
****************************************************************************************************
* 描述: SPI口初始化(GPIO配置、控制参数)。
* 函数原型:  void SPI_Init(void)
* 入口参数:
* 出口参数:
* 附加信息: 工作模式=主,移位方向=MSB在先,CPOL=1,CPHA=0;
****************************************************************************************************
*/
void SPIInit(void)
{ 
     PCONP |=0x01<<8;
     IO0DIR   |=  0x00000001<<16;   //SPI_CS 
     AT45DB161D_Disable();	       
     S0SPCCR = 0x08;    	      // 设置SPI时钟分频
     S0SPCR  = 0x30;	          // 设置SPI接口模式,MSTR=1,CPOL=1,CPHA=0,LSBF=0
}

/*
****************************************************************************************************
* 描述: 读取AT45DB161D状态寄存器
* 函数原型:  uint8 AT45DB161D_ReadRegister(void)
* 入口参数:
* 出口参数:  返回状态寄存器的值
* 附加信息: 
****************************************************************************************************
*/
uint8 AT45DB161D_ReadRegister(void)
{

     AT45DB161D_Enable();		        // 片选
     S0SPDR = 0x57;     
     while (0 == (S0SPSR&0x80));		// 等待SPIF置位,即等待数据发送完毕
     S0SPDR = 0xff;
     while (0 == (S0SPSR&0x80));
     AT45DB161D_Disable();
     return S0SPDR;
}

/*
****************************************************************************************************
* 描述: AT45DB161D主存储页转存到缓冲
* 函数原型:  void AT45DB161D_MMPTB(uint16 PageNum)
* 入口参数:  PgaeNum ---- 页地址
* 出口参数:
* 附加信息: 
****************************************************************************************************
*/
void AT45DB161D_MMPTB(uint16 PageNum)
{
     AT45DB161D_Enable();		                 // 片选
     S0SPDR = 0x53;                           
     while (0 == (S0SPSR&0x80));	           	 // 等待SPIF置位,即等待数据发送完毕
     S0SPDR = (uint8)(PageNum>>8);    
     while (0 == (S0SPSR&0x80));
     S0SPDR = (uint8)PageNum;        
     while (0 == (S0SPSR&0x80));
     S0SPDR = 0x00;
     while (0 == (S0SPSR&0x80));
     AT45DB161D_Disable();
     
     while(!(AT45DB161D_ReadRegister()&0x80));  //器件忙等待(主内存至缓存转存)
}
/*
****************************************************************************************************
* 描述: AT45DB161D页写
* 函数原型:  uint8 AT45DB161D_WritePage(uint16 PageNum,uint8 *ptr)
* 入口参数:  PgaeNum ---- 页地址
*            *ptr    ---- 存储的数据指针
* 出口参数:
* 附加信息: AT45DB041页写(256Byte)采用主内存页编程方式,利用0x82缓存1(0x85缓存2)进行操作。
****************************************************************************************************
*/
void AT45DB161D_WritePage(uint16 PageNum,uint8 *ptr)
{
     uint16 i;
     
     PageNum = (PageNum&0x07ff) << 1;
      
     while(!(AT45DB161D_ReadRegister()&0x80));   //器件忙等待
     
     AT45DB161D_Enable();		                 // 片选
     //WaitTimer(0);
     S0SPDR = 0x82;     
     while (0 == (S0SPSR&0x80));	           	 // 等待SPIF置位,即等待数据发送完毕
     S0SPDR = (uint8)(PageNum>>8);    
     while (0 == (S0SPSR&0x80));
     S0SPDR = (uint8)PageNum;        
     while (0 == (S0SPSR&0x80));
     S0SPDR = 0x00;
     while (0 == (S0SPSR&0x80));
     for (i=0;i<256;i++){                        //数据传送  
         S0SPDR = *ptr++;
         while (0 == (S0SPSR&0x80));
     }
     AT45DB161D_Disable();
}
/*
****************************************************************************************************
* 描述: AT45DB161D随机写
* 函数原型: void AT45DB161D_WriteRandom(uint16 PageNum,uint16 PageAdd,uint8 len,uint8 *ptr) 
* 入口参数: PgaeNum ---- 页地址
*           PageAdd ---- 页内地址 
*           len     ---- 数据长度
*           *ptr    ---- 存储的数据指针 
* 出口参数:
* 附加信息: 
****************************************************************************************************
*/
void AT45DB161D_WriteRandom(uint16 PageNum,uint8 PageAdd,uint8 len,uint8 *ptr)
{
     PageNum = (PageNum&0x07ff) << 1;
     
     while(!(AT45DB161D_ReadRegister()&0x80));   //器件忙等待
     
     /*主内存至缓存转存*/
     AT45DB161D_MMPTB(PageNum);
     /*主内存页编程*/
     AT45DB161D_Enable();		                 // 片选
     S0SPDR = 0x82;     
     while (0 == (S0SPSR&0x80));	           	 // 等待SPIF置位,即等待数据发送完毕
     S0SPDR = (uint8)(PageNum>>8);    
     while (0 == (S0SPSR&0x80));
     S0SPDR = (uint8)PageNum;        
     while (0 == (S0SPSR&0x80));
     S0SPDR = PageAdd;
     while (0 == (S0SPSR&0x80));
     while (len--){                       //数据传送  
         S0SPDR = *ptr++;
         while (0 == (S0SPSR&0x80));
     }
     AT45DB161D_Disable();
}
/*
****************************************************************************************************
* 描述: AT45DB161D读操作
* 函数原型:  void AT45DB161D_ReadData(uint16 PageNum,uint8 PageAdd,uint16 len,uint8 *ptr)
* 入口参数: PgaeNum ---- 页地址
*           PageAdd ---- 页内地址 
*           len     ---- 数据长度
*           *ptr    ---- 存储的数据指针 
* 出口参数:
* 附加信息: 采用主内存页读取
****************************************************************************************************
*/
void AT45DB161D_ReadData(uint16 PageNum,uint8 PageAdd,uint16 len,uint8 *ptr)
{
     PageNum = (PageNum&0x07ff) << 1;
     
     while(!(AT45DB161D_ReadRegister()&0x80));   //器件忙等待
     
     AT45DB161D_Enable();		                 // 片选
     S0SPDR = 0x52;     
     while (0 == (S0SPSR&0x80));	           	 // 等待SPIF置位,即等待数据发送完毕
     S0SPDR = (uint8)(PageNum>>8);    
     while (0 == (S0SPSR&0x80));
     S0SPDR = (uint8)PageNum;        
     while (0 == (S0SPSR&0x80));
     S0SPDR = PageAdd;
     while (0 == (S0SPSR&0x80));
     S0SPDR = 0x00;
     while (0 == (S0SPSR&0x80));
     S0SPDR = 0x00;
     while (0 == (S0SPSR&0x80));
     S0SPDR = 0x00;
     while (0 == (S0SPSR&0x80));
     S0SPDR = 0x00;
     while (0 == (S0SPSR&0x80));
     while (len--){
           S0SPDR = 0xff;
           while (0 == (S0SPSR&0x80));                       //数据读取
           *ptr++ = S0SPDR ;
     }
     AT45DB161D_Disable();
}     
/*
****************************************************************************************************
* 描述: 
* 函数原型:  
* 入口参数:
* 出口参数:
* 附加信息: 
****************************************************************************************************
*/
/*
****************************************************************************************************
* 描述: 
* 函数原型:  
* 入口参数:
* 出口参数:
* 附加信息: 
****************************************************************************************************
*/

/*
****************************************************************************************************
* 描述: AT45DB161D随机写
* 函数原型: INT16U AT45DB161D_PageWrite(INT16U add, INT8U *ptr, INT16U len) 
* 入口参数: 
* 出口参数:	返回写出的数据长度
* 附加信息: 
****************************************************************************************************
*/
uint16 AT45DB161D_PageWrite(uint32 add, uint8 *ptr, uint16 len)
{
     INT16U  PageNum,PageAdd,wdlen,i;

	 PageNum = ((add/AT45DB161DPageSize)&0x0fff) << 2;
	 PageAdd =  add%AT45DB161DPageSize;
	 
	 wdlen   = AT45DB161DPageSize - PageAdd;
	 if (wdlen > len){
	    wdlen = len;
	 }     

     while(!(AT45DB161D_ReadRegister()&0x80));   //器件忙等待
     
     /*主内存至缓存转存*/
     if (PageAdd){
	     AT45DB161D_MMPTB(PageNum);
	 }
     /*主内存页编程*/
     AT45DB161D_Enable();		                 // 片选
     S0SPDR = 0x82;     
     while ((S0SPSR&0x80) == 0);	           	 // 等待SPIF置位,即等待数据发送完毕
     S0SPDR = (INT8U)(PageNum>>8);    
     while ((S0SPSR&0x80) == 0);
     S0SPDR = ((INT8U)(PageNum)) +((uint8 )(PageAdd>>8));        
     while ((S0SPSR&0x80) == 0);
     S0SPDR = (INT8U)PageAdd;
     while ((S0SPSR&0x80) == 0);
     for (i=0; i<wdlen; i++){                    //数据传送  
	     S0SPDR = *ptr++;
         while ((S0SPSR&0x80) == 0);
     }
     AT45DB161D_Disable();

/*
	DF_SELECT_1;
	write_SPI(MM_PAGE_TO_B1_XFER);
	write_SPI((unsigned char)(page >> 6));
    write_SPI((unsigned char)(page << 2));
    write_SPI(0x00);
	DF_DESELECT_1;
	
	DF_wait_busy();
	DF_SELECT_1;
	write_SPI(BUFFER_1_READ); 
	write_SPI(0x00);                        
	write_SPI(0x00);   
	write_SPI(0x00);        
	write_SPI(0x00);
	for (i=0;i<528;i++)
	{
		write_SPI(0xFF);
		DF_buffer[i] = SPDR;
	}
*/
	 return wdlen;
}
/*
****************************************************************************************************
* 描述: AT45DB161D读操作
* 函数原型:  INT16U AT45DB161D_PageRead(INT16U add, INT8U *ptr, INT16U len)
* 入口参数:
* 出口参数:	 返回读出的数据长度
* 附加信息:  采用主内存页读取
****************************************************************************************************
*/
uint16 AT45DB161D_PageRead(uint32 add, uint8 *ptr, uint16 len)
{
     INT16U  PageNum,PageAdd,wdlen,i;

	 PageNum = ((add/AT45DB161DPageSize)&0x0fff) << 2;
	 PageAdd =  add%AT45DB161DPageSize;
	 
	 wdlen   = AT45DB161DPageSize - PageAdd;
	 if (wdlen > len){
	    wdlen = len;
	 }     

     while(!(AT45DB161D_ReadRegister()&0x80));   //器件忙等待
     
     AT45DB161D_Enable();		                 // 片选
     S0SPDR = 0x52;     
     while ((S0SPSR&0x80) == 0);	           	 // 等待SPIF置位,即等待数据发送完毕
     S0SPDR = (INT8U)(PageNum>>8);    
     while ((S0SPSR&0x80) == 0);
     S0SPDR = ((INT8U)(PageNum)) +((uint8 )(PageAdd>>8));       
     while ((S0SPSR&0x80) == 0);
     S0SPDR = PageAdd;
     while ((S0SPSR&0x80) == 0);
     S0SPDR = 0x00;
     while ((S0SPSR&0x80) == 0);
     S0SPDR = 0x00;
     while ((S0SPSR&0x80) == 0);
     S0SPDR = 0x00;
     while ((S0SPSR&0x80) == 0);
     S0SPDR = 0x00;
     while ((S0SPSR&0x80) == 0);
     for (i=0;i<wdlen;i++){
           S0SPDR = 0xff;
           while ((S0SPSR&0x80) == 0);                       //数据读取
           *ptr++ = S0SPDR ;
     }
     AT45DB161D_Disable();

	 return wdlen;
}     
/*
****************************************************************************************************
* 描述:  AT45DB161D写
* 函数原型:  void AT45DB161D_Write(INT32U add, INT8U *ptr, INT16U len)
* 入口参数:
* 出口参数:
* 附加信息: 
****************************************************************************************************
*/
void AT45DB161D_Write(uint32 add, uint8 *ptr, uint16 len)
{
	 INT16U wdlen;

	 while (len){
           wdlen = AT45DB161D_PageWrite(add,ptr,len);
		   add  += wdlen;
		   ptr  += wdlen;
		   len  -= wdlen;   
	 }
}
/*
****************************************************************************************************
* 描述: 
* 函数原型: void AT45DB161D_Read(INT32U add, INT8U *ptr, INT16U len) 
* 入口参数:
* 出口参数:
* 附加信息: 
****************************************************************************************************
*/
void AT45DB161D_Read(uint32 add, uint8 *ptr, uint16 len)
{
	 INT16U wdlen;

	 while (len){
           wdlen = AT45DB161D_PageRead(add,ptr,len);
		   add  += wdlen;
		   ptr  += wdlen;
		   len  -= wdlen;   
	 }
}


⌨️ 快捷键说明

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