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

📄 sysata.c

📁 周立功easyarm2200平台第5章试验代码
💻 C
字号:
#include "config.h"


/*********************************************************************************************************
** 函数名称: SYS_BusIni
** 功能描述: ATA总线初始化
** 输   入: 无
** 输   出: 出错返回0
** 全局变量:  
** 调用模块: 
********************************************************************************************************/
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*/
}



#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
	}	    
}


/*********************************************************************************************************
** 函数名称: SYS_PortIn
** 功能描述: 从ATA设备指定的寄存器中读出一个字的数据,有些寄存器只有一个字节数有效。
** 输   入: reg 寄存器名称
** 输   出: 读出的数据
** 全局变量:
** 调用模块: 
********************************************************************************************************/
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;
}


/*********************************************************************************************************
** 函数名称: SYS_PortOut
** 功能描述: 向ATA设备指定的寄存器中写入一个字的数据,有些寄存器只有一个字节数有效。
** 输   入: reg 寄存器名称
** 输   出: 无
** 全局变量:
** 调用模块: 
********************************************************************************************************/
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();						/*开中断*/
}



/*********************************************************************************************************
** 函数名称: 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 + -