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

📄 at45db161.c

📁 at45db161b SPI 接口FLASH ROM驱动,已经在ADS下调试通过
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                  
**                        
**
**                       **
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: at45db161.c
**创   建   人: winfeng
**最后修改日期: 2005年7月4日
**描     述: 存储器驱动程序
**         
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: winfeng
** 版 本: v1.0
** 日 期: 2005年7月4日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/


#define IN_AT45DB161
#define SPICE0 0x00400000
#include "config.h"
//static OS_EVENT *SPIMutex;
/*********************************************************************************************************
** Function name:         InitialiseSPI
**
** Descriptions:         Initialize the SPI
**
** input parameters:     速率分频值
** Returned value:         1 OK 0 NOT OK
**       
** Used global variables:   None
** Calling modules:         None
**
** Created by:           winfeng
** Created Date:         2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
    uint8 InitialiseSPI(uint8 Fdiv)
{
  //uint8 err;
 IO3DIR |= SPICE0;                  //P3.22设为输出,p3.22连接AT45DB161的/CS;
 // IO1DIR|= SPICE1;
   
 IO3SET |= SPICE0;                 //P3.22设为高
  //IO1SET|= SPICE1;
  
  //PINSEL0 =(PINSEL0 &0xFFFFC0FF) | 0x1500;
  
  S0PCCR = Fdiv & 0xfe;             /* 分频值 */
  S0PCR = 0x38;                   /* 主机、不允许中断 */
                                /* 高位在前、SCK高有效 */
                                /* 数据在SCK的第二个时钟沿采样 */
 // SPIMutex = OSMutexCreate(2,&err);             /* 用于互斥访问SPI总线,用于操作系统 */
  
  return(1);
}     

/*********************************************************************************************************
** Function name:         spi_write
**
** Descriptions:         spi写一个字节
**
** input parameters:     欲写的数据
** Returned value:         1 OK 0 NOT OK
**       
** Used global variables:   None
** Calling modules:         None
**
** Created by:           winfeng
** Created Date:         2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
    static void spi_write(uint8 dat)
{
  S0PDR =dat;
  while(!(S0PSR &0x80));
}
/*********************************************************************************************************
** Function name:         spi_write
**
** Descriptions:         spi读一个字节
**
** input parameters:     none
** Returned value:         读取的数据
**       
** Used global variables:   None
** Calling modules:         None
**
** Created by:           winfeng
** Created Date:         2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
    
    static uint8 spi_read(void)
{
  S0PDR =0;
  while(!(S0PSR &0x80));
  return(S0PDR);
}
/*********************************************************************************************************
** Function name:         status_read
**
** Descriptions:         status read AT45DB161
**
** input parameters:     none
** Returned value:         状态字
**       
** Used global variables:   None
** Calling modules:         None
**
** Created by:           winfeng
** Created Date:         2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
    uint8 status_read(void)//
{
  uint8 i = 0;
  IO3CLR |= SPICE0;
  spi_write(0x57);   
  i=spi_read();
  IO3SET |= SPICE0;
  return(i);
}
/*********************************************************************************************************
** Function name:         array_read
**
** Descriptions:         array read of AT45DB161
**
** input parameters:     uint16 page :页编号 uint16 paddr:页地址
                  uint16 number:读数据个数 uint8 *dp:目的数据指针
** Returned value:         0 失败 1 成功
**       
** Used global variables:   None
** Calling modules:         None
**
** Created by:           winfeng
** Created Date:         2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
  static uint8 array_read(uint16 page,uint16 paddr,uint16 number,uint8 *dp)//
{
  uint8 i;
 // uint32 read_cnt=0;
  while(1)
  {
    i=status_read();
    if(i&0x80) break;
   // if(++read_cnt > read_cnt) return(FALSE);
        
  }
  IO3CLR |= SPICE0;
  spi_write(0xE8);
  spi_write(page>>6);
  i=page<<2;
  i+=paddr>>8;
  spi_write(i);
  spi_write(paddr);
  for(i=0;i<4;i++)
  {
    spi_read();
  }
  for(;number!=0;number--)
  {
    *dp=spi_read();
    dp++;
  }
  IO3SET |= SPICE0;
  return (TRUE);
}
/*********************************************************************************************************
** Function name:         page_read
**
** Descriptions:         page read of AT45DB161
**
** input parameters:     uint16 page :页编号 uint16 paddr:页地址
                  uint16 number:读数据个数 uint8 *dp:目的数据指针
** Returned value:         0 失败 1 成功
**       
** Used global variables:   None
** Calling modules:         None
**
** Created by:           winfeng
** Created Date:         2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
    uint8 page_read(uint16 page,uint16 paddr,uint16 number,uint8 *dp)//
{
  uint8 i,err;
//  uint32 read_cnt=0;
 // OSMutexPend(SPIMutex,0,&err);
  while(1)
  {
    i=status_read();
    if(i&0x80) break;
  //  if(++read_cnt > read_cnt){
     // OSMutexPost(SPIMutex); 
    //  return(FALSE);
   //   }   
  }
  IO3CLR |= SPICE0;
  spi_write(0xD2);
  spi_write(page>>6);
  i=page<<2;
  i+=paddr>>8;
  spi_write(i);
  spi_write(paddr);
  for(i=0;i<4;i++)
  {
    spi_read();
  }   
  for(;number!=0;number--)
  {
    *dp=spi_read();
    dp++;
  }
  IO3SET |= SPICE0;
  //OSMutexPost(SPIMutex); 
  return (TRUE);   
}
/*********************************************************************************************************
** Function name:         page_to_buf
**
** Descriptions:         page to buf of AT45DB161 flash
**
** input parameters:     uint16 page :页编号 uint8 buf:buf号
** Returned value:         0 失败 1 成功
**       
** Used global variables:   None
** Calling modules:         None
**
** Created by:           winfeng
** Created Date:         2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
  static uint8 page_to_buf(uint16 page,uint8 buf)//
{
  uint8 i;
//  uint32 read_cnt=0;
  while(1)
  {
    i=status_read();
    if(i&0x80) break;
  //  if(++read_cnt > read_cnt) return(FALSE);
        
  }
  IO3CLR |= SPICE0;
  if(buf) spi_write(0x55);
  else   spi_write(0x53);
  spi_write(page>>6);
  i=page<<2;
  spi_write(i);
  spi_write(0);
  IO3SET |= SPICE0;
  return (TRUE);   
}
/*********************************************************************************************************
** Function name:         page_and_buf_cmp
**
** Descriptions:         page and buf compare
**
** input parameters:     uint16 page :页编号 uint8 buf:buf号
** Returned value:         0 失败 1 相同 0xff 不相同
**       
** Used global variables:   None
** Calling modules:         None
**
** Created by:           winfeng
** Created Date:         2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
  static uint8 page_and_buf_cmp(uint16 page,uint8 buf)//
{
  uint8 i;
 // uint32 read_cnt=0;
  while(1)
  {
    i=status_read();
    if(i&0x80) break;
   // if(++read_cnt > read_cnt) return(FALSE);
        
  }
  IO3CLR |= SPICE0;
  if(buf) spi_write(0x61);
  else   spi_write(0x60);
  spi_write(page>>6);
  i=page<<2;
  spi_write(i);
  spi_write(0);
  IO3SET |= SPICE0;
//  read_cnt = 0;
  while(1)
  {
    i=status_read();
    if(i&0x40) return(1);
    else     return(0xff);
  //  if(++read_cnt > read_cnt) return(FALSE);
        
  }
  return (TRUE);
}
/*********************************************************************************************************
** Function name:         buf_write_page_with_e
**
** Descriptions:         from buf write to page with earse
**
** input parameters:     uint16 page :页编号 uint8 buf:buf号
** Returned value:         0 失败 1 成功
**       
** Used global variables:   None
** Calling modules:         None
**
** Created by:           winfeng
** Created Date:         2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
  static uint8 buf_write_page_with_e(uint16 page,uint8 buf)//
{
  uint8 i;
 // uint32 read_cnt=0;
  while(1)
  {
    i=status_read();
    if(i&0x80) break;
  //  if(++read_cnt > read_cnt) return(FALSE);
        
  }
  IO3CLR |= SPICE0;
  if(buf) spi_write(0x86);
  else   spi_write(0x83);
  spi_write(page>>6);
  i=page<<2;
  spi_write(i);
  spi_write(0);
  IO3SET |= SPICE0;
  return(TRUE);                               
}
/*********************************************************************************************************
** Function name:         buf_write_page
**
** Descriptions:         WRITE PAGE FROM BUF WITHOUT EARSE
**
** input parameters:     uint16 page :页编号 uint8 buf:buf号
** Returned value:         0 失败 1 成功
**       
** Used global variables:   None
** Calling modules:         None
**
** Created by:           winfeng
** Created Date:         2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
  static uint8 buf_write_page(uint16 page,uint8 buf)
{
  uint8 i;
 // uint32 read_cnt=0;
  while(1)
  {
    i=status_read();
    if(i&0x80) break;
  //  if(++read_cnt > read_cnt) return(FALSE);
        
  }
  IO3CLR |= SPICE0;
  if(buf) spi_write(0x89);
  else   spi_write(0x88);
  spi_write(page>>6);
  i=page<<2;
  spi_write(i);
  spi_write(0);
  IO3SET |= SPICE0;
  return(TRUE);
}
/*********************************************************************************************************
** Function name:         write_page
**
** Descriptions:         page PROGRAM THROUGH BUF
**
** input parameters:     uint16 page :页编号 uint16 paddr:页地址 
                  uint8 buf   :buf号 uint16 number:写数据个数
                  uint8 *sp   :源数据指针
** Returned value:         0 失败 1 成功

⌨️ 快捷键说明

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