?? at45d041大容量ic卡 讀寫程序.txt
字號:
用【 小 | 中 | 大 】字體瀏覽
C51編程:數據的文件化存儲,歡迎討論,我粗略的寫了一段程序,因為硬件沒有做好,許多地方也不夠成熟,只希望沒有原則性的錯誤就好了,大蝦們,提提意見吧! [阿仙] [58次] 01-12-30 下午 04:19:01
/*------------------------------------------------------------------------------
*/
/* 文件名: IC.c
/*
/* AT45D041大容量IC卡 讀寫程序
/* 存儲器容量為4325376位,分為2048頁,每頁有264字節,與緩存器的容量相等。
/* 0~1頁保存系統信息(目錄表大小,文件分配表大小,數據區大小,頁的大小等)
/* 2~17頁文件目錄表 (每條文件目錄為32字節,根最大目錄數為128)
/* 18~33頁文件分配表 (FAT16格式,分配表長度可根據卡的容量改變,AT45D041需16頁)
/* 34~47頁系統保留
/* >=48頁為數據區
/*------------------------------------------------------------------------------
*/
#include <Reg51.h>
#include <String.h>
#define uchar unsigned char
#define WORD unsigned int
#define DWORD unsigned long
//系統信息結構
typedef struct
{
uchar VersionName[8]; //版本名稱
uchar Version[3]; //版本號
uchar ICName[10]; //IC卡名稱
DWORD ICPages; //IC卡共有多少頁
WORD PageBytes; //每頁包含的字節數
WORD DirStart; //根文件目錄表開始頁
WORD DirLength; //根文件目錄表頁面數
WORD FatStart; //文件分配表開始頁
WORD FatLength; //文件分配表頁面數
WORD DataStart; //數據區起始頁
WORD DataLength; //數據區頁面數
} _ICSysInfo;
//文件目錄表結構,每條目錄項32字節
typedef struct
{
uchar FileName[8]; /* 文件名稱 */
uchar FileExt[3]; /* 文件擴展名 */
uchar FileAttr; /* 文件屬性 */
uchar a[10]; /* 系統保留 */
WORD UpdateTime; /* 時間=小時*2048+分鐘*32+秒+2 */
WORD UpdateDate; /* (年份-1980)*512+月份*32+日 */
WORD FirstPage; /* 文件首頁號 */
DWORD FileSize; /* 文件字節數 */
} ICDirInfo;
//AT45D041卡的操作命令定義
typedef enum
{
PageRead = 0x52, //直接讀頁,緩存不變
Buf1Read = 0x54, //緩存1讀
Buf2Read = 0x56, //緩存2讀
PageToBuf1 = 0x53, //頁讀至緩存1
PageToBuf2 = 0x55, //頁讀至緩存2
PageCmpBuf1 = 0x60, //頁與緩存1比較,比較結果在狀態寄存器第6位
PageCmpBuf2 = 0x61, //頁與緩存2比較,比較結果在狀態寄存器第6位
Buf1Write = 0x84, //緩存1寫
Buf2Write = 0x87, //緩存2寫
Buf1ToPageWithErase = 0x83, //將緩存1寫入頁,包含頁擦除動作
Buf2ToPageWithErase = 0x86, //將緩存2寫入頁,包含頁擦除動作
Buf1ToPageWithoutErase = 0x88, //將緩存1寫入頁,不包含頁擦除動作
Buf2ToPageWithoutErase = 0x89, //將緩存2寫入頁,不包含頁擦除動作
PageWriteThroughBuf1 = 0x82, //數據先寫入緩存1,再寫入頁,包含頁擦
除
PageWriteThroughBuf2 = 0x85, //數據先寫入緩存2,再寫入頁,包含頁擦
除
PageRewriteThroughBuf1 = 0x58, //頁讀入緩存1,然后緩存1寫入頁
PageRewriteThroughBuf2 = 0x59, //頁讀入緩存2,然后緩存2寫入頁
StatusRead = 0x57 //讀狀態寄存器
} OpCode;
//文件分配表中頁標記含義
const WORD code csFree = 0x0000; //未用的頁
const WORD code csReserved = 0xfff0; //系統保留的頁
const WORD code csError = 0xfff7; //壞頁標記
const WORD code csFileEnd = 0xfff8; //文件中最后的頁
const WORD code csNextMin = 0x0003; //下一頁標記最小值
const WORD code csNextMax = 0xffef; //下一頁標記最大值
const WORD code csEnd = 0xffff; //文件分配表結束
const WORD code SysInfoPage = 0; //保存系統信息的頁
const WORD code DirStartPage = 2; //文件目錄區首頁
_ICSysInfo ICSysInfo;
/*------------------------------------------------------------------------------
*/
/* 供外部模塊調用函數
/*------------------------------------------------------------------------------
*/
uchar FileCreate(uchar *FileName);
uchar FileOpen(uchar *FileName);
void FileClose(uchar *Handle);
int FileRead(uchar Handle, uchar *Buffer, int Start, int Count);
int FileWrite(uchar Handle, char *Buffer, int Start, int Count);
uchar FileExists(uchar* FileName);
bit FileDelete(uchar* FileName);
bit ICFormat(); /*格式化IC卡,并清除全部數據*/
bit ICDeleteAll(); /*全部清除IC卡數據*/
DWORD ICFreeSize(); /*獲取可用空間,字節數*/
DWORD ICUsedSize(); /*獲取已使用空間,字節數*/
DWORD ICTotalSize(); /*獲取總空間,字節數*/
/*------------------------------------------------------------------------------
*/
/* 以下為內部函數,僅供模塊內部調用
/*------------------------------------------------------------------------------
*/
void ICReadDirInfo(uchar IndexOfDir, ICDirInfo *DirInfo); /*讀取目錄信息*/
bit ICWriteDirInfo(uchar IndexOfDir, ICDirInfo *DirInfo); /*寫入目錄信息*/
void ICReadSysInfo(_ICSysInfo *ICInfo, WORD SysPage); /*讀取IC卡系統信息*/
bit ICWriteSysInfo(_ICSysInfo *ICInfo, WORD SysPage); /*寫入IC卡系統信息*/
WORD ICReadPageSign(WORD Page);
/*讀頁標記*/
bit ICWritePageSign(WORD Page,WORD Sign); /*寫頁標記*/
WORD ICFirstFreePage();
/*從頭尋找第一個空閑的頁*/
WORD ICNextFreePage(WORD StartPage);
/*尋找下一個空閑的頁*/
uchar ICReadPageByte(WORD Page, WORD ByteAddr);
/*直接讀頁內容*/
uchar ICReadBuf1Byte(WORD ByteAddr);
/*讀緩存1字節*/
uchar ICReadBuf2Byte(WORD ByteAddr);
/*讀緩存2字節*/
void ICWriteBuf1Byte(WORD ByteAddr, uchar b);
/*寫緩存1字節*/
void ICWriteBuf2Byte(WORD ByteAddr, uchar b);
/*寫緩存2字節*/
bit ICBuf1CmpPage(WORD Page); /*比
較緩存1和頁內容*/
bit ICBuf2CmpPage(WORD Page); /*比
較緩存2和頁內容*/
void ICBuf1ToPage(WORD Page); /*緩
存1寫入頁*/
void ICBuf2ToPage(WORD Page); /*緩
存2寫入頁*/
void ICPageToBuf1(WORD Page); /*頁
內容至緩存1*/
void ICPageToBuf2(WORD Page); /*頁
內容至緩存2*/
// 根據根目錄項索引獲得頁面號及頁內字節地址
void ICDirIndexToPageByteAddr(uchar DirIndex, WORD *Page,WORD *ByteAddr);
bit ICWriteToPage(uchar *p, uchar Count, WORD Page, WORD ByteAddr);/* 將字符串
寫入頁*/
void ICWaitReady(); /*等
待IC卡準備好*/
uchar ICCommand(OpCode cmd, WORD Page,WORD ByteAddr); /* 所有命令的執行 */
uchar ICStatus(); /*讀
IC卡狀態*/
/*------------------------------------------------------------------------------
*/
/* 底層硬件操作函數
/*------------------------------------------------------------------------------
*/
sbit sCLK = P0^0;
sbit sDO = P0^1;
sbit sDI = P0^2;
sbit sCS = P0^3;
sbit a0 = ACC^0;
sbit a1 = ACC^1;
sbit a2 = ACC^2;
sbit a3 = ACC^3;
sbit a4 = ACC^4;
sbit a5 = ACC^5;
sbit a6 = ACC^6;
sbit a7 = ACC^7;
void ICWriteNextByte(uchar b); /*連續寫下一個字節*/
uchar ICReadNextByte(); /*連續讀下一個字節*/
void ICOutOpCode(OpCode cmd); /*發送命令字*/
void ICOutPage(WORD Page); /*發送頁面地址*/
void ICOutByteAddr(WORD ByteAddr); /*發送字節地址*/
void ICOutXBits(uchar N); /*發送N個任意字符*/
因為16k限制,以下為函數實現部分 [阿仙] [21次] 01-12-30 下午 04:31:22
http://www.xiao-qi.com/member/Ic.c
點擊這里回復這篇貼子>>
_____________________________________________________________________________
Copyright?,C51BBS論壇 2000-2002
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -