📄 sysata.c
字号:
/****************************************Copyright (c)**************************************************
** 广州周立功单片机发展有限公司
** 研 究 所
** 产品一部
**
** http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: IDE.c
**创 建 人: 周立山
**最后修改日期:
**描 述: 与ZLG/CF驱动的接口函数。
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 周立山
** 版 本: v1.0
** 日 期:
** 描 述: 完整版
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
/*********************************************************************************************************
** 函数名称: SYS_BusIni
** 功能描述: ATA总线初始化
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
void SYS_BusIni(void)
{
PINSEL1 &= 0xffffc003; /*使用到的P0口GPIO引脚设置*/
PINSEL2 = (PINSEL2 & 0x0f8cf9c0) | 0x00000014; /*使用到的P1及P2口GPIO引脚设置*/
IO0DIR &= (~(IDE_DMAREQ + IDE_INTRQ)); /*P0相关输入引脚初始化*/
IO0DIR |= (IDE_RST + IDE_WR + IDE_RD); /*P0相关输出引脚初始化*/
IO1DIR &= (~(IDE_DMACK + IDE_IOCS16 + IDE_PDIAG)); /*P1相关输入引脚初始化*/
IO1DIR |= (IDE_A0 + IDE_A1 +IDE_A2 + IDE_CS0 + IDE_CS1 + IDE_CSEL); /*P1相关输出引脚初始化*/
IO2DIR &= (~ATA_DATA); /*数据总线初始化为输入*/
IO0SET = IDE_RST + IDE_WR + IDE_RD; /*CF卡复位引脚及读写信号引脚初始输出高电平*/
IO1SET = IDE_CS0 + IDE_CS1; /*CF卡片选初始化输入高电平*/
IO1CLR = IDE_A0 + IDE_A1 +IDE_A2 + IDE_CSEL; /*地址初始化,并设置当前CF卡为主盘*/
}
/*********************************************************************************************************
** 函数名称: 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 0 /*硬件设备(EasyARM2200开发板)没有检测,设备是否存在*/
/*假设使用LPC2210的P1.23(有10K的电上电阻)引脚的GPIO输入方式检测设备是否存在,可以如下操作*/
//#define DEVICE_IS_ATTACHED (IO1PIN & (1<<23))
if(DEVICE_IS_ATTACHED) /*如果DEVICE_IS_ATTACHED为0却有设备存在,为1即没有*/
return FALSE; /*DEVICE_IS_ATTACHED不为0,没有设备存在,返回FALSE*/
else
return TRUE; /*DEVICE_IS_ATTACHED为0,有设备存在,返回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 寄存器名称
** 输 出: 读出的数据
** 全局变量: 无
** 调用模块: OS_ENTER_CRITICAL(),关中断
** OS_EXIT_CRITICAL(),清中断
********************************************************************************************************/
#ifdef ATA_BUS_AT_8bit
uint16 SYS_PortIn(uint32 reg)
{
uint16 res ;
OS_ENTER_CRITICAL(); /*关中断*/
IO2DIR = IO2DIR & MASK_DATA; /*定义输出口其它为输入(ATA_DATA为输入)*/
IO1CLR = Addr_CS_at_P1; /*地址与片选信号都为低电平*/
IO1SET = reg; /*地址高电平位输出,完成地址的设置*/
/*读低字节*/
IO0CLR = IDE_RD; /*读信号脚置低*/
res = (uint8)((IO2PIN&ATA_DATA) >>16); /*读取数据*/
IO0SET = IDE_RD; /*使读信号为高*/
/*读高字节*/
if(reg==ATA_REG_DATA) /*如果读数据寄存器,读高字节*/
{
IO0CLR = IDE_RD; /*读信号脚置低*/
res += (uint16)((IO2PIN&ATA_DATA)>>8); /*读取数据*/
IO0SET = IDE_RD; /*使读信号为高*/
}
IO1SET = Addr_CS_at_P1; /*输出控制信号置高*/
OS_EXIT_CRITICAL(); /*开中断*/
return res; /*返回数值*/
}
#else
uint16 SYS_PortIn(uint32 reg)
{
uint16 res ;
OS_ENTER_CRITICAL(); /*关中断*/
IO2DIR = IO2DIR & MASK_DATA; /*定义输出口其它为输入(ATA_DATA为输入)*/
IO1CLR = Addr_CS_at_P1; /*控所硬盘引脚信号输出(输出高电平)*/
IO1SET = reg; /*控所硬盘引脚信号输出(输出低电平)*/
IO0CLR = IDE_RD; /*读信号脚置低*/
res = (uint16)(IO2PIN >>16); /*读取数据*/
IO0SET = IDE_RD;
IO1SET = Addr_CS_at_P1; /*输出控制信号置高*/
OS_EXIT_CRITICAL(); /*开中断*/
return res;
}
#endif
/*********************************************************************************************************
** 函数名称: SYS_PortIn
** 功能描述: 向ATA设备指定的寄存器中写入一个字的数据,有些寄存器只有一个字节数有效。
** 输 入: reg 寄存器名称
** 输 出: 无
** 全局变量: 无
** 调用模块: OS_ENTER_CRITICAL(),关中断
** OS_EXIT_CRITICAL(),清中断
********************************************************************************************************/
#ifdef ATA_BUS_AT_8bit
void SYS_PortOut(uint32 reg, uint16 data)
{
OS_ENTER_CRITICAL(); /*关中断*/
IO2DIR = IO2DIR | ATA_DATA; /*设置数据总线为输出*/
IO1CLR = Addr_CS_at_P1; /*地址与片选信号都为低电平*/
IO1SET = reg; /*地址高电平位输出,完成地址的设置*/
/*写低字节*/
IO2CLR = ATA_DATA; /*数据总线上输出全为低电平*/
IO2SET = data<<16; /*输出数据高位*/
IO0CLR = IDE_WR; /*写信号为低电平,保持大于165nS*/
IO0SET = IDE_WR; /*写信号脚置高[与低>162ns]*/
if(reg==ATA_REG_DATA) /*如果访问的寄存器为16位的数据寄存器*/
{ /*写高字节*/
IO2CLR = ATA_DATA; /*数据线输出全为低电平*/
IO2SET = data<<8; /*输出高电平的数据位*/
IO0CLR = IDE_WR; /*写信号为低电平,保持大于165nS*/
IO0SET = IDE_WR; /*写信号脚置高[与低>162ns]*/
}
IO1SET = Addr_CS_at_P1; /*输出控制信号置高*/
IO2DIR &= MASK_DATA; /*使数据线为输入,降低功耗*/
OS_EXIT_CRITICAL(); /*开中断*/
}
#else
void SYS_PortOut(uint32 reg, uint16 data)
{
OS_ENTER_CRITICAL(); /*关中断*/
IO2DIR = IO2DIR | ATA_DATA; /*设置数据总线为输出*/
IO1CLR = Addr_CS_at_P1; /*地址与片选信号都为低电平*/
IO1SET = reg; /*地址高电平位输出,完成地址的设置*/
IO2CLR = ATA_DATA; /*数据总线上输出全为低电平*/
IO2SET = data<<16; /*输出数据高位*/
IO0CLR = IDE_WR; /*写信号为低电平,保持大于165nS*/
IO0SET = IDE_WR; /*写信号脚置高[与低>162ns]*/
IO1SET = Addr_CS_at_P1; /*输出控制信号置高*/
IO2DIR &= MASK_DATA; /*使数据线为输入,降低功耗*/
OS_EXIT_CRITICAL(); /*开中断*/
}
#endif
/*********************************************************************************************************
** 函数名称: SYS_IdeHardReset
** 功能描述: ATA设备硬件复位
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: SYS_WaitInUS(),等待微秒函数。
********************************************************************************************************/
void SYS_IdeHardReset(void)
{
IOCLR = IDE_RST; /*复位引脚置低 */
SYS_WaitInUS(30); /*延时大于25微秒 */
IOSET = IDE_RST; /*复位引脚置高 */
SYS_WaitInUS(5000); /*延时大于2毫秒,设备通常在480ms内完成硬件初始化和自诊断*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -