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

📄 sst25vf016bdrv.c

📁 SmartARM2300 SPI_读写串行NORFlash
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************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 + -