?? at45db161.c
字號:
/****************************************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 + -