?? cf_tureide.c
字號:
(U8)Sectors, /*SecNum,扇區號寄存器*/
(U8)(Sectors/0x100), /*CylLow,柱面低寄存器*/
(U8)(Sectors/0x10000), /*CylHigh,柱面高寄存器*/
(U8)(((Sectors/0x1000000)&0x0f)|ATA_DevReg), /*C_D_H,設備磁頭寄存器*/
(U8)IDE_CMD_READ /*Command,指令寄存器*/
);
}
/*********************************************************************************************************
** 函數名稱: ATA_ReadData512B
** 功能描述: 從硬盤讀出一個512B,在指定的緩沖區里
** 輸 入: Buffer,緩沖區地址
** 輸 出: 無
** 全局變量: 無
** 調用模塊: GetData(),從ATA數據寄存器讀取一個字節
********************************************************************************************************/
void ATA_ReadData512B(U16 * Buffer)
{ U16 i;
for(i = 0; i < 256; i ++) /*連續讀256個字(512字節)數據*/
{
*(Buffer ++) = GetData(); /*讀數據寄存器一個字數據*/
}
}
/*********************************************************************************************************
** 函數名稱: ATA_ReadSector 所在文件:IDE.C
** 功能描述: 從硬盤讀取一或多個扇區,放入到形參指定的內存中
** 輸 入: Device,設備號
** Buffer,讀出數據存放的緩沖區地址
** Sector,讀扇區號
** count, 讀扇區數
** 輸 出: TRUE,正常返回
** FALSE,出錯返回
** 全局變量: ATA,設備狀態及信息結構體
** 調用模塊: OSSemPend(),等待信號量
** ATA_SelDevice(),選擇設備
** ATA_ReadSetting(),讀扇區設置
** ATA_WaitOnBusyNDrq(),等待數據請求
** ATA_ReadData512B(),讀512字節數據
** ATA_WaitOnBusyNDrdy(),等待設備準備好
** OSSemPost(),發送信號量
********************************************************************************************************/
U8 ATA_ReadSector(U8 Device,U16 *Buffer,U32 Sector,U8 count)
{
U8 Status=FALSE;
if(ATA[Device].ATAIsOK==FALSE) /*設備不可用,立即返回*/
return FALSE; /*設備無效直接返回*/
if(ATA_SelectDevice(Device)) /*選擇主從設備*/
{
ATA_ReadSetting( Sector, count); /*讀扇區設置*/
do
{
count--; /*扇區數減1*/
if(ATA_WaitOnBusyNDrq()) /* 等待設備請求數據傳輸*/
{
ATA_ReadData512B( Buffer ); /*連續讀取一扇區的數據*/
Buffer +=256; /*調整數據格式*/
}
else
break; /*出錯,退出d0...while*/
}while(count>0); /*所有扇區數據傳輸完成*/
if(ATA_WaitOnBusyNDrdy()) /*等待設備就緒,讀取狀態寄存器同時檢測設備是否出錯*/
Status = TRUE; /*操作正確*/
}
return Status; /*返回*/
}
/*********************************************************************************************************
** 函數名稱: ATA_WriteSetting 所在文件:IDE.C
** 功能描述: 寫扇區指令設置相關的寄存器。
** 輸 入: Sectors,寫入的起始扇區號
** Count,扇區數
** 輸 出: 無
** 全局變量: ATA_DevReg,確定選擇的是主設備或是從設備和地址模式(本驅動使用LBA模式)
** 調用模塊: ATA_CommandSet(),寫命令設置
********************************************************************************************************/
void ATA_WriteSetting(U32 Sectors , U8 Count)
{
ATA_CommandSet( /*ATA指令設置*/
CF_NULL, /*Feature,特征寄存器*/
(U8)Count, /*SecCnt,扇區計數寄存器*/
(U8)Sectors, /*SecNum,扇區號寄存器*/
(U8)(Sectors/0x100), /*CylLow,柱面低寄存器*/
(U8)(Sectors/0x10000), /*CylHigh,柱面高寄存器*/
(U8)(((Sectors/0x1000000)&0x0f)|ATA_DevReg), /*C_D_H,設備磁頭寄存器*/
(U8)IDE_CMD_WRITE /*Command,指令寄存器*/
);
}
/*********************************************************************************************************
** 函數名稱: ATA_WriteData512B
** 功能描述: 寫入ATA設備512字節數據
** 輸 入: Buffer,緩沖區地址
** 輸 出: 無
** 全局變量: 無
** 調用模塊: SetData(),從ATA數據寄存器讀取一個字節
********************************************************************************************************/
void ATA_WriteData512B(U16 * Buffer)
{
U16 i;
for(i = 0; i < 256; i ++) /*連續寫256個字(512字節)數據*/
{
SetData(*(Buffer++)); /*寫數據寄存器一個字數據*/
}
}
/*********************************************************************************************************
** 函數名稱: WriteSector 所在文件:IDE.C
** 功能描述: 向硬盤寫入一或多個扇區
** 輸 入: Device,選擇主設備或從設備
** Buffer,緩沖區地址
** Sector,寫入扇區號
** count, 寫入扇區數
** 輸 出: TRUE,正常返回
** FALSE,出錯返回
** 全局變量: ATA,設備狀態及信息結構體
** 調用模塊: OSSemPend(),等待信號量
** ATA_SelDevice(),選擇設備
** ATA_ReadSetting(),讀扇區設置
** ATA_WaitOnBusyNDrq(),等待數據請求
** ATA_WriteData512B(),寫512字節數據
** ATA_WaitOnBusyNDrdy(),等待設備準備好
** OSSemPost(),發送信號量
********************************************************************************************************/
U8 ATA_WriteSector(U8 Device,U16 * Buffer, U32 Sector ,U8 count)
{
U8 Status=FALSE;
if(ATA[Device].ATAIsOK==FALSE) /*CF卡不可用,立即返回*/
return FALSE;
if(ATA_SelectDevice(Device)) /*選擇需要操作的設備*/
{
ATA_WriteSetting( Sector, count); /*寫扇區設置*/
do
{ count--;
if(ATA_WaitOnBusyNDrq()) /*等待設備請求數據傳輸*/
{
ATA_WriteData512B(Buffer); /*寫入一個扇區數據*/
Buffer +=256; /*調要寫入數據緩沖區的指針*/
}
else
break; /*出錯退出*/
}while(count>0);
if(ATA_WaitOnBusyNDrdy()) /*等待設備就緒,讀取狀態寄存器同時檢測設備是否出錯*/
Status = TRUE; /*操作正確*/
}
return Status; /*返回*/
}
/*********************************************************************************************************
** 函數名稱: ATA_IdleImmediate 所在文件:IDE.C
** 功能描述: 直接進入空閑狀態(硬件轉動)
** 輸 入: Device,選擇主設備或從設備
** 輸 出: TRUE,正常返回
** FALSE,出錯返回
** 全局變量: ATA,設備狀態及信息結構體
** CFIDESem,信號量
** ATA_DevReg,確定選擇的是主設備或是從設備和地址模式(本驅動使用LBA模式)
** 調用模塊: OSSemPend(),等待信號量
** ATA_SelDevice(),選擇設備
** ATA_CommandSet(),ATA指令設置
** ATA_WaitOnBusyNDrdy(),等待設備就緒
** OSSemPost(),發送信號量
********************************************************************************************************/
U8 ATA_IdleImmediate(U8 Device)
{
U8 retStatus = FALSE;
if(ATA[Device].ATAIsOK==FALSE) /*CF卡不可用,立即返回*/
return FALSE;
if(ATA_SelectDevice(Device)) /*選擇設備*/
{
ATA_CommandSet( /*ATA指令設置*/
CF_NULL, /*Feature,特征寄存器*/
CF_NULL, /*SecCnt,扇區計數寄存器*/
CF_NULL, /*SecNum,扇區號寄存器*/
CF_NULL, /*CylLow,柱面低寄存器*/
CF_NULL, /*CylHigh,柱面高寄存器*/
ATA_DevReg, /*C_D_H,設備磁頭寄存器*/
IDE_CMD_IDLE_IMMEDIATE /*Command,指令寄存器*/
);
retStatus =ATA_WaitOnBusyNDrdy(); /*指令執行后狀態*/
}
return retStatus; /*返回*/
}
/*********************************************************************************************************
** 函數名稱: ATA_StandbyImmediate 所在文件:IDE.C
** 功能描述: 立即進入空閑(硬盤停轉)
** 輸 入: Device,主設備或從設備
** 輸 出: TRUE,正常返回
** FALSE,出錯返回
** 全局變量: ATA,設備狀態及信息結構體
** CFIDESem,信號量
** ATA_DevReg,確定選擇的是主設備或是從設備和地址模式(本驅動使用LBA模式)
** 調用模塊: OSSemPend(),等待信號量
** ATA_SelDevice(),選擇設備
** ATA_CommandSet(),ATA指令設置
** ATA_WaitOnBusyNDrdy(),等待設備就緒
** OSSemPost(),發送信號量
********************************************************************************************************/
U8 ATA_StandbyImmediate(U8 Device)
{
U8 retStatus = FALSE;
if(ATA[Device].ATAIsOK==FALSE) /*CF卡不可用,立即返回*/
return FALSE;
if(ATA_SelectDevice(Device)) /*選擇設備*/
{
ATA_CommandSet( /*ATA指令設置*/
CF_NULL, /*Feature,特征寄存器*/
CF_NULL, /*SecCnt,扇區計數寄存器*/
CF_NULL, /*SecNum,扇區號寄存器*/
CF_NULL, /*CylLow,柱面低寄存器*/
CF_NULL, /*CylHigh,柱面高寄存器*/
ATA_DevReg, /*C_D_H,設備磁頭寄存器*/
IDE_CMD_STANDBY_IMMEDIATE /*Command,指令寄存器*/
);
retStatus =ATA_WaitOnBusyNDrdy(); /*等待設備不忙*/
}
return retStatus; /*返回*/
}
/*********************************************************************************************************
** 函數名稱: CF_Card_Test
** 功能描述: CF_Card_Test
********************************************************************************************************/
#define TEST_SECTOR_NUMBER 0x1000
void CF_Card_Test( void )
{
U32 m,n ;
U16 data[512] ;
SYS_BusIni(); //ATA總線初始化
ATA_INI(); //CF驅動初始化
if( ATA[THIS_DEVICE].ATAIsOK == TRUE )
printf( "CF卡檢測成功!\n" );
else
{
printf( "CF卡檢測失敗!\n" );
printf( "設備出錯代碼 = 0x%x\n", ATA[THIS_DEVICE].ERRCODE ) ; //
printf( "讀寫出錯的扇區號 = 0x%x\n", ATA[THIS_DEVICE].ERRSECTOR ) ; //
return ;
}
printf( "柱面數 = 0x%x\n", ATA[THIS_DEVICE].INFODATA.NumberOfCylinders ) ; //
printf( "磁頭數 = 0x%x\n", ATA[THIS_DEVICE].INFODATA.NumberOfHeads ) ; //
printf( "每磁道扇區數 = 0x%x\n", ATA[THIS_DEVICE].INFODATA.SectorsPerTrack ) ; //
printf( "當前扇區容量 = 0x%x\n", ATA[THIS_DEVICE].INFODATA.CurrentSectorCapacity ) ; //
//給要寫入CF卡的數組賦值
for( m = 0 ; m < 512 ; m++ ) data[m] = m ;
printf("write data : \n");
for( m = 0; m < 8; m++ )
{
for( n = 0; n < 7; n++ )
printf( "%03x ", data[m*7+n] ) ;
printf("\n");
}
printf("\nCF Card Write Sector Test\n\n" );
ATA_WriteSector( THIS_DEVICE, data, TEST_SECTOR_NUMBER, 2 ) ;
//在讀出CF卡之前,先將數組清零
for( m = 0 ; m < 512 ; m++ ) data[m] = 0 ;
printf("\nCF Card Read Sector Test\n\n" );
ATA_ReadSector( THIS_DEVICE, data, TEST_SECTOR_NUMBER, 2 ) ;
for( m = 0; m < 8; m++ )
{
for( n = 0; n < 7; n++ )
printf( "%03x ", data[m*7+n] ) ;
printf("\n");
}
for( m = 0 ; m < 512 ; m++ )
{
if( data[m] != m )
break ;
}
if( m == 512 ) printf("\n讀出的數據與寫入的數據完全相符!\n");
else printf("\n讀出的數據與寫入的數據在地址0x%04處不符! \n", m );
printf("\nPress ESC key to exit\n");
while( getkey() != ESC_KEY ) ;
}
static char title[] = "CF卡實驗";
static char tip[] = "探測CF卡獲取相關信息,并實驗扇區讀寫,按ESC鍵退出";
//Test_StepMotorItem在prog_entry.c里被引用
TEST_PROGRAM_ITEM Test_CF_CardItem = {
(TEST_PROGRAM)CF_Card_Test, //入口地址
title, //顯示名稱
tip, //幫助或提示信息,可為NULL
1}; //使用printf,puts,putch等函數時在LCD上也顯示輸出字符(串)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -