📄 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 + -