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

📄 memory.c

📁 一个具体的项目程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include  "my_head.h"
#include  "mem_addr.h"
#include  "carddef.h"

//#define _DEBUG
#ifdef _DEBUG
#include "Debug.h"
#endif

/********************************************/
#define  MEM_CS     P1_4
#define  MEM_RDY    P1_3
#define  RESET      P1_2
//-------------------------------------------
#define  MYALL_FORBYTE_FLAG        45


#define  THE_BUFFER_ONE            0
#define  THE_BUFFER_TWO            1

#define  CONTINUE_ARREAD_ORDOR     0x68
#define  PAGE_ERASE_ORDOR          0x81
#define  BLOCK_ERASE_ORDOR         0x50

#define  BUFER1_WRIT_ORDOR         0X84
#define  BUFER1_TO_MAIN_ORDOR      0X83
#define  MAIN_TO_BUFER1_ORDOR      0X53
#define  BUFER1_READ_ORDOR         0x54

#define  BUFER2_WRIT_ORDOR         0X87
#define  BUFER2_TO_MAIN_ORDOR      0X86
#define  MAIN_TO_BUFER2_ORDOR      0X55
#define  BUFER2_READ_ORDOR         0x56
/*******************************************************
QUEUE_MEMPAGE  xdata  mem_rbuf;
QUEUE_MEMPAGE  xdata  mem_wbuf;
void  MemRbuf_Clear(void)
{
  memset(&mem_rbuf,0,sizeof(QUEUE_MEMPAGE));
  mem_rbuf.tail=mem_rbuf.head=mem_rbuf.buf;
}

void  MemWbuf_Clear(void)
{
  memset(&mem_wbuf,0,sizeof(QUEUE_MEMPAGE));
  mem_wbuf.tail=mem_wbuf.head=mem_wbuf.buf;
}
/*******************************************************/
const  BYTE     code   Default_Pwd[3]={0x11,0x11,0x11};
const  BYTE     code   YsnOysFlag_Str[]="jjyyonig20050428";
const  BYTE     code   MyReVision_Str[]="SonOllV1.00A";
const  BYTE     code   Con_Types_Str[] ="wyhjis";
Equip_Addr      pdata  equip_addr;  //={0x5A,0x11,111};
//Card_Info       pdata  mycard;
//Op_User_Info    xdata  op_user_info;//={{0x11,0x11,0x11},{0x11,0x11,0x11},0,0};
//Con_param_Info  xdata  con_param_info;
/*
={
9999900,
{0},
{0},
JC_MODE,//5
{0},
{0},
{0}
};
*/
SeedCard_Info   xdata  seedcard_info;
/*
={
 {0x11,0x11,0x11},
 {0x11,0x11,0x11},
 0x11,5,6,{0}
};
*/
Myall_SaveData  xdata  myall_savedata;
/*
={
CONSUME_RECORD_PAGEADDR,0,
CONSUME_RECORD_PAGEADDR,0,
CONSUME_RECORD_PAGEADDR,0
};
*/
Con_StatusInfo  xdata  con_statusinfo; //={0L,0L,0L,0L,0L,0L};
sttOtherTableInfo xdata stOtherTableInfo;
//Dc_Peoples      xdata  dc_peoples;     //={0,{0}};
BYTE            xdata  cardstate_time[6];//上一次成功下传(卡状态)挂失卡组时的时间
/**************************************************************/
void  Init_Memory(void)
{
   MEM_RDY= 1;
   MEM_CS = 1;
   RESET  = 0; delay_ms(2); RESET  = 1;

#if(MCU_IC==SST564)  //EXTRAM = AUXR^2;
   AUXR  &= ~0x02;   //0: Internal Expanded RAM access.
#elif(MCU_IC==SM5964)//OME = SCONF^2;
   SCONF |= 0x02;    //1: default is enable.
#endif

   //MemRbuf_Clear();
   //MemWbuf_Clear();
   memset(&seedcard_info,0,sizeof(SeedCard_Info));//for  send card!
}


bit  SendMemoryData(BYTE *buf,int length)
{
   int  ii;
   Set_Timer20ms(3);
   while(!MEM_RDY)if(!Get_Timer20ms)return(FALSE);
   for(ii=0;ii<length;ii++)
   {
    MemSpiByte_SendReceive(buf[ii]);
   }
   return(TRUE);
}


bit  ReceiveMemoryData(BYTE *buf,int length)
{
   int   ii;
   Set_Timer20ms(3);
   while(!MEM_RDY)if(!Get_Timer20ms)return(FALSE);
   for(ii=0;ii<length;ii++)
   {
	buf[ii]=MemSpiByte_SendReceive(0xff);
   }
   return(TRUE);
}


bit  MomeryAddr_Trans(BYTE buf[4],BYTE ordor,WORD pageaddr,WORD byteaddr)
{
  if((pageaddr>MAX_PAGES-1)||(byteaddr>MEMPAGE_SIZE-1))return(FALSE);
  buf[0]    = ordor;
  pageaddr<<= 1;
  buf[1]    = (BYTE)(pageaddr/256);
  buf[2]    = (BYTE)(pageaddr%256);
  if((BYTE)(byteaddr/256))buf[2] |= 0x01;
  buf[3]    = (BYTE)(byteaddr%256);

  return(TRUE);
}


BYTE  Write_To_Buffer(void *ptr,int length,bit buffer,WORD byteaddr)
{
  BYTE  ordor,buf[4];
  if(buffer)ordor=BUFER2_WRIT_ORDOR;
  else      ordor=BUFER1_WRIT_ORDOR;
  if(!MomeryAddr_Trans(buf,ordor,0,byteaddr))return(MEMADDR_ERR);

  MEM_CS = 0;
  if(!SendMemoryData(buf,4))return(MEMWRITE_ERR);
  if(!SendMemoryData(ptr,length))return(MEMWRITE_ERR);
  MEM_CS = 1;

  //SendStr(buf,4);
  return(SUCCESS);
}


BYTE  Buffer_To_Mem(bit buffer,WORD pageaddr)
{
  BYTE  ordor,buf[4];
  if(buffer)ordor=BUFER2_TO_MAIN_ORDOR;
  else      ordor=BUFER1_TO_MAIN_ORDOR;
  if(!MomeryAddr_Trans(buf,ordor,pageaddr,0))return(MEMADDR_ERR);

  MEM_CS = 0;
  if(!SendMemoryData(buf,4))return(MEMWRITE_ERR);
  MEM_CS = 1;
  
  delay_ms(18);//must!
  //SendStr(buf,4);
  return(SUCCESS);
}


BYTE  Mem_To_Buffer(bit buffer,WORD pageaddr)
{
  BYTE  ordor,buf[4];
  if(buffer)ordor=MAIN_TO_BUFER2_ORDOR;
  else      ordor=MAIN_TO_BUFER1_ORDOR;
  if(!MomeryAddr_Trans(buf,ordor,pageaddr,0))return(MEMADDR_ERR);

  MEM_CS = 0;
  if(!SendMemoryData(buf,4))return(MEMWRITE_ERR);
  MEM_CS = 1;

  delay_ms(1);//must!
  //SendStr(buf,4);
  return(SUCCESS);
}


BYTE  Read_From_Buffer(void *ptr,int length,bit buffer,WORD byteaddr)
{
  BYTE  ordor,buf[5];
  if(buffer)ordor=BUFER2_READ_ORDOR;
  else      ordor=BUFER1_READ_ORDOR;
  if(!MomeryAddr_Trans(buf,ordor,0,byteaddr))return(MEMADDR_ERR);

  buf[4] = 0;
  MEM_CS = 0;
  if(!SendMemoryData(buf,5))return(MEMWRITE_ERR);//must "5"!!
  if(!ReceiveMemoryData(ptr,length))return(MEMREAD_ERR);
  MEM_CS = 1;

  //SendStr(buf,5);
  return(SUCCESS);
}


BYTE  Memory_ArrayRead(void *ptr,int length,WORD pageaddr,WORD byteaddr)
{
  BYTE  buf[8];
  if(!MomeryAddr_Trans(buf,CONTINUE_ARREAD_ORDOR,pageaddr,byteaddr))
     return(MEMADDR_ERR);

  buf[7] = buf[6] =buf[5] =buf[4] =0;
  MEM_CS = 0;
  if(!SendMemoryData(buf,8))return(MEMWRITE_ERR);
  if(!ReceiveMemoryData(ptr,length))return(MEMREAD_ERR);
  MEM_CS = 1;

  //SendStr(buf,8);
  return(SUCCESS);
}


BYTE  Memory_PageErase(WORD startpage,BYTE pages)
{
  BYTE  i, buf[4];
  for(i=0;i<pages;i++,startpage++)
  {
   if(!MomeryAddr_Trans(buf,PAGE_ERASE_ORDOR,startpage,0))return(MEMADDR_ERR);

   MEM_CS = 0;
   if(!SendMemoryData(buf,4))return(MEMWRITE_ERR);
   MEM_CS = 1;
   delay_ms(12);//must!!
  }

  //SendStr(buf,4);
  return(SUCCESS);
}

//==============以上为基本函数============================================

BYTE  Save_ConData_to_Memory(Con_Record  *con_record)
{
  int   ii,jj;
  WORD  save_page;

#ifdef _DEBUG
	DebugString("Begin Save Record,Current Data:\r\n");
	DebugData(sizeof(Con_Record),sizeof(Con_Record),(unsigned char *)con_record);
#endif
  if(!mymem_ok_flag)return(MEM_IC_ERR);

  if(myall_savedata.conbuffer2_byte+sizeof(Con_Record) < MEMPAGE_SIZE)
    {
#ifdef _DEBUG
	DebugString("Current Data in one page\r\n");
	DebugString("Current myall_savedata.conbuffer2_byte=");
	DebugData(2,2,(unsigned char *)&myall_savedata.conbuffer2_byte);
#endif
     if((ii=Write_To_Buffer(con_record,sizeof(Con_Record),THE_BUFFER_TWO,myall_savedata.conbuffer2_byte))!=SUCCESS)
	   {
	    return(ii);//goto END;
	   }
	 myall_savedata.conbuffer2_byte += sizeof(Con_Record);
#ifdef _DEBUG
	DebugString("After Edit, myall_savedata.conbuffer2_byte=");
	DebugData(2,2,(unsigned char *)&myall_savedata.conbuffer2_byte);
#endif

	 return(SUCCESS);
	}

#ifdef _DEBUG
	DebugString("Current Data in two page\r\n");
#endif
  save_page = myall_savedata.conwrite_page;
  if(++myall_savedata.conwrite_page > (MAX_PAGES-1))
    {
     //SendStr("1",1);
	 //SendStr((BYTE *)&myall_savedata.conwrite_page,2);
	 myall_savedata.cycle_flag    = MYALL_FORBYTE_FLAG; //数据循环标志。(最大可恢复点)
     myall_savedata.conwrite_page = CON_RECORD_START_PAGEADDR;
	}
  if(myall_savedata.conwrite_page == myall_savedata.conread_page)
    {//数据页满
	 //SendStr("2",1);
	 //SendStr((BYTE *)&myall_savedata.conread_page,2);
	 myall_savedata.conwrite_page=save_page;
     Equip_CurStatus = MEM_FULL_ARALM;
     return(MEM_FULL_ARALM);//如果不这样下面将可能只写入一半记录!!!
	}

  jj = (MEMPAGE_SIZE-1)-myall_savedata.conbuffer2_byte;
  if((ii=Write_To_Buffer(con_record,jj,THE_BUFFER_TWO,myall_savedata.conbuffer2_byte))!=SUCCESS)
    {
      return(ii);//goto END;
    }
  Buffer_To_Mem(THE_BUFFER_TWO,save_page);//写入FLASH!

  myall_savedata.conbuffer2_byte = sizeof(Con_Record)-jj;//如果不这样,满时就会多读出一些数据!
  Write_To_Buffer(((BYTE*)con_record)+jj,myall_savedata.conbuffer2_byte,THE_BUFFER_TWO,0);

  /************************************************************************/
  //计算所剩空间,mem will full --提前告警。
  if(myall_savedata.conwrite_page > myall_savedata.conread_page)
    {
	   ii =((MAX_PAGES-1)-myall_savedata.conwrite_page)+(myall_savedata.conread_page-CON_RECORD_START_PAGEADDR);
	}
  else ii =myall_savedata.conread_page - myall_savedata.conwrite_page;

  if(ii<MYALL_FORBYTE_FLAG)
    {
     Dis_DataFull_Led(TRUE);
     Equip_CurStatus=MEM_WILLFULL_WARNING;
     return(MEM_WILLFULL_WARNING);//goto END;
    }

  return(SUCCESS);
}


BYTE  Read_ConData_From_Memory(Con_Record  *con_record)
{
  int  ii,jj;
  if(!mymem_ok_flag)return(MEM_IC_ERR);

  //SendStr("1",1);//for test!
  //SendStr(uartSbuf,7);//for test!
  if(myall_savedata.lread_page == myall_savedata.conwrite_page)
  {
   if(myall_savedata.lread_byte+sizeof(Con_Record) > myall_savedata.conbuffer2_byte)
     {//没有消费数据
	  //myall_savedata.lread_byte = myall_savedata.conbuffer2_byte;//理论上是没必要的!
      return(NO_CON_RECORD);//ii=NO_CON_RECORD;goto END;
	 }
   //SendStr("2",1);//for test!
   //SendStr(uartSbuf,7);//for test!
   if((ii=Read_From_Buffer(con_record,sizeof(Con_Record),THE_BUFFER_TWO,myall_savedata.lread_byte))!=SUCCESS)
	 {
      return(ii);//goto END;
	 }
   //SendStr("3",1);//for test!
   //SendStr(uartSbuf,7);//for test!
   myall_savedata.lread_byte += sizeof(Con_Record);

   return(SUCCESS);
  }
  //==============================================================
  //SendStr("4",1);//for test!
  //SendStr(uartSbuf,7);//for test!
  if(myall_savedata.lread_byte+sizeof(Con_Record) < MEMPAGE_SIZE)
  {
   if((ii=Memory_ArrayRead(con_record,sizeof(Con_Record),myall_savedata.lread_page,myall_savedata.lread_byte))!=SUCCESS)
	 {
	   return(ii);//goto END;
	 }
   myall_savedata.lread_byte += sizeof(Con_Record);

   return(SUCCESS);
  }

  //SendStr("5",1);//for test!
  //SendStr(uartSbuf,7);//for test!
  jj = (MEMPAGE_SIZE-1)-myall_savedata.lread_byte;
  if((ii=Memory_ArrayRead(con_record,jj,myall_savedata.lread_page,myall_savedata.lread_byte))!=SUCCESS)
    {
     return(ii);//goto END;
    }
  //SendStr("6",1);//for test!
  //SendStr(uartSbuf,7);//for test!
  //SendStr((BYTE *)&myall_savedata.lread_byte,2);//for test!
  //SendStr((BYTE *)&jj,2);//for test!
  if(++myall_savedata.lread_page>(MAX_PAGES-1))
    {
     myall_savedata.lread_page = CON_RECORD_START_PAGEADDR;
	}

  myall_savedata.lread_byte = sizeof(Con_Record)-jj;
  if(myall_savedata.lread_page == myall_savedata.conwrite_page)
    {//我烤,为了一个(BYTE*)花了老子三四天时间!!惨惨!!!
     ii=Read_From_Buffer(((BYTE*)con_record)+jj,myall_savedata.lread_byte,THE_BUFFER_TWO,0);
	}
  else
    {
	 ii=Memory_ArrayRead(((BYTE*)con_record)+jj,myall_savedata.lread_byte,myall_savedata.lread_page,0);
    }
  //SendStr("7",1);//for test!
  //SendStr(uartSbuf,7);//for test!
  //SendStr((BYTE *)&myall_savedata.lread_byte,2);//for test!
  //SendStr((BYTE *)&jj,2);//for test!
  return(ii);
}


BYTE  Del_ConData_From_Memory(Con_Record  *con_record)
{
  int  ii,jj;
  if(!mymem_ok_flag)return(MEM_IC_ERR);

  if(myall_savedata.conread_page==myall_savedata.conwrite_page)
  {
   if(myall_savedata.conread_byte+sizeof(Con_Record) > myall_savedata.conbuffer2_byte)
     {//没有消费数据
	  //myall_savedata.conread_byte = myall_savedata.conbuffer2_byte;//理论上是没必要的!
      return(NO_CON_RECORD);//ii=NO_CON_RECORD;goto END;
	 }
   if((ii=Read_From_Buffer(con_record,sizeof(Con_Record),THE_BUFFER_TWO,myall_savedata.conread_byte))!=SUCCESS)
	 {
      return(ii);//goto END;
	 }
   myall_savedata.conread_byte += sizeof(Con_Record);
   
   return(SUCCESS);
  }

  //===============================================================
  if(myall_savedata.conread_byte+sizeof(Con_Record) < MEMPAGE_SIZE)
	{
	 if((ii=Memory_ArrayRead(con_record,sizeof(Con_Record),myall_savedata.conread_page,myall_savedata.conread_byte))!=SUCCESS)
	   {
		return(ii);//goto END;
	   }
	 myall_savedata.conread_byte += sizeof(Con_Record);

	 return(SUCCESS);
    }

  jj = (MEMPAGE_SIZE-1)-myall_savedata.conread_byte;
  if((ii=Memory_ArrayRead(con_record,jj,myall_savedata.conread_page,myall_savedata.conread_byte))!=SUCCESS)
    {
     return(ii);//goto END;
    }

  if(++myall_savedata.conread_page>(MAX_PAGES-1))
    {
     myall_savedata.conread_page = CON_RECORD_START_PAGEADDR;
	}

  myall_savedata.conread_byte = sizeof(Con_Record)-jj;
  if(myall_savedata.conread_page==myall_savedata.conwrite_page) //关键点!!
    {
     ii =Read_From_Buffer(((BYTE*)con_record)+jj,myall_savedata.conread_byte,THE_BUFFER_TWO,0);
	}
  else
    {
	 ii =Memory_ArrayRead(((BYTE*)con_record)+jj,myall_savedata.conread_byte,myall_savedata.conread_page,0);
    }
  if(ii!=SUCCESS)return(ii);
  /************************************************************************
  //mem will full --提前告警。
  if(myall_savedata.conwrite_page>myall_savedata.conread_page)
    {
	 ii=((MAX_PAGES-1)-myall_savedata.conwrite_page)+(myall_savedata.conread_page-CON_RECORD_START_PAGEADDR);
	}
  else ii=myall_savedata.conread_page-myall_savedata.conwrite_page;

  if(ii>MYALL_FORBYTE_FLAG)
  {

⌨️ 快捷键说明

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