?? sysata.c
字號:
#include "config.h"
/*********************************************************************************************************
** 函數名稱: SYS_BusIni
** 功能描述: ATA總線初始化
** 輸 入: 無
** 輸 出: 出錯返回0
** 全局變量:
** 調用模塊:
********************************************************************************************************/
void SYS_BusIni(void)
{
// BCFG3 =0x1000ffef; // 配置Bank3為16位數據總線輸出
IO2DIR |= ATA_RST; // 配置復位引腳為輸出
IO2DIR &= (~ATA_CD); // 配置檢測卡引腳為輸入
}
/*********************************************************************************************************
** 函數名稱: SYS_WaitInUS
** 功能描述: 延時等級約1微秒函數,該函數根據系統時間不同與不同,但不應少到1微秒。
** 輸 入: times,延時時間等級
** 輸 出: 無
** 全局變量:
** 調用模塊:
********************************************************************************************************/
void SYS_WaitInUS(uint32 times)
{ uint32 c;
for(;0<times;times--)
for(c=0;c<4;c++);
}
/*********************************************************************************************************
** 函數名稱: ATA_HaveCard
** 功能描述: 判斷CF卡是否連接到,CF卡的CD1、CD2引腳與GND直接相接,可以通過該引腳判斷CF卡是否存在
** (對于IDE硬盤也有也多共地的引腳,也可以像CF卡那樣檢測但是這點ATA規范中并沒有說明)。
** 如果硬件上沒有相關的檢測,則應一直返回TRUE。
** 輸 入: 無
** 輸 出: TRUE,如果有設備存在,不管設備是主或是從,或可以返回TRUE(1);
** FALSE,如果設備不存在,即返回FALSE(0)
** 全局變量:
** 調用模塊:
********************************************************************************************************/
uint8 SYS_HaveCard(void)
{
#define DEVICE_IS_ATTACHED IO2PIN&ATA_CD /*硬件設備檢測,設備是否存在*/
if(DEVICE_IS_ATTACHED) /*如果DEVICE_IS_ATTACHED為0卻有設備存在,為1即沒有*/
return FALSE; /*DEVICE_IS_ATTACHED不為0,沒有設備存在,返回FALSE*/
else
return TRUE; /*DEVICE_IS_ATTACHED為0,有設備存在,返回TRUE*/
// 注意:如果只操作IDE硬盤,該函數無效,必須使該函數總返回TRUE。
}
/*
#ifndef UCOSII
#define NoInt 0x80
// 關中斷
__inline OS_ENTER_CRITICAL(void)
{
__asm
{
MRS R0, CPSR
ORR R0, R0, #NoInt
MSR CPSR_c, R0
}
}
// 開中斷
__inline OS_EXIT_CRITICAL(void)
{
__asm
{
MRS R0, CPSR
BIC R0, R0, #NoInt
MSR CPSR_c, R0
}
}
#endif
*/
/*********************************************************************************************************
** 函數名稱: SYS_PortIn
** 功能描述: 從ATA設備指定的寄存器中讀出一個字的數據,有些寄存器只有一個字節數有效。
** 輸 入: reg 寄存器名稱
** 輸 出: 讀出的數據
** 全局變量:
** 調用模塊:
********************************************************************************************************/
uint16 SYS_PortIn(uint32 reg)
{
uint16 res ;
// OS_ENTER_CRITICAL(); /*關中斷*/
*(uint16* )(ATA_EN|ATA_ALE|reg) = 0;
res = *(uint16* )(ATA_EN|ATA_RW) ;// 注意,這時不能對該BLANK進行操作
*(uint16* )(ATA_EN|ATA_ALE|ATA_OUT|ATA_CS1|ATA_CS0) = 0;
// OS_EXIT_CRITICAL(); /*開中斷*/
return res;
}
/*********************************************************************************************************
** 函數名稱: SYS_PortOut
** 功能描述: 向ATA設備指定的寄存器中寫入一個字的數據,有些寄存器只有一個字節數有效。
** 輸 入: reg 寄存器名稱
** 輸 出: 無
** 全局變量:
** 調用模塊:
********************************************************************************************************/
void SYS_PortOut(uint32 reg, uint16 data)
{
// OS_ENTER_CRITICAL(); /*關中斷*/
*(uint16* )(ATA_EN|ATA_ALE|ATA_OUT|reg) = 0;
*(uint16* )(ATA_EN|ATA_RW) = data;
*(uint16* )(ATA_EN|ATA_ALE|ATA_OUT|ATA_CS1|ATA_CS0) = 0;
// OS_EXIT_CRITICAL(); /*開中斷*/
}
/*********************************************************************************************************
** 函數名稱: SYS_IdeHardReset
** 功能描述: ATA設備硬件復位
** 輸 入: 無
** 輸 出: 無
** 全局變量:
** 調用模塊: SYS_WaitInUS(),等待微秒函數。
********************************************************************************************************/
void SYS_IdeHardReset(void)
{
IO2CLR = ATA_RST; /*復位引腳置低 */
SYS_WaitInUS(30); /*延時大于25微秒 */
IO2SET = ATA_RST; /*復位引腳置高 */
SYS_WaitInUS(5000); /*延時大于2毫秒,設備通常在480ms內完成硬件初始化和自診斷*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -