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