📄 sysata.c.svn-base
字号:
/****************************************Copyright (c)**************************************************
** 江苏高科电力自动化设备有限公司
** 开发部
**------------------------------------------------------------------------------------------------------
**--------------File Info-------------------------------------------------------------------------------
** File name: sysata.c
** Last modified Date: 2005-05-13
** Last Version: 1.0
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
/*********************************************************************************************************
** Function name: CF Card Init
**
** Descriptions: Initialize the CF Card
********************************************************************************************************/
void CFInit(void)
{
SYS_BusIni(); /*ATA总线初始化*/
ATA_INI(); /*ATA设备初始化*/
}
/*********************************************************************************************************
** 函数名称: SYS_BusIni
** 功能描述: ATA总线初始化
** 输 入: 无
** 输 出: 出错返回0
** 全局变量:
** 调用模块:
********************************************************************************************************/
void SYS_BusIni(void)
{
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 + -