📄 at45d041大容量ic卡 读写程序.c
字号:
}
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 + -