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

📄 cflash.cpp

📁 SST FALSH的读写(SPI模拟总线)(长期运行)
💻 CPP
字号:
//#define SMISPIMutexPro   11
#define CMDRead25MH 0x03
#define CMDRead50MH 0x0B
#define CMDErase4K  0x20
#define CMDErase32K 0x52
#define CMDErase64K 0xD8
#define CMDEraseAll 0x60
#define CMDByteProgram 0x02
#define CMDWordProgram 0xAD
#define CMDReadStatus  0x05
#define CMDEnWriteStatus 0x50
#define CMDWriteStatus 0x01
#define CMDWriteEnable 0x06
#define CMDWriteDisable 0x04

#include "class.h"
//#include "FlashCommand.h"
//CSMISPI CFlash:: spi(Flash_SO,Flash_SCK,Flash_CE1,Flash_SI);
 CFlash::CFlash(INT8U Flashcs):spi(Flashcs)
{
 
}
void CFlash::Delay8us(void)

{  INT16U i;
   INT8U temp;
   for(i=0;i<500;i++)
    {
     temp=ReadStatus();
     if((temp&0x01)==0x00) break;
    }

}

/*void CFlash::WriteWait(void)
 {
   INT8U temp;
   do
    {
       temp=ReadStatus();
    }
    while(temp&0x01);

 }*/
 void CFlash::WriteStatus(INT8U Data)
 
 { 
    //INT8U  temp;
    WriteEnable();
    spi.SpiOpen();
    spi.SpiSendByte(CMDEnWriteStatus);
    spi.SpiClose();
    Delay8us();
    spi.SpiOpen();
    spi.SpiSendByte(CMDWriteStatus);
    spi.SpiSendByte(Data);
    spi.SpiClose();
    //Delay8us();
 }
 INT8U CFlash::ReadStatus(void)
 {
    INT8U temp;
    spi.SpiOpen();
    spi.SpiSendByte(CMDReadStatus);
    temp=spi.SpiReadByte();
    spi.SpiClose();
    //Delay8us();
    return temp;
 
 }
 
 
 void CFlash::WriteEnable(void)//软件使能 写操作
  {
    //INT8U temp;
    spi.SpiOpen();
    spi.SpiSendByte(CMDWriteEnable);
    spi.SpiClose();
    //Delay8us();
   // Delay8us();
    
  }
  
  void  CFlash::WriteDisable(void)
  
  {
    spi.SpiOpen();
    spi.SpiSendByte(CMDWriteDisable);
    spi.SpiClose();
    //Delay8us();
  }
  
  INT8U CFlash:: ReadByte(INT32U addr)
  {
    INT32U tempaddr;
    INT8U  tempdata;
    INT8U  tempval;
    INT8U err;
     OSSemPend(GSPISem, 0, & err);
    tempaddr=addr;
    
    spi.SpiOpen();
    spi.SpiSendByte(CMDRead25MH);
    tempdata=tempaddr>>16;
    spi.SpiSendByte(tempdata);
    tempdata=tempaddr>>8;
    spi.SpiSendByte(tempdata);
    tempdata=tempaddr;
    spi.SpiSendByte(tempdata);
    tempval=spi.SpiReadByte();
    spi.SpiClose();
     err = OSSemPost(GSPISem);
    return tempval;
    
  }
 void CFlash:: ReadNByte(INT32U addr,INT32U count,INT8U *buf)
 {
   
    INT32U tempaddr;
     INT32U  i;
    INT32U  cnt;
    INT8U  tempdata;
     INT8U err;
     OSSemPend(GSPISem, 0, & err);
          cnt=count;
    tempaddr=addr;
    spi.SpiOpen();
    spi.SpiSendByte(CMDRead25MH);
    tempdata=tempaddr>>16;
    spi.SpiSendByte(tempdata);
    tempdata=tempaddr>>8;
    spi.SpiSendByte(tempdata);
    tempdata=tempaddr;
    spi.SpiSendByte(tempdata);
    for(i=0;i<cnt;i++)
     *(buf+i)=spi.SpiReadByte();
    spi.SpiClose();
     err = OSSemPost(GSPISem);
 } 
void CFlash::WriteByte(INT32U addr,INT8U val)
  {
    INT32U tempaddr;
    INT8U  tempdata;
    INT8U  tempval;
    
     //INT8U err;
    
    //INT8U  temp;
    tempval=val;
    tempaddr=addr;
   
    INT8U tempsta=ReadStatus();
    if(tempsta&&0x1c)
      WriteStatus(0x00);
    WriteEnable();
    spi.SpiOpen();
    spi.SpiSendByte(CMDByteProgram);
    tempdata=tempaddr>>16;
    spi.SpiSendByte(tempdata);
    tempdata=tempaddr>>8;
    spi.SpiSendByte(tempdata);
    tempdata=tempaddr;
    spi.SpiSendByte(tempdata);
    spi.SpiSendByte(tempval);
    spi.SpiClose();
   
     Delay8us();
    //WriteWait();
    WriteDisable();
     
   
  }
  
void CFlash::WriteNByte(INT32U addr,INT8U *buf,INT16U val)
  {
    INT32U tempaddr;
    INT16U  i;
    INT16U  tempval;
    INT8U err;
    tempaddr=addr;
    tempval=val;
     OSSemPend(GSPISem, 0, & err);
    for(i=0;i<val;i++)
     {
       WriteByte(tempaddr,buf[i]);
       tempaddr++;
     }
    err = OSSemPost(GSPISem);
  }
/*  void CFlash::WriteNByte(INT32U addr,INT8U *buf,INT16U val)yhychange
  {
    INT32U tempaddr;
    INT16U  i;
    INT16U  tempval;
    INT8U err;
    INT8U m=0;
    tempaddr=addr;
    tempval=val;
     OSSemPend(GSPISem, 0, & err);
     m=tempval%2;
     tempval=(tempval/2)*2;
     WriteWordAAI(addr,buf,tempval);
     if(m==1)
     {
      tempaddr+=tempval;
     WriteByte(tempaddr,buf[tempval]);
     
     }
    //for(i=0;i<val;i++)
    // {
    //   WriteByte(tempaddr,buf[i]);
     //  tempaddr++;
    // }
    err = OSSemPost(GSPISem);
  }*/
  void CFlash::WriteWordAAI(INT32U addr,INT8U *buf,INT32U cnt)
  {
    INT32U tempaddr;
    INT32U i=0;
    INT8U  tempdata;
    INT32U  tempval;
    //INT8U  temp;
    tempval=cnt;
    tempaddr=addr;
    //WriteEnable();
    //spi.SpiOpen();
   // spi.SpiSendByte(0x70);
   // spi.SpiClose(); 
   // Delay8us();  
    WriteEnable();
    spi.SpiOpen();
    spi.SpiSendByte(CMDWordProgram);
    tempdata=tempaddr>>16;
    spi.SpiSendByte(tempdata);
    tempdata=tempaddr>>8;
    spi.SpiSendByte(tempdata);
    tempdata=tempaddr;
    spi.SpiSendByte(tempdata);
    spi.SpiSendByte(buf[i++]);
    spi.SpiSendByte(buf[i++]);
    spi.SpiClose();
    //spi.SpiOpen();
    //do
    //{
    ///temp=spi.SpiCheckSI();
    //}
   // while(temp==TRUE);
    Delay8us();
    while(i<tempval)
    {
     spi.SpiOpen();
     spi.SpiSendByte(0xAD);
     spi.SpiSendByte(buf[i++]);
     spi.SpiSendByte(buf[i++]);
     spi.SpiClose();
     //spi.SpiOpen();
      //do
      //{
       // temp=spi.SpiCheckSI();
     // }
     //while(temp==TRUE);
       Delay8us();
    }
    spi.SpiOpen();
    spi.SpiSendByte(CMDWriteDisable);
    Delay8us();
    // do
    //{
  //  temp=spi.SpiCheckSI();
  //  }
  //  while(temp==TRUE);
    spi.SpiClose();
   
    //spi.SpiOpen();
   // spi.SpiSendByte(0x80);
    //spi.SpiClose(); 
   // Delay8us(); 
    WriteDisable();
   
  }
 void CFlash::EraseChip(void)
 {  
  
    WriteEnable(); 
    spi.SpiOpen();
    spi.SpiSendByte(CMDEraseAll);
    spi.SpiClose();
   //Delay8us();
    OSTimeDly(OS_TICKS_PER_SEC/10);
 }
void CFlash::Erase4KB(INT32U add)
{  
   INT8U tempdata;
   INT32U tempaddr=add;
   INT8U i;
    INT8U err;
     OSSemPend(GSPISem, 0, & err);
   INT8U tempsta=ReadStatus();
    if(tempsta&&0x1c)
      WriteStatus(0x00);
   WriteEnable();
   spi.SpiOpen();
   spi.SpiSendByte(CMDErase4K);
   tempdata=tempaddr>>16;
   spi.SpiSendByte(tempdata);
   tempdata=tempaddr>>8;
   spi.SpiSendByte(tempdata);
   tempdata=tempaddr;
   spi.SpiSendByte(tempdata);
   spi.SpiClose();
   for(i=0;i<10;i++)
   {
    //OSTimeDly(OS_TICKS_PER_SEC/200);
    Xms(30);
    tempdata=ReadStatus();
    if((tempdata&0x01)==0x00)
     break;
   }
   err = OSSemPost(GSPISem);
}

void CFlash::Erase32KB(INT32U add)
{  
   INT8U tempdata;
   INT32U tempaddr=add;
   WriteEnable();
   spi.SpiOpen();
   spi.SpiSendByte(CMDErase32K);
   tempdata=tempaddr>>16;
   spi.SpiSendByte(tempdata);
   tempdata=tempaddr>>8;
   spi.SpiSendByte(tempdata);
   tempdata=tempaddr;
   spi.SpiSendByte(tempdata);
   spi.SpiClose();
   OSTimeDly(OS_TICKS_PER_SEC/50);

}

void CFlash::Erase64KB(INT32U add)
{  
   INT8U tempdata;
   INT32U tempaddr=add;
   WriteEnable();
   spi.SpiOpen();
   spi.SpiSendByte(CMDErase64K);
   tempdata=tempaddr>>16;
   spi.SpiSendByte(tempdata);
   tempdata=tempaddr>>8;
   spi.SpiSendByte(tempdata);
   tempdata=tempaddr;
   spi.SpiSendByte(tempdata);
   spi.SpiClose();
   OSTimeDly(OS_TICKS_PER_SEC/50);

}

⌨️ 快捷键说明

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