⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysata.c

📁 ARM嵌入式系统软件开发实例(一) 里面含有很多UCOS教程和源码
💻 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 + -