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

📄 at45db161.c

📁 at45db161b SPI 接口FLASH ROM驱动,已经在ADS下调试通过
💻 C
📖 第 1 页 / 共 2 页
字号:
**       
** Used global variables:   None
** Calling modules:         None
**
** Created by:           winfeng
** Created Date:         2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static uint8 write_page(uint16 page,uint16 paddr,uint8 buf,uint16 number,uint8 *sp)//
{
  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(0x85);
  else   spi_write(0x82);
  spi_write(page>>6);
  i=page<<2;
  i+=paddr>>8;
  spi_write(i);
  spi_write(paddr);
  for(;number!=0;number--)
  {
    spi_write(*sp);
    sp++;
  }
  IO3SET |= SPICE0;
  return(TRUE);
}
/*********************************************************************************************************
** Function name:         page_erase
**
** Descriptions:         页擦除
**
** input parameters:     uint16 page :页编号 
** Returned value:         0 失败 1 成功
**       
** Used global variables:   None
** Calling modules:         None
**
** Created by:           winfeng
** Created Date:         2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
  uint8 flash_page_erase(uint16 page)//
{
  uint8 i;
//  uint32 read_cnt=0;
 // uint8 err;
 // 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(0x81);
  spi_write(page>>6);
  i=page<<2;
  spi_write(i);
  spi_write(0);
  IO3SET |= SPICE0;
 // OSMutexPost(SPIMutex); 
  return(TRUE);
}
/*********************************************************************************************************
** Function name:         block_erase
**
** Descriptions:         块擦除
**
** input parameters:     uint16 block :块编号
** Returned value:         0 失败 1 成功
**       
** Used global variables:   None
** Calling modules:         None
**
** Created by:           winfeng
** Created Date:         2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
    uint8 flash_block_erase(uint16 block)//
{
  uint8 i;
//  uint32 read_cnt=0;
 // OSMutexPend(SPIMutex,0,&i);
  while(1)
  {
    i=status_read();
    if(i&0x80) break;
  //  if(++read_cnt > read_cnt)
  //  {
      //  OSMutexPost(SPIMutex); 
  //      return(FALSE);
 //   }
        
  }
  IO3CLR |= SPICE0;
  spi_write(0x50);
  spi_write(block>>3);
  i=block<<5;
  spi_write(i);
  spi_write(0);
  IO3SET |= SPICE0;
 // OSMutexPost(SPIMutex); 
  return(TRUE);
}
/*********************************************************************************************************
** Function name:         auto_page_rewrite
**
** Descriptions:         auto_page_rewrite
**
** 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 auto_page_rewrite(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(0x59);
  else   spi_write(0x58);
  spi_write(page>>6);
  i=page<<2;
  spi_write(i);
  spi_write(0);
  IO3SET |= SPICE0;
  return(TRUE);
}
/*********************************************************************************************************
** Function name:         buf_read
**
** Descriptions:         buf read
** 
** input parameters:     uint8 buf:buf号 uint16 paddr: buf内部地址
                  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 buf_read(uint8 buf,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;
  if(buf) spi_write(0xD6);
  else   spi_write(0xD4);
  spi_write(0);
  spi_write(paddr>>8);
  
  spi_write(paddr);
  spi_write(0);
  for(;number!=0;number--)
  { 
    *dp=spi_read();
    dp++;
  }
  IO3SET |= SPICE0;
  return(TRUE);
}

/*********************************************************************************************************
** Function name:         buf_write
**
** Descriptions:         buf_write
**
** input parameters:     uint8 buf:buf号 uint16 paddr: buf内部地址
                  uint16 number :数据个数 uint8 *sp:源数据指针
** 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(uint8 buf,uint16 paddr,uint16 number,uint8 *sp)//
{
  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(0x87);
  else   spi_write(0x84);
  spi_write(0);
  spi_write(paddr>>8);
  spi_write(paddr);
  for(;number!=0;number--)
  {
    spi_write(*sp);
    sp++;
  }
  IO3SET |= SPICE0;
  return(TRUE);
}
/*********************************************************************************************************
** Function name:         flash_page_write
**
** Descriptions:         port funtion flash_page_write
**
** input parameters:     page:扇区编号 sp :源数据指针 num:数据个数
                  
** Returned value:         0 失败 1 成功
**       
** Used global variables:   None
** Calling modules:         None
**
** Created by:           winfeng
** Created Date:         2005/08/23
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
    uint8   flash_page_write(uint16 page,uint16 num,uint8 * sp)
{   
  uint8 err;
  if(num == 0 || num > 512) 
  return(0);
  
  //OSMutexPend(SPIMutex,0,&err);
  page_to_buf(page,0);
  err = write_page(page,0,0,num,sp);
  //OSMutexPost(SPIMutex); 
  return(err);
}
  
/*********************************************************************************************************
** Function name:         flash_read
**
** Descriptions:         port funtion flash_read
**
** input parameters:     uint32 addr: flash addr 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:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
  void flash_read(uint32 addr,uint16 number,uint8 *dp)
{
  //uint8 err;
  uint16 i;
  uint16 j;
  if(number == 0) return;
 // OSMutexPend(SPIMutex,0,&err);
  i=addr/512;
  j=addr%512;
  if(j+number>512)
  {
    array_read(i,j,512-j,dp); 
    dp+=(512-j);
    number-=(512-j);
    i++;
    while(1)
    {
        if(number>512)
        {
          array_read(i,0,512,dp);
          dp+=512;
          number-=512;
          i++;
        }
        else
        {
          array_read(i,0,number,dp);
          break;
        }
    
    }
    
  }
  else
  {
    array_read(i,j,number,dp);       
  }
 // OSMutexPost(SPIMutex);
}
/*********************************************************************************************************
** Function name:         flash_write
**
** Descriptions:         port funtion flash_write
**
** input parameters:     uint32 addr: flash addr uint16 number:欲读数据个数
                  uint8 *sp:源数据指针
** Returned value:         0 失败 1 成功
**       
** Used global variables:   None
** Calling modules:         None
**
** Created by:           winfeng
** Created Date:         2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
  void flash_write(uint32 addr,uint16 cnt,uint8 *p)
{
  uint16 i;
  uint16 j;
  //uint8 err;
  if(cnt == 0 ) return;
 // OSMutexPend(SPIMutex,0,&err);   
  i=addr/512;
  j=addr%512;
  
    
  if(j+cnt>512)
  {
    
    
    page_to_buf(i,0);
    write_page(i,j,0,512-j,p);
    p+=(512-j);
    cnt-=(512-j);
    i++;
    for(;;)
    {
        if(cnt>512)
        {
          page_to_buf(i,0);
          write_page(i,0,0,512,p);
          cnt-=512;
          p+=512;
          i++;
            
        }
        else
        {
          page_to_buf(i,0);
          write_page(i,0,0,cnt,p);   
      
          break;

        }
      }
  }
  else
  {
    
    
    page_to_buf(i,0);
    write_page(i,j,0,cnt,p);
        
  }
 // OSMutexPost(SPIMutex);
}

⌨️ 快捷键说明

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