?? sst25vf016bdrv.c
字號:
/****************************************Copyright (c)*****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info----------------------------------------------------------------------------------
** File name: SST25VF016BDrv.c
** Latest modified Date: 2008.02.18
** Latest Version: V1.1
** Descriptions: SPI下的SST25VF016B操作函數庫
**
**---------------------------------------------------------------------------------------------------------
** Created by: Litiantian
** Created date: 2007.04.16
** Version: V1.0
** Descriptions: The original version
**
**---------------------------------------------------------------------------------------------------------
** Modified by: zhangzheng
** Modified date: 2008.02.18
** Version: V1.1
** Descriptions: 本版本進行了以下修改:
(1) 提高寫效率
(2) 修改扇區擦除操作的BUG。
**********************************************************************************************************/
#include "config.h"
#include "SST25VF016BDrv.h"
#define __F016B_CE_Low() (IO0CLR |= __F016B_CS)
#define __F016B_CE_High() (IO0SET |= __F016B_CS)
/**********************************************************************************************************
** Function name: sstf016bInit
** Descriptions: 初始化SPI
** input parameters: None
** output parameters: None
** Returned value: None
** Created by: Litiantian
** Created Date: 2007.04.16
**---------------------------------------------------------------------------------------------------------
** Modified by: zhangzheng
** Modified date: 2008.02.18
**---------------------------------------------------------------------------------------------------------
**********************************************************************************************************/
void sstf016bInit (void)
{
PINSEL1 &= 0xfffffffc;
IO0DIR |= __F016B_CS;
PINSEL0 |= 0xc0000000; /* 設置P0.15腳為SCK腳 */
PINSEL1 |= ((0x03 << 2) | (0x03 << 4)); /* 設置P0.17、P0.18腳為SPI引腳 */
S0SPCCR = 0x10; /* 設置SPI時鐘分頻,可按需求配置 */
S0SPCR = (0 << 2) /* 每次傳輸發送和接收8位數據 */
| (0 << 3) /* CPHA = 0, 數據在SCK 的第一個 */
/* 時鐘沿采樣 */
| (0 << 4) /* CPOL = 0, SCK 為低有效 */
| (1 << 5) /* MSTR = 1, SPI 處于主模式 */
| (0 << 6) /* LSBF = 0, 數據MSB(位7)在先 */
| (0 << 7); /* SPIE = 0, SPI 中斷被禁止 */
}
/**********************************************************************************************************
** Function name: __f016bSendByte
** Descriptions: 通過硬件SPI發送一個字節到SST25VF016B
** input parameters: data: 發送的一個字節數據
** output parameters: None
** Returned value: F016BERROR: 錯誤; F016BOK: 成功
** Created by: Litiantian
** Created Date: 2007.04.16
**---------------------------------------------------------------------------------------------------------
** Modified by: zhangzheng
** Modified date: 2008.02.18
**---------------------------------------------------------------------------------------------------------
**********************************************************************************************************/
static uint8 __f016bSendByte (uint8 data)
{
int32 n = 65535;
S0SPDR = data;
while (0 == (S0SPSR & 0x80)) { /* 等待SPIF置位,等待數據發送完 */
n--;
if (n == 0) {
break;
}
}
if (n > 0) {
return F016BOK;
} else {
return F016BERROR;
}
}
/**********************************************************************************************************
** Function name: __f016bGetByte
** Descriptions: 通過硬件SPI接口接收一個字節數據到處理器
** input parameters: None
** output parameters: pdata: 接收一個字節數據的指針
** Returned value: F016BERROR: 錯誤; F016BOK: 成功
** Created by: Litiantian
** Created Date: 2007.04.16
**---------------------------------------------------------------------------------------------------------
** Modified by: zhangzheng
** Modified date: 2008.02.18
**---------------------------------------------------------------------------------------------------------
**********************************************************************************************************/
static uint8 __f016bGetByte (uint8 *pdata)
{
int32 n = 65535;
S0SPDR = 0xff; /* 發送該數據用以產生時鐘,數據 */
/* 本身沒有用處 */
while (0 == (S0SPSR & 0x80)) { /* 等待SPIF置位,等待數據發送完 */
n--;
if (n == 0) {
break;
}
}
if (n > 0) {
*pdata = (uint8)S0SPDR; /* 返回接收到的數據 */
return F016BOK;
} else {
return F016BERROR;
}
}
/**********************************************************************************************************
** Function name: sstf016bRd
** Descriptions: SST25VF016B的讀函數
** input parameters: Dst: 目標地址,范圍 0x0 - MAX_ADDR(MAX_ADDR = 0x1FFFFF)
** NByte: 要讀取的數據字節數
** output parameters: RcvBufPt:接收緩存的指針
** Returned value: F016BERROR: 錯誤; F016BOK: 成功
** Created by: Litiantian
** Created Date: 2007.04.16
**---------------------------------------------------------------------------------------------------------
** Modified by: zhangzheng
** Modified date: 2008.02.18
**---------------------------------------------------------------------------------------------------------
**********************************************************************************************************/
uint8 sstf016bRd (uint32 Dst,
uint32 NByte,
uint8 *RcvBufPt)
{
uint32 i = 0;
if (((Dst + NByte -1) > __F016B_MAX_ADDR) || (NByte == 0)) { /* 檢查入口參數 */
return (F016BERROR);
}
__F016B_CE_Low();
__f016bSendByte(0x0B); /* 發送讀命令 */
__f016bSendByte((uint8)((Dst & 0xFFFFFF) >> 16)); /* 發送地址信息:3個字節組成 */
__f016bSendByte((uint8)((Dst & 0xFFFF) >> 8));
__f016bSendByte((uint8)(Dst & 0xFF));
__f016bSendByte(0xFF); /* 發送一個啞字節以讀取數據 */
for (i = 0; i < NByte; i++) {
if (F016BERROR == __f016bGetByte((uint8*)(RcvBufPt + i))) {
return F016BERROR;
}
}
__F016B_CE_High();
return (F016BOK);
}
/**********************************************************************************************************
** Function name: sstf016bRdID
** Descriptions: SST25VF016B的讀ID函數,可選擇讀ID
** input parameters: IDType: ID類型,用戶可在Jedec_ID,Dev_ID,Manu_ID三者里選擇
** output parameters: RcvbufPt: 存儲ID變量的指針
** Returned value: F016BERROR: 錯誤; F016BOK: 成功
** Created by: Litiantian
** Created Date: 2007.04.16
**---------------------------------------------------------------------------------------------------------
** Modified by: zhangzheng
** Modified date: 2008.02.18
**---------------------------------------------------------------------------------------------------------
**********************************************************************************************************/
uint8 sstf016bRdID (F016bIdType IDType, uint32 *RcvbufPt)
{
uint8 temp[4] = {0};
if (IDType == Jedec_ID) {
__F016B_CE_Low();
__f016bSendByte(0x9F); /* 發送讀JEDEC ID命令(9Fh) */
__f016bGetByte(temp + 2); /* 接收數據 */
__f016bGetByte(temp + 1);
__f016bGetByte(temp); /* 在本例中,temp值應為0xBF2541 */
__F016B_CE_High();
*RcvbufPt = (uint32)(temp[0]
| (temp[1] << 8)
| (temp[2] << 16));
return (F016BOK);
}
if ((IDType == Manu_ID) || (IDType == Dev_ID)) {
__F016B_CE_Low();
__f016bSendByte(0x90); /* 發送讀ID命令 (90h or ABh) */
__f016bSendByte(0x00); /* 發送地址 */
__f016bSendByte(0x00); /* 發送地址 */
__f016bSendByte((uint8)IDType); /* 發送地址 - 不是00H就是01H */
__f016bGetByte(temp); /* 接收獲取的數據字節 */
__F016B_CE_High();
*RcvbufPt = (uint32)(*temp);
return (F016BOK);
} else {
return (F016BERROR);
}
}
/**********************************************************************************************************
** Function name: sstf016bIsExist
** Descriptions: 檢測SPINorFlash是否存在
** input parameters: None
** output parameters: None
** Returned value: F016BERROR: 不存在; F016BOK: 存在
** Created by: zhangzheng
** Created Date: 2008.02.18
**---------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**---------------------------------------------------------------------------------------------------------
**********************************************************************************************************/
uint8 sstf016bIsExist (void)
{
uint32 FId = 0;
if (F016BOK == sstf016bRdID(Jedec_ID, &FId)) {
if (0xBF2500 == (FId & 0x00ffff00)) {
return F016BOK;
} else {
return F016BERROR;
}
} else {
return F016BERROR;
}
}
/**********************************************************************************************************
** Function name: __WaitWrEnd
** Descriptions: 等待SST25VF016B的寫操作完成
** input parameters: None
** output parameters: None
** Returned value: F016BERROR: 錯誤; F016BOK: 成功
** Created by: zhangzheng
** Created Date: 2008.02.18
**---------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**---------------------------------------------------------------------------------------------------------
**********************************************************************************************************/
static uint8 __WaitWrEnd (void)
{
uint8 StatRgVal = 0;
int32 n = 0x3ffff;
do {
__F016B_CE_Low();
__f016bSendByte(0x05); /* 發送讀狀態寄存器命令 */
__f016bGetByte(&StatRgVal); /* 保存讀得的狀態寄存器值 */
__F016B_CE_High();
n--;
if (n == 0) {
break;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -