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

📄 sst25vf016bdrv.c

📁 SmartARM2300 SPI_读写串行NORFlash
💻 C
📖 第 1 页 / 共 2 页
字号:
        }                
    }
    while (StatRgVal & 0x01);                                           /*  一直等待,直到芯片空闲       */
    
    if (n > 0) {
        return F016BOK;
    } else {
        return F016BERROR;
    }
}

/**********************************************************************************************************
** Function name:       sstf016bWr
** Descriptions:        SST25VF016B的写函数,可写1个和多个数据到指定地址
** input parameters:    Dst: 目标地址,范围 0x0 - MAX_ADDR(MAX_ADDR = 0x1FFFFF)       
**                      SndbufPt: 发送缓存区指针
**                      NByte: 要写的数据字节数
** output parameters:   None
** Returned value:      F016BERROR: 错误; F016BOK: 成功
** Created by:          Litiantian
** Created Date:        2007.04.16
**---------------------------------------------------------------------------------------------------------
** Modified by:         zhangzheng
** Modified date:       2008.02.18
**---------------------------------------------------------------------------------------------------------
**********************************************************************************************************/
uint8 sstf016bWr (uint32 Dst, 
                  uint8 *SndbufPt, 
                  uint32 NByte)
{
    uint8  StatBak = 0;
    
    uint32 i = 0;
    
    
    if (((Dst + NByte - 1) > __F016B_MAX_ADDR) || (NByte == 0)) {       /*  检查入口参数                 */
        return (F016BERROR);                                            
    }
    
    __F016B_CE_Low();      
    __f016bSendByte(0x05);                                              /*  发送读状态寄存器命令         */
    __f016bGetByte(&StatBak);                                           /*  保存读得的状态寄存器值       */
    __F016B_CE_High();
                    
    __F016B_CE_Low();     
    __f016bSendByte(0x06);                                              /*  发送写使能命令               */
    __F016B_CE_High();      

    __F016B_CE_Low();     
    __f016bSendByte(0x50);                                              /*  使状态寄存器可写             */
    __F016B_CE_High();
          
    __F016B_CE_Low();     
    __f016bSendByte(0x01);                                              /*  发送写状态寄存器指令         */
    __f016bSendByte(0);                                                 /*  清0BPx位,使Flash全区可写    */
    __F016B_CE_High();      
  
    if (Dst & 0x00000001) {
        __F016B_CE_Low();     
        __f016bSendByte(0x06);                                          /*_ 发送写使能命令               */
        __F016B_CE_High();  
        
        __F016B_CE_Low();     
        __f016bSendByte(0x02);                                          /*  发送字节数据烧写命令         */
        __f016bSendByte((uint8)(((Dst & 0xFFFFFF) >> 16)));             /*  发送3个字节的地址信息        */
        __f016bSendByte((uint8)(((Dst & 0xFFFF) >> 8)));
        __f016bSendByte((uint8)(Dst & 0xFF));
        __f016bSendByte((uint8)(*SndbufPt++));                          /*  发送被烧写的数据             */
        __F016B_CE_High();      
        __WaitWrEnd();
        NByte--;
        Dst++;
    }
    
    if (NByte > 1) {
        __F016B_CE_Low();     
        __f016bSendByte(0x06);                                          /*  发送写使能命令               */
        __F016B_CE_High();    
  
        __F016B_CE_Low();     
        __f016bSendByte(0xAD);                                          /*  发送字节数据烧写命令         */
        __f016bSendByte((uint8)(((Dst & 0xFFFFFF) >> 16)));             /*  发送3个字节的地址信息        */
        __f016bSendByte((uint8)(((Dst & 0xFFFF) >> 8)));
        __f016bSendByte((uint8)(Dst & 0xFF));
        __f016bSendByte((uint8)(*SndbufPt++));                          /*  发送被烧写的数据             */
        __f016bSendByte((uint8)(*SndbufPt++));                          /*  发送被烧写的数据             */
        __F016B_CE_High();      
        __WaitWrEnd();
        NByte -= 2;
        Dst   += 2;
  
        for(i = 0; i < (NByte / 2); i++) {
            __F016B_CE_Low();     
            __f016bSendByte(0xAD);                                      /*  发送字数据烧写命令           */
            __f016bSendByte((uint8)(*SndbufPt++));                      /*  发送被烧写的数据             */
            __f016bSendByte((uint8)(*SndbufPt++));                      /*  发送被烧写的数据             */
            __F016B_CE_High();      
            __WaitWrEnd();
        }
  
        __F016B_CE_Low();     
        __f016bSendByte(0x04);                                          /*  结束AAI                      */
        __F016B_CE_High();      
        __WaitWrEnd();
    }
    
    if (NByte & 0x00000001) {
        __F016B_CE_Low();     
        __f016bSendByte(0x06);                                          /*  发送写使能命令               */
        __F016B_CE_High(); 
           
        __F016B_CE_Low();     
        __f016bSendByte(0x02);                                          /*  发送字节数据烧写命令         */
        __f016bSendByte((uint8)((((Dst + NByte - 1) 
                                & 0xFFFFFF) >> 16)));  
        __f016bSendByte((uint8)(((Dst + NByte - 1) & 0xFFFF) >> 8));    /*  发送3个字节的地址信息        */
        __f016bSendByte((uint8)((Dst + NByte - 1) & 0xFF));
        __f016bSendByte((uint8)(*SndbufPt));                            /*  发送被烧写的数据             */
        __F016B_CE_High();      
        __WaitWrEnd();
        NByte--;
        Dst++;
    }

    __F016B_CE_Low();     
    __f016bSendByte(0x06);                                              /*  发送写使能命令               */
    __F016B_CE_High();      

    __F016B_CE_Low();     
    __f016bSendByte(0x50);                                              /*  使状态寄存器可写             */
    __F016B_CE_High();
          
    __F016B_CE_Low();     
    __f016bSendByte(0x01);                                              /*  发送写状态寄存器指令         */
    __f016bSendByte(StatBak);                                           /*  恢复状态寄存器设置信息       */
    __F016B_CE_High();

    return (F016BOK);   
}

/**********************************************************************************************************
** Function name:       sstf016bErase
** Descriptions:        根据指定的扇区号选取最高效的算法擦除 
** input parameters:    sec1: 起始扇区号,范围(0~511)
**                      sec2: 终止扇区号,范围(0~511)
** output parameters:   None
** Returned value:      F016BERROR: 错误; F016BOK: 成功
** Created by:          Litiantian
** Created Date:        2007.04.16
**---------------------------------------------------------------------------------------------------------
** Modified by:         zhangzheng
** Modified date:       2008.02.18
**---------------------------------------------------------------------------------------------------------
**********************************************************************************************************/
uint8 sstf016bErase (uint32 sec1, uint32 sec2)
{
    uint8  StatBak     = 0;
    
    uint32 temp        = 0;
    uint32 SecnHdAddr  = 0;          
    uint32 no_SecsToEr = 0;                                             /*  要擦除的扇区数目             */
    uint32 CurSecToEr  = 0;                                             /*  当前要擦除的扇区号           */
    
  
    if ((sec1 > __F016B_SEC_MAX) || (sec2 > __F016B_SEC_MAX)) {
        return (F016BERROR);  
    }
    
    __F016B_CE_Low();      
    __f016bSendByte(0x05);                                              /*  发送读状态寄存器命令         */
    __f016bGetByte(&StatBak);                                           /*  保存读得的状态寄存器值       */
    __F016B_CE_High();                

    __F016B_CE_Low();     
    __f016bSendByte(0x06);                                              /*  发送写使能命令               */
    __F016B_CE_High();      

    __F016B_CE_Low();     
    __f016bSendByte(0x50);                                              /*  使状态寄存器可写             */
    __F016B_CE_High();      
    __F016B_CE_Low();                   
    __f016bSendByte(0x01);                                              /*  发送写状态寄存器指令         */
    __f016bSendByte(0);                                                 /*  清0BPx位,使Flash全区可写    */
    __F016B_CE_High();
  

    if (sec1 > sec2) {                                                  /*  如果用户输入的起始扇区号大于 */
                                                                        /*  终止扇区号,则在内部作出调整 */
        temp = sec1;
        sec1 = sec2;
        sec2 = temp;
    } 
 
    if (sec1 == sec2) {                                                 /*  起止扇区号相等则擦除单个扇区 */
        SecnHdAddr = __F016B_SEC_SIZE * sec1;                           /*  计算扇区的起始地址           */
        __F016B_CE_Low();     
        __f016bSendByte(0x06);                                          /*  发送写使能命令               */
        __F016B_CE_High();      

        __F016B_CE_Low(); 
        __f016bSendByte(0x20);                                          /*  发送扇区擦除指令             */
        __f016bSendByte((uint8)(((SecnHdAddr & 0xFFFFFF) >> 16)));      /*  发送3个字节的地址信息        */
        __f016bSendByte((uint8)(((SecnHdAddr & 0xFFFF) >> 8)));
        __f016bSendByte((uint8)(SecnHdAddr & 0xFF));
        __F016B_CE_High();      
        __WaitWrEnd();
        goto EraseEnd;     
    }
  

  
    if ((sec2 - sec1) == __F016B_SEC_MAX) {                             /*  根据起始扇区和终止扇区间距调 */
                                                                        /*  用最快速的擦除功能           */ 
        __F016B_CE_Low();     
        __f016bSendByte(0x06);                                          /*  发送写使能命令               */
        __F016B_CE_High();      
 
        __F016B_CE_Low();     
        __f016bSendByte(0x60);                                          /*  发送芯片擦除指令(60h or C7h) */
        __F016B_CE_High();      
        __WaitWrEnd();
        goto EraseEnd;
    }
  
    no_SecsToEr = sec2 - sec1 + 1;                                      /*  获取要擦除的扇区数目         */
    CurSecToEr  = sec1;                                                 /*  从起始扇区开始擦除           */
  
    while (no_SecsToEr >= 1) {                                          /*  用扇区擦除算法擦除剩余扇区   */
        SecnHdAddr = __F016B_SEC_SIZE * CurSecToEr;                     /*  计算扇区的起始地址           */
        __F016B_CE_Low();     
        __f016bSendByte(0x06);                                          /*  发送写使能命令               */
        __F016B_CE_High();      

        __F016B_CE_Low(); 
        __f016bSendByte(0x20);                                          /*  发送扇区擦除指令             */
        __f016bSendByte((uint8)(((SecnHdAddr & 0xFFFFFF) >> 16)));      /*  发送3个字节的地址信息        */
        __f016bSendByte((uint8)(((SecnHdAddr & 0xFFFF) >> 8)));
        __f016bSendByte((uint8)(SecnHdAddr & 0xFF));
        __F016B_CE_High();      
        __WaitWrEnd();
        CurSecToEr  += 1;
        no_SecsToEr -= 1;
    }
    
EraseEnd:
    __F016B_CE_Low();                                                   /*  擦除结束,恢复状态寄存器信息  */     
    __f016bSendByte(0x06);                                              /*  发送写使能命令               */
    __F016B_CE_High();      

    __F016B_CE_Low();     
    __f016bSendByte(0x50);                                              /*  使状态寄存器可写             */
    __F016B_CE_High();      
    __F016B_CE_Low();     
    __f016bSendByte(0x01);                                              /*  发送写状态寄存器指令         */
    __f016bSendByte(StatBak);                                           /*  恢复状态寄存器设置信息       */
    __F016B_CE_High();    
    return (F016BOK);
}

/**********************************************************************************************************
  END FILE
**********************************************************************************************************/


⌨️ 快捷键说明

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