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

📄 at45d041大容量ic卡 读写程序.c

📁 4442卡的底层操作程序 AT45D041大容量IC卡 读写程序
💻 C
📖 第 1 页 / 共 2 页
字号:
}
return (b);
}

//------------------------------------------------------------------------------
DWORD ICFreeSize()         /*获取可用空间,字节数*/
{
WORD CurPage = 0;
DWORD lResult = 0;
do 
{
CurPage = ICNextFreePage(CurPage);
if (CurPage > 0)
lResult++;
else 
break;
} while(1);
lResult *= ICSysInfo.PageBytes;
return (lResult);
}

//------------------------------------------------------------------------------
DWORD ICUsedSize()         /*获取已使用空间,字节数*/
{
DWORD lResult;
lResult = ICTotalSize() - ICFreeSize();
return (lResult);
}

//------------------------------------------------------------------------------
DWORD ICTotalSize()        /*获取总空间,字节数*/
{
DWORD lResult;
  lResult = ICSysInfo.DataLength;
lResult *= ICSysInfo.PageBytes;
return (lResult);
}

//------------------------------------------------------------------------------
void ICReadDirInfo(uchar IndexOfDir, ICDirInfo *DirInfo)    /*读取目录信息*/
{
uchar i;
uchar *p;
WORD Page,ByteAddr;
    /*根据目录索引号取得目录所在的页号和页内地址*/
    ICDirIndexToPageByteAddr(IndexOfDir,&Page,&ByteAddr);
/*读取数据*/
p = (uchar *)DirInfo;
    *p++ = ICReadPageByte(Page,ByteAddr);
for (i=1;i<sizeof(ICDirInfo);i++)
*p++ = ICReadNextByte();
}

//------------------------------------------------------------------------------
bit ICWriteDirInfo(uchar IndexOfDir, ICDirInfo *DirInfo)    /*写入目录信息*/
{
bit b;
WORD Page,ByteAddr;
uchar *p = (uchar*) DirInfo;
    /*根据目录索引号取得目录所在的页号和页内地址*/
    ICDirIndexToPageByteAddr(IndexOfDir,&Page,&ByteAddr);
b = ICWriteToPage(p,(uchar)sizeof(ICDirInfo),Page,ByteAddr);
return (b);
}

//------------------------------------------------------------------------------
void ICReadSysInfo(_ICSysInfo *ICInfo, WORD SysPage)    /*读取IC卡系统信息*/
{
uchar i;
    uchar *p = (uchar *) ICInfo;
*p++ = ICReadPageByte(SysPage,0);
for (i=1;i<sizeof(ICSysInfo);i++)
*p++ = ICReadNextByte();
}

//------------------------------------------------------------------------------
bit ICWriteSysInfo(_ICSysInfo *ICInfo, WORD SysPage)    /*写入IC卡系统信息*/
{
bit b;
    uchar *p = (uchar *) ICInfo;
    b = ICWriteToPage(p,(uchar)sizeof(_ICSysInfo),SysPage,0);
return (b);
}

//----------------------------------------------------------------------------
WORD  ICReadPageSign(WORD Page) /*读页标记*/
{
WORD wPage,wByteAddr,wResult,i;
i = ICSysInfo.PageBytes / sizeof(Page);
wPage = (Page / i) + ICSysInfo.FatStart;
wByteAddr = (Page % i) * sizeof(Page);
i = ICReadPageByte(wPage,wByteAddr);
wResult = i;
    wResult = wResult<<8;
i = ICReadNextByte();
wResult += i;
return (wResult);
}

//----------------------------------------------------------------------------
bit  ICWritePageSign(WORD Page,WORD Sign) /*写页标记*/
{
bit b;
WORD wPage,wByteAddr,i;
i = ICSysInfo.PageBytes / sizeof(Page);
wPage = (Page / i) + ICSysInfo.FatStart;
wByteAddr = (Page % i) * sizeof(Page);
ICPageToBuf2(wPage);
ICWaitReady();
ICWriteBuf2Byte(wByteAddr,(uchar)(Sign>>8));
ICWriteNextByte((uchar)(Sign));
ICBuf2ToPage(wPage);
ICWaitReady();
b = ICBuf2CmpPage(wPage);
return (b);
}

//----------------------------------------------------------------------------
WORD  ICFirstFreePage()    /*从头寻找第一个空闲的页*/
{
return (ICNextFreePage,0);
}

//----------------------------------------------------------------------------
WORD  ICNextFreePage(WORD StartPage) /*寻找下一个空闲的页*/
{
WORD w;
do
{
        w = ICReadPageSign(StartPage);
if (w == csFree)
break;
if (w == csEnd)
{
w = 0x0000;
break;
}
StartPage++;
} while(1);
return (w);
}

//----------------------------------------------------------------------------
void ICDirIndexToPageByteAddr(uchar DirIndex, WORD *Page, WORD *ByteAddr)
{
uchar i;
i = ICSysInfo.PageBytes / sizeof(ICDirInfo);
*Page = (DirIndex / i) + ICSysInfo.DirStart;
*ByteAddr = (DirIndex % i) * sizeof(ICDirInfo);
}

//----------------------------------------------------------------------------
bit ICWriteToPage(uchar *p, uchar Count, WORD Page, WORD ByteAddr)
{
bit b;
uchar i;
/*读取页内容至缓存2*/
ICPageToBuf2(Page);    
    ICWaitReady();
    /*写入字符串至缓存2*/
ICWriteBuf2Byte(ByteAddr, *p++);
for(i=1;i<Count;i++)
ICWriteNextByte(*p++);
    /*缓存2写入页*/
ICBuf2ToPage(Page);
ICWaitReady();
/*比较写入是否成功*/
b = ICBuf2CmpPage(Page);
return (b);
}

//----------------------------------------------------------------------------
uchar ICReadPageByte(WORD Page, WORD ByteAddr)
{
uchar c;
c = ICCommand(PageRead,Page,ByteAddr);
return (c);
}

//----------------------------------------------------------------------------
void ICWriteBuf1Byte(WORD ByteAddr,uchar b)
{
ICCommand(Buf1Write,0,ByteAddr);
ICWriteNextByte(b);
}

//----------------------------------------------------------------------------
void ICWriteBuf2Byte(WORD ByteAddr,uchar b)
{
ICCommand(Buf2Write,0,ByteAddr);
ICWriteNextByte(b);
}

//----------------------------------------------------------------------------
uchar ICReadBuf1Byte(WORD ByteAddr)
{
uchar c;
c = ICCommand(Buf1Read,0,ByteAddr);
return (c);
}

//----------------------------------------------------------------------------
uchar ICReadBuf2Byte(WORD ByteAddr)
{
uchar c;
c = ICCommand(Buf2Read,0,ByteAddr);
return (c);
}

//----------------------------------------------------------------------------
bit   ICBuf1CmpPage(WORD Page)
{
bit b;
uchar c;
ICCommand(PageCmpBuf1,Page,0);
ICWaitReady();
c = ICStatus();
b = c&0x40;
return (b);
}

//----------------------------------------------------------------------------
bit   ICBuf2CmpPage(WORD Page)
{
bit b;
uchar c;
ICCommand(PageCmpBuf2,Page,0);
ICWaitReady();
c = ICStatus();
b = c&0x40;
return (b);
}

//----------------------------------------------------------------------------
void  ICBuf1ToPage(WORD Page)
{
ICCommand(Buf1ToPageWithErase,Page,0);
}

//----------------------------------------------------------------------------
void  ICBuf2ToPage(WORD Page)
{
ICCommand(Buf2ToPageWithErase,Page,0);
}

//----------------------------------------------------------------------------
void  ICPageToBuf1(WORD Page)
{
ICCommand(PageToBuf1,Page,0);
}

//----------------------------------------------------------------------------
void  ICPageToBuf2(WORD Page)       
{
ICCommand(PageToBuf2,Page,0);
}

//----------------------------------------------------------------------------
void  ICWaitReady()                  /*等待IC卡准备好*/
{
uchar c;
while (1)
{
c = ICStatus();
if (c&0x80) break;
}
}

//----------------------------------------------------------------------------
uchar ICStatus()                     /*读IC卡状态*/
{
uchar ucResult;
ucResult = ICCommand(StatusRead,0,0);
return (ucResult);
}

//----------------------------------------------------------------------------
/*IC卡命令选择执行*/
unsigned char ICCommand(OpCode cmd, WORD Page, WORD ByteAddr)
{
unsigned char ucResult;
ICOutOpCode(cmd);
if (cmd != StatusRead)
{
ICOutXBits(4);
ICOutPage(Page);
ICOutByteAddr(ByteAddr);
}
    switch (cmd)
{
case PageRead:              //直接读页,缓存不变
{
ICOutXBits(32);
ucResult = ICReadNextByte();
break;
}
case Buf1Read:              //缓存1读
case Buf2Read:         //缓存2读
         {
ICOutXBits(8);
ucResult = ICReadNextByte();
break;
}
case PageToBuf1:            //页读至缓存1
case PageToBuf2:            //页读至缓存2
         {
ICOutXBits(8);
break;
}
case PageCmpBuf1:           //页与缓存1比较,比较结果在状
态寄存器第6位
case PageCmpBuf2:           //页与缓存2比较,比较结果在状
态寄存器第6位
case Buf1Write:             //缓存1写
case Buf2Write:             //缓存2写
case Buf1ToPageWithErase:             //页擦除后,将缓存1
写入页
case Buf2ToPageWithErase:             //页擦除后,将缓存2
写入页
        case Buf1ToPageWithoutErase:          //直接将缓存1写入页
case Buf2ToPageWithoutErase:          //直接将缓存2写入页
case PageWriteThroughBuf1:            //数据先写入缓存1,
再写入页
case PageWriteThroughBuf2:            //数据先写入缓存2,
再写入页
case PageRewriteThroughBuf1:          //页读入缓存1,然后
缓存1写入页
case PageRewriteThroughBuf2:          //页读入缓存2,然后
缓存2写入页
break;
case StatusRead:                      //读状态寄存器
ucResult = ICReadNextByte();
break;
default : break;
}
return ucResult;
}

//----------------------------------------------------------------------------
void  ICWriteNextByte(uchar b)                /*连续写下一个字节*/
{
    ACC = b;
    sDI = a7; sCLK = 0;  sCLK = 1;
    sDI = a6; sCLK = 0;  sCLK = 1;
    sDI = a5; sCLK = 0;  sCLK = 1;
    sDI = a4; sCLK = 0;  sCLK = 1;
    sDI = a3; sCLK = 0;  sCLK = 1;
    sDI = a2; sCLK = 0;  sCLK = 1;
    sDI = a1; sCLK = 0;  sCLK = 1;
    sDI = a0; sCLK = 0;  sCLK = 1;
}

//----------------------------------------------------------------------------
uchar ICReadNextByte()                        /*连续读下一个字节*/
{
sCLK = 1; sCLK = 0; sDO = a7;
sCLK = 1; sCLK = 0; sDO = a6;
sCLK = 1; sCLK = 0; sDO = a5;
sCLK = 1; sCLK = 0; sDO = a4;
sCLK = 1; sCLK = 0; sDO = a3;
sCLK = 1; sCLK = 0; sDO = a2;
sCLK = 1; sCLK = 0; sDO = a1;
sCLK = 1; sCLK = 0; sDO = a0;
return (ACC);
}

//----------------------------------------------------------------------------
void  ICOutOpCode(OpCode cmd)                 /*发送命令字*/
{
uchar b = (uchar)cmd;
ICWriteNextByte(b);
}

//----------------------------------------------------------------------------
void  ICOutPage(WORD Page)                    /*发送页面地址*/
{
    ACC = (uchar)(Page>>8);
    sDI = a2; sCLK = 0;  sCLK = 1;
    sDI = a1; sCLK = 0;  sCLK = 1;
    sDI = a0; sCLK = 0;  sCLK = 1;
ACC = (uchar)(Page%0xff);
    sDI = a7; sCLK = 0;  sCLK = 1;
    sDI = a6; sCLK = 0;  sCLK = 1;
    sDI = a5; sCLK = 0;  sCLK = 1;
    sDI = a4; sCLK = 0;  sCLK = 1;
    sDI = a3; sCLK = 0;  sCLK = 1;
    sDI = a2; sCLK = 0;  sCLK = 1;
    sDI = a1; sCLK = 0;  sCLK = 1;
    sDI = a0; sCLK = 0;  sCLK = 1;
}

//----------------------------------------------------------------------------
void  ICOutByteAddr(WORD ByteAddr)            /*发送字节地址*/
{
    ACC = (uchar)(ByteAddr>>8);
    sDI = a0; sCLK = 0;  sCLK = 1;
ACC = (uchar)(ByteAddr%0xff);
    sDI = a7; sCLK = 0;  sCLK = 1;
    sDI = a6; sCLK = 0;  sCLK = 1;
    sDI = a5; sCLK = 0;  sCLK = 1;
    sDI = a4; sCLK = 0;  sCLK = 1;
    sDI = a3; sCLK = 0;  sCLK = 1;
    sDI = a2; sCLK = 0;  sCLK = 1;
    sDI = a1; sCLK = 0;  sCLK = 1;
    sDI = a0; sCLK = 0;  sCLK = 1;
}

//----------------------------------------------------------------------------
void  ICOutXBits(uchar N)                    /*发送N个任意字符*/
{
sDI = 0;
while (N>0)
{
sCLK = 0;
sCLK = 1;
N--;
}
}
//-----------------------End---------------------------------------------------

⌨️ 快捷键说明

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