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

📄 ic.cpp

📁 AT45DB系列Dataflash串行通讯程序
💻 CPP
字号:
#include "at45.h"
#include "stdio.h"
unsigned short verRder=0;
long ttt=0;
long clkReader=3571200l;
long clkCpu=3571200l;
long baudRate=9600l;
short tout=1;

short getByte();
short sendByte(short dt);

#include<windows.h>
void delay(unsigned short i){
  DWORD a=GetTickCount(),b;
  do b=GetTickCount()-a; while (b<=i);
}

#include <string.h>
////////////////////////////////////////////////////////////////////////////////
#define jbGetInfo	0
#define jbPowerOff	1
#define jbEnd		2
#define jbPowerOn       3
#define jbPowerOnCpu	4
#define jbSetPort	5
#define jbSetLed	6
#define jbEject		7

#define	jbIOUp		8
#define	jbIODown	9

#define jbLowIO5	10
#define jbLowIO4	11
#define jbLowIO3	12
#define jbLowIO2	13
#define jbLowIO1	14
#define jbLowIO0	15

#define jbUpIO5		16
#define jbUpIO4		17
#define jbUpIO3		18
#define jbUpIO2		19
#define jbUpIO1		20
#define jbUpIO0		21

#define jbGotoAdd	22
#define jbRead6603	23
#define jbWrt6603	24
#define jbWrt6603V	25
#define jbWrt6603E	26
#define	jbWrt6603EV	27
#define jbCompare	28
#define jbGetCmpCnt	29

#define jbReadSPI	30
#define jbWriteSPI	31
#define jbReadIIC	32
#define	jbWriteIIC	33
#define	jbSendCPU	34
#define	jbIICATR	35
#define jbEraseSPI	36
#define jbEraseIIC	37
#define jbErase6603	38
#define jbSetBaud	39
#define	jbSendCPU1	40

short sold[]={jbSetPort,0xc7,0x6b,-1,jbSetLed,2,jbLowIO1,jbWriteSPI,  //old
	   0,jbUpIO3,jbLowIO3,jbSetLed,1,jbReadSPI,0,jbUpIO1};

#define mBfSz		256
#define SPITimeOut	11
#define timeOut		550//182
#define times GetTickCount()

short sdBuffer[mBfSz];
unsigned char recBuffer[mBfSz];

short CardType=0;
short BufSize=11;

short sbs=0,sbe=0,rbe=0;

#define getByte1 getByte

short checkSBuf(){
  short r=getByte1();
  if (r<0) return 0;
  if (sbs==sbe) return erTooManyResponse;
  short a=sdBuffer[sbs++];
  if (sbs>=BufSize) sbs=0;
  if (a==-1) {
    if (rbe<mBfSz) recBuffer[rbe++]=(unsigned char)r;
  } else {
    if (a!=r) return erLoopBackErr;
  }
  return 0;
}

short sendBytes(short *b,short l){
  short r=0;
  unsigned long t1=times;
  for (short i=0;i<l;){
    r|=checkSBuf();
    short a=sbe+1;
    if (a>=BufSize) a=0;
    if (a!=sbs){
      short r1=0;
      if (b[i]>=0) r1=sendByte(b[i]);
      if (b[i]<0 || r1>=0) {
      // if (b[i]>=0) delay(2);	//for win95 bug.
	sdBuffer[sbe]=b[i++];
	sbe=a;
	t1=times;
      }
	 }
    if (times<t1) t1=times;
    if (times-t1>(unsigned)timeOut*tout) return r|erTimeOverFlow;
  }
  return r;
}

short recWait(){
  unsigned long t1=times;
  short r=0;
  while (sbs!=sbe){
    r|=checkSBuf();
    if (times<t1) t1=times;
    if (times-t1>(unsigned)timeOut*tout) return r|erTimeOverFlow;
  }
  return r;
}

short EndJob(){
  short hd[]={jbSetLed,0,jbEnd};
  short r=sendBytes(hd,3);
  if (r!=0) return r;
  r=recWait();
  return r;
}

short SendHead(){
  rbe=0;
  sbe=sbs=0;
  tout=1;
  short x,y;
  for (x=0,y=0;x<300;x++)
  {
    if (getByte1()==-1) 
	{
      if (y==0) break; 
	  else 
	  {
  	    delay(1);
	    y=0;
      }
    } else y=1;
  }
  if (x==300) return erTimeOverFlow;
  short hd[]={0,0x55,0xaa,0x55,-1};
  short r=sendBytes(hd,5);
  if (r!=0) return r|EndJob();
  r=recWait();
  if (r!=0) return r|EndJob();
  return 0;
}

short readBytes(unsigned char *buf,short l){
  unsigned long t1=times;
  short r=0;
  for (short i=0;i<l&&r==0;){
	 if (sbs!=sbe) r=checkSBuf(); else {
      short r1=getByte1();
      if (r1>=0){
	buf[i++]=(unsigned char)r1;
	t1=times;
      }
    }
    if (times<t1) t1=times;
    if (times-t1>(unsigned)timeOut*tout) r|=erTimeOverFlow;
  }
  return r;
}

short AT45_PowerOn(){
  short rst=0;
  short r=SendHead();
  if (r!=0) return r;
  if ((recBuffer[0]&ifPowerOff)==0&&rst==0) {
	 return erPowerIsOn|EndJob();
  }
  if ((recBuffer[0]&ifPowerOff)!=0&&rst==1) {
	 return erPowerIsOff|EndJob();
  }
  short pno[]={jbSetPort,0xc0,0x40,-1};
  short pon[]={
	jbPowerOn,0xc9,0x75,-1,jbSetLed,0,jbEnd, 	    //6603
	jbPowerOn,0xcc,0x45,-1,jbSetLed,0,jbEnd,	    //iic
	jbPowerOn,0xd5,0x77,-1,jbSetLed,0,jbEnd,        //spi
	jbPowerOnCpu,0xc8,0x41,0xc0,-1,jbSetLed,0,jbEnd	//cpu
  };
  short ponOld[]={jbPowerOn,0xc7,0x6b,-1,jbSetLed,0,jbEnd};  //spi old
  short l=7;
  short *p;
  p=ponOld;
  if (rst) p[0]=jbSetPort;
  r=sendBytes(pno,4);
  if (r!=0) return r;
  r=recWait();
  if (r!=0) return r;
  if ((recBuffer[1]&0x80)!=0) return erNOCard|EndJob();
  r=sendBytes(p,l)|recWait();
  return r;
 }


short AT45_PowerOff(){
  CardType=0;
  short r=SendHead();
  if (r!=0) return r;
  if ((recBuffer[0]&ifPowerOff)!=0) return erPowerIsOff|EndJob();
  short hd[]={jbPowerOff,jbEnd};
  r=sendBytes(hd,2);
  if (r!=0) return r;
  r=recWait();
  return r;
}

short AT45_Set232Baud(long baud){
  if ((verRder&0x8000)==0) erFunNotSupport;
  short r=SendHead();
  if (r!=0) return r;
  short pno[2]={jbSetBaud,0};
  pno[1]=(short)((clkReader>>4)/baud-1);
  r=sendBytes(pno,1);
  if(r!=0) return r;
  r=recWait();
  if (r!=0) return r;
  r=sendBytes(pno+1,1);
  return r;
}

short testReader(){
  short r=SendHead();
  if (r!=0) return r|recWait();
  short s=jbGetInfo;
  r=sendBytes(&s,1);
  if (r) return r|recWait();
  unsigned char buf[17];
  r=readBytes(buf,16);
  short n=11;
  if (r==0){
    verRder=((buf[4]<<8)|buf[5]);	//&0x7fff;
    const long clkList[]={3571200l,3579545l,3276800l,1843200l,2000000l};
    short a=buf[2]&0xf;
    if (a>4) a=1;
    clkReader=clkList[a];
    a=buf[2]>>4;
    if (a==0) a=1;
    clkReader*=a;
    a=buf[3]; if (a==0) a=1;
    clkCpu=clkReader/a;
    baudRate=(clkReader>>4)/(buf[0]+1);
    if ((buf[2]==0x11||buf[2]==0x10) && buf[0]==0x16) baudRate=9600l;
    n=buf[1];
    if (n==0) n=256;
  } else if (r==4) {
    r=0;
    verRder=0x100;
    clkReader=3571200l;
    clkCpu=3571200l;
    baudRate=9600l;
  } else return r|recWait();
  s=jbEnd;
  r|=sendBytes(&s,1);
  r|=recWait();
  sbe=sbs=0;
  BufSize=n;
  return r;
}

NOMANGLE short CCONV RWSPI(unsigned char*bfin,short li,unsigned char *bfout,short lo,short ck){
  unsigned char err1=0;
  short r=SendHead();
  if (r!=0) return r;
  if ((recBuffer[0]&ifPowerOff)!=0) return erPowerIsOff|EndJob();
  short *s;
  short i,l;
  s=sold;
  if (ck)
  {
     unsigned long t1=times;
	 while (ck)
	 {
      r=sendBytes(s,4);
      r|=recWait();
      if (r) return r|EndJob();
      if ((recBuffer[1]&4)!=0) ck=0;
		rbe--;
      if (times<t1) t1=times;
      if (times-t1>SPITimeOut) return erTimeOverFlow|EndJob();
     }
  }
  r=sendBytes(s+4,3);
  if (r!=0) return r|EndJob();
  while (li>0){
    short l=(li>=256?256:(short)li);
    s[8]=l&0xff;
    r=sendBytes(s+7,2);
    for (i=0;i<l&&((r&erTimeOverFlow)==0);i++){
      s[8]=bfin[i];
      r|=sendBytes(s+8,1);
    }
    bfin+=l;
    r|=readBytes(&err1,1);
    if(err1!=0) return 1;
    if (r) return r|EndJob();
    li-=l;
  }
  if (lo>0) r=sendBytes(s+9,4);
  if (r) return r|EndJob();
  while (lo>0){
    l=(lo>=256?256:lo);
    s[14]=l&0xff;
    r=sendBytes(s+13,2);
	 if (r) return r|EndJob();
    r|=readBytes(bfout,l);
    bfout+=l;
	 r|=readBytes(&err1,1);
    if(err1!=0) return 1;
    if (r) return r|EndJob();
    lo-=l;
  }
  r=sendBytes(s+15,1);
  return r|EndJob();
}

short ReadData(long add,unsigned char *buf,long len){
  unsigned char s[8];
  short Buf_Address,Page_Address;
  long Read_Length;
  short r=erCardType;
  s[0]=0x52;                                          //Main_page_read cmd 
  s[4]=s[5]=s[6]=s[7]=0;
  Read_Length = len;
  Sleep(4);
  while (Read_Length>0)
  {
	Page_Address=(short)(add/264);                    //page_addr
	Buf_Address=(short)(add-Page_Address*264l);       //buf_addr
	s[1]=(unsigned char)((Page_Address>>7)&0xff);
	s[2]=(unsigned char)(((Page_Address<<1)&0xff)+(Buf_Address>=256?1:0));
	s[3]=(unsigned char)(Buf_Address&0xff);
	Buf_Address=264-Buf_Address;
	if (Buf_Address > Read_Length) Buf_Address=(short)Read_Length;
	r=RWSPI(s,8,buf,Buf_Address,(Read_Length==len?1:0));
	if (r!=0) break;
	buf+=Buf_Address;
	add+=Buf_Address;
	Read_Length-=Buf_Address;
  }
  Sleep(4);
  return r;
}

short WriteData(long add,unsigned char *buf,long len){
  short Page_Addr,Buf_Addr;
  short pg,ck;
  long i, Write_Len;
  unsigned char pp[268];
  unsigned char *s=pp;
  short r=0;
  pg=0; ck=1;
  Write_Len=len;
  Sleep(4);
  while (Write_Len>0)
  {
    Page_Addr=(short)(add/264); 
	Buf_Addr=(short)(add-Page_Addr*264l);
	i= 264 - Buf_Addr;
	if (i > Write_Len) i = Write_Len;
	if (i < 264 )
	{
	  s[0]=(unsigned char)(pg==0?0x53:0x55);	     //Main page to buffer
	  s[1]=(unsigned char)((Page_Addr>>7)&0xff);
	  s[2]=(unsigned char)((Page_Addr<<1)&0xff);
	  s[3]=0;
	  r=RWSPI(s,4,0,0,ck); ck=0;
	  if (r!=0) break;
	}
	s[0]=(unsigned char)(pg==0?0x84:0x87);	         //buffer write
	s[1]=0;
	s[2]=(unsigned char)(Buf_Addr>=256?1:0);
	s[3]=(unsigned char)(Buf_Addr&0xff);
	memcpy(s+4,buf,i);
	r=RWSPI(s,4+i,0,0,0);
	if (r!=0) break;
	Sleep(1);
/*	if (len!=Write_Len)                               //verify last page
	{	
	  s[0]=(unsigned char)(pg==0?0x61:0x60);	//verify
	  s[1]=(unsigned char)(((Page_Addr-1)>>7)&0xff);
	  s[2]=(unsigned char)(((Page_Addr-1)<<1)&0xfe);
	  s[3]=0;
	  r=RWSPI(s,4,0,0,ck); ck=0;
	  ttt=3;
	  if (r!=0) break;
	}*/
	buf+=i; add+=i;Write_Len-=i;
    s[0]=(unsigned char)(pg==0?0x83:0x86);	            //buffer to main page
	s[1]=(unsigned char)((Page_Addr>>7)&0xff);
	s[2]=(unsigned char)((Page_Addr<<1)&0xfe);
	s[3]=0;
	r=RWSPI(s,4,0,0,ck); ck=1;
	if (r!=0) return r;
	pg^=1;
  }
  if (r!=0 || Write_Len!=0) return r;
  /*s[0]=(unsigned char)(pg==0?0x61:0x60);	//verify
  s[1]=(unsigned char)((Page_Addr>>7)&0xff);	//
  s[2]=(unsigned char)((Page_Addr<<1)&0xfe);	//
  s[3]=0;		
  r=RWSPI(s,4,0,0,ck); ck=0;*/
  Sleep(4);
  return r;
}

⌨️ 快捷键说明

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