?? main.c
字號(hào):
#include <iom8v.h>
#include <macros.h>
#define PB375_VER 0x30 /* 當(dāng)前模塊版本 */
/* ********************************************************************************************************************* */
/* 返回的操作狀態(tài)碼 */
/* 以下是事件通知狀態(tài)碼,檢測(cè)到當(dāng)前U盤已經(jīng)連接或者已經(jīng)斷開,可以作為最終狀態(tài)碼 */
#define ERR_USB_CONNECT 0x15 /* 檢測(cè)到USB設(shè)備連接事件,磁盤已經(jīng)連接 */
#define ERR_DISK_DISCON 0x82 /* 檢測(cè)到USB設(shè)備連接事件,磁盤已經(jīng)斷開,或者磁盤尚未連接 */
/* 代碼0XH用于USB設(shè)備方式的操作狀態(tài)代碼,由PB375返回,是USB設(shè)備模式的中斷狀態(tài) */
#define ERR_USB_DAT_DOWN 0x02 /* USB設(shè)備模式: 數(shù)據(jù)下傳成功,上位機(jī)下傳的數(shù)據(jù)已經(jīng)在模塊中 */
#define ERR_USB_DAT_UP 0x0A /* USB設(shè)備模式: 數(shù)據(jù)上傳成功,模塊中的上傳數(shù)據(jù)已經(jīng)被上位機(jī)取走 */
/* 最終狀態(tài)碼 */
#define ERR_SUCCESS 0x00 /* 操作成功 */
#define ERR_PB375_ERROR 0x81 /* PB375硬件錯(cuò)誤,可能需要復(fù)位PB375 */
#define ERR_STATUS_ERR 0x83 /* 磁盤狀態(tài)錯(cuò)誤,可能正在連接或者斷開磁盤 */
#define ERR_MBR_ERROR 0x91 /* 磁盤的主引導(dǎo)記錄無(wú)效,可能磁盤尚未分區(qū)或者尚未格式化 */
#define ERR_TYPE_ERROR 0x92 /* 磁盤分區(qū)類型不支持,只支持FAT12/FAT16/BigDOS/FAT32,需要由磁盤管理工具重新分區(qū) */
#define ERR_BPB_ERROR 0xA1 /* 磁盤尚未格式化,或者參數(shù)錯(cuò)誤,需要由WINDOWS采用默認(rèn)參數(shù)重新格式化 */
#define ERR_TOO_LARGE 0xA2 /* 磁盤非正常格式化并且容量大于4GB,或者容量大于250GB,需要由WINDOWS采用默認(rèn)參數(shù)重新格式化 */
#define ERR_FAT_ERROR 0xA3 /* 磁盤的文件系統(tǒng)不支持,只支持FAT12/FAT16/FAT32,需要由WINDOWS采用默認(rèn)參數(shù)重新格式化 */
#define ERR_DISK_FULL 0xB1 /* 磁盤文件太滿,剩余空間太少或者已經(jīng)沒有,需要磁盤整理 */
#define ERR_FDT_OVER 0xB2 /* 目錄內(nèi)文件太多,沒有空閑的目錄項(xiàng),FAT12/FAT16根目錄下的文件數(shù)應(yīng)該少于500個(gè),需要磁盤整理 */
#define ERR_MISS_DIR 0xB3 /* 指定路徑的某個(gè)子目錄沒有找到,可能是目錄名稱錯(cuò)誤 */
#define ERR_FILE_CLOSE 0xB4 /* 文件已經(jīng)關(guān)閉,如果需要使用,應(yīng)該重新打開文件 */
#define ERR_OPEN_DIR 0x41 /* 指定路徑的目錄被打開 */
#define ERR_MISS_FILE 0x42 /* 指定路徑的文件沒有找到,可能是文件名稱錯(cuò)誤 */
#define ERR_FOUND_NAME 0x43 /* 搜索到與通配符相匹配的文件名,文件名及其完整路徑在命令緩沖區(qū)中,如果需要使用,應(yīng)該打開該文件 */
#define ERR_USB_DISK_ERR 0x1F /* USB存儲(chǔ)器操作失敗,在初始化時(shí)可能是USB存儲(chǔ)器不支持,在讀寫操作中可能是磁盤損壞或者已經(jīng)斷開 */
/* 其余錯(cuò)誤代碼未定義,可以發(fā)出命令CMD_QueryStatus查詢模塊狀態(tài)并分析 */
/* ********************************************************************************************************************* */
/* 磁盤及文件狀態(tài),適用于CMD_PARAM.Status.mDiskStatus */
#define DISK_UNKNOWN 0x00 /* 尚未初始化,未知狀態(tài) */
#define DISK_DISCONNECT 0x01 /* 磁盤沒有連接或者已經(jīng)斷開 */
#define DISK_CONNECT 0x02 /* 磁盤已經(jīng)連接,但是尚未初始化或者無(wú)法識(shí)別該磁盤 */
#define DISK_MOUNTED 0x03 /* 磁盤已經(jīng)初始化成功,但是尚未分析文件系統(tǒng)或者文件系統(tǒng)不支持 */
#define DISK_READY 0x10 /* 已經(jīng)分析磁盤的文件系統(tǒng)并且能夠支持 */
#define DISK_OPEN_ROOT 0x12 /* 已經(jīng)打開根目錄,扇區(qū)模式,只能以扇區(qū)為單位讀寫目錄的內(nèi)容,使用后必須關(guān)閉,注意FAT12/FAT16根目錄是固定長(zhǎng)度 */
#define DISK_OPEN_DIR 0x13 /* 已經(jīng)打開子目錄,扇區(qū)模式,只能以扇區(qū)為單位讀寫目錄的內(nèi)容 */
#define DISK_OPEN_FILE 0x14 /* 已經(jīng)打開文件,扇區(qū)模式,可以以扇區(qū)為單位進(jìn)行數(shù)據(jù)讀寫 */
#define DISK_OPEN_FILE_B 0x15 /* 已經(jīng)打開文件,字節(jié)模式,可以以字節(jié)為單位進(jìn)行數(shù)據(jù)讀寫 */
/* 外部命令碼 */
#define CMD_DiskQuery 0x61 /* 查詢磁盤信息 */
#define CMD_FileOpen 0x64 /* 打開文件 */
#define CMD_FileCreate 0x65 /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */
#define CMD_FileErase 0x66 /* 刪除文件并關(guān)閉 */
#define CMD_FileClose 0x67 /* 關(guān)閉當(dāng)前文件 */
#define CMD_ByteLocate 0x7A /* 以字節(jié)為單位移動(dòng)當(dāng)前文件指針 */
#define CMD_ByteRead 0x7B /* 以字節(jié)為單位從當(dāng)前文件讀取數(shù)據(jù)塊 */
#define CMD_ByteWrite 0x7C /* 以字節(jié)為單位向當(dāng)前文件寫入數(shù)據(jù)塊 */
#define CMD_DiskReady 0x71 /* 查詢磁盤是否準(zhǔn)備好 */
#define CMD_RESET 0x7D /*復(fù)位*/
/*
CS------PC0
SCK-----PC1
SDI-----PC3
SDO-----PC2
*/
#define PB375_CS_SET PORTC |= (1<<PC0)
#define PB375_CS_CLR PORTC &= ~ (1<<PC0)
#define PB375_SCK_SET PORTC |= (1<<PC1)
#define PB375_SCK_CLR PORTC &= ~(1<<PC1)
#define PB375_SDI_SET PORTC |= (1<<PC2)
#define PB375_SDI_CLR PORTC &= ~(1<<PC2)
#define PB375_SDO (PINC &(1<<PC3))
#define MAXBUFLEN 128
//發(fā)送緩沖區(qū)
unsigned char sendBuff[MAXBUFLEN];
//接收緩沖區(qū)
unsigned char recBuff[MAXBUFLEN];
//初始化IO口 設(shè)置CS SCK SDI 為輸出 SDO為輸入
void initPort()
{
PORTC |= 0x07;
DDRC |= 0x07;
DDRC &= 0xF7;
}
/* 以毫秒為單位延時(shí),適用于24MHz時(shí)鐘 */
void mDelaymS( unsigned char delay )
{
unsigned char i, j, c;
for ( i = delay; i != 0; i -- )
{
for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz時(shí)鐘下延時(shí)500uS */
for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz時(shí)鐘下延時(shí)500uS */
}
}
/* 發(fā)送一個(gè)字節(jié)數(shù)據(jù)給PB375模塊,同時(shí)接收一個(gè)字節(jié),以SPI模式0方式(SPI_SCK默認(rèn)為0) */
unsigned char mSpiExchange( unsigned char c )
{
unsigned char i, d;
d = 0;
PB375_SCK_CLR;
for ( i = 8; i != 0; i -- ) { /* 8個(gè)位 */
if ( c & 0x80 )
PB375_SDI_SET; /* 向模塊的SDI輸入引腳輸出數(shù)據(jù) */
else
PB375_SDI_CLR;
d <<= 1;
if ( PB375_SDO )
d++; /* 如果模塊的SDO輸出引腳為高電平則輸入位1 PB375_SDO */
mDelaymS(1);
PB375_SCK_SET; /* SPI時(shí)鐘上升沿,模塊接收數(shù)據(jù)并輸出數(shù)據(jù) */
c <<= 1;
mDelaymS(1);
PB375_SCK_CLR;
}
return( d );
}
/* 執(zhí)行命令 */
unsigned char ExecCommand( unsigned char cmd, unsigned char len )
{
unsigned char i, j, status;
PB375_CS_CLR; /* 產(chǎn)生SPI片選 */
mSpiExchange( cmd ); /* 寫入命令碼 */
mSpiExchange( len ); /* 寫入后續(xù)參數(shù)的長(zhǎng)度 */
if ( len ) { /* 有參數(shù) */
for ( i = 0; i != len; i ++ ) mSpiExchange( sendBuff[ i ] ); /* 依次寫入?yún)?shù) */
}
PB375_CS_SET; /* 結(jié)束SPI片選 */
while ( 1 ) { /* 處理數(shù)據(jù)傳輸,直到操作完成才退出 */
PB375_CS_CLR; /* 產(chǎn)生SPI片選 */
status = mSpiExchange( 0xFF ); /* 寫入0xFF作為無(wú)效命令碼(不應(yīng)該寫其它值),返回模塊操作狀態(tài) */
if ( status == 0xFF ) { /* 模塊操作尚未完成,也就是INT#沒有中斷產(chǎn)生 */
PB375_CS_SET; /* 結(jié)束SPI片選 */
mDelaymS( 1 );
continue; /* 繼續(xù)等待模塊完成操作 */
}
if ( status == ERR_SUCCESS ) /* 操作成功 */
{
i = mSpiExchange( 0 ); /* 返回結(jié)果數(shù)據(jù)的長(zhǎng)度,寫入0沒有意義,可以是任何值 */
if ( i ) { /* 有結(jié)果數(shù)據(jù) */
j = 0;
do { /* 使用do+while結(jié)構(gòu)是因?yàn)槠湫矢哂趂or */
recBuff[ j ] = mSpiExchange( 0 ); /* 接收結(jié)果數(shù)據(jù)并保存到參數(shù)結(jié)構(gòu)中,寫入0沒有意義 */
j ++;
} while ( -- i );
}
PB375_CS_SET; /* 結(jié)束SPI片選 */
break; /* 操作成功返回 */
}
else /* 操作失敗 */
{
PB375_CS_SET; /* 結(jié)束SPI片選 */
if ( status == ERR_DISK_DISCON || status == ERR_USB_CONNECT ) mDelaymS( 100 ); /* U盤剛剛連接或者斷開,應(yīng)該延時(shí)幾十毫秒再操作 */
break; /* 操作失敗返回 */
}
PB375_CS_SET; /* 結(jié)束SPI片選 */
}
return( status );
}
/*
主程序
*/
void main( )
{
unsigned char i;
initPort();
mDelaymS( 500 ); /* 延時(shí)500毫秒,PB375模塊上電后需要500毫秒左右的復(fù)位時(shí)間 */
for ( i = 0; i < 5; i ++ )
{
mDelaymS( 100 );
if ( ExecCommand( CMD_DiskReady, 0 ) == ERR_SUCCESS )
break; /* 查詢磁盤是否準(zhǔn)備好 */
}
//寫入數(shù)據(jù)到文件
/*
sendBuff[0] = 92;
sendBuff[1] = 0x52;
sendBuff[2] = 0x41;
sendBuff[3] = 0x42;
sendBuff[4] = 0x43;
sendBuff[5] = 0x35;
sendBuff[6] = 0x36;
sendBuff[7] = 0x4C;
sendBuff[8] = 0x2e;
sendBuff[9] = 0x54;
sendBuff[10] = 0x58;
sendBuff[11] = 0x54;
sendBuff[12] = 0;
sendBuff[0] = 92;
sendBuff[1] = 0x42;
sendBuff[2] = 0x4F;
sendBuff[3] = 0x44;
sendBuff[4] = 0x59;
sendBuff[5] = 0x44;
//sendBuff[6] = 0x41;
//sendBuff[7] = 0x54;
//sendBuff[8] = 0x41;
sendBuff[6] = 0x2E;
sendBuff[7] = 0x54;
sendBuff[8] = 0x58;
sendBuff[9] = 0x54;
sendBuff[10] = 0;
*/
sendBuff[0] = 92;
strcpy(sendBuff+1,"BLUEFIVE.TXT");
if ( ExecCommand( CMD_FileOpen, 14 ) == ERR_SUCCESS )
{
//加一個(gè)字節(jié)定位
sendBuff[0] = 0x00;
sendBuff[1] = 0X00;
sendBuff[2] = 0X00;
sendBuff[3] = 0X05;
if ( ExecCommand( CMD_ByteLocate, 4 ) == ERR_SUCCESS )
{
sendBuff[0] = 10;//寫入文件字節(jié)大小
strcpy(sendBuff+1,"11111111111111111111");
if ( ExecCommand( CMD_ByteWrite, 21 ) == ERR_SUCCESS )
ExecCommand( CMD_FileClose, 1 );
}
}
else
{
//操作失敗
}
while ( 1 )
{
/* 主循環(huán) */
mDelaymS( 100 );
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -