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

📄 main.c

📁 zlg 开发板 ucos 读写cf卡试验源代码
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"
#define  TASK_STK_SIZE                  64
OS_STK   TaskStartStk[TASK_STK_SIZE];

void  TaskStart(void *pdata);

/****************************************************************************
* 名称:ASCII_TO_HEX()
* 功能:ASCII转16进制数
****************************************************************************/
uint8 ASCII_TO_HEX(uint16 ASCII)
{	uint8 data;
	uint8  HEX;
	
	data=(uint8)ASCII;
	if(data>'9')
		data=data-'A' + 0x0a;
	else
		data=data-'0';
	HEX = data;
		
	data=(uint8)(ASCII>>8);
	if(data>'9')
		data=data-'A' + 0x0a;
	else
		data=data-'0';
	HEX |= data<<4; 
	
	return HEX;
}


/*********************************************************************************************************
** 函数名称: RetStateToPC
** 功能描述: 返回指令执行状态到PC机
** 输 入: 无
** 输 出: 无
** 全局变量: 无
********************************************************************************************************/
void RetStateToPC(uint8 RetData)
{
	uint8 RetData2PC[7]={'S','T','A','T','E',':','N'};	//初始化返回到PC的状态
	if(RetData)
	{
		RetData2PC[6]='Y';		//指令正常完成
	}

	UART0Write(RetData2PC,7);	// 写数据到PC
}



/*********************************************************************************************************
** 函数名称: SendDriveInfo
** 功能描述: 返回指令执行状态到PC机
** 输 入: DeviceInfo,描述信息数据结构指针
** 输 出: 无
** 全局变量: 无
********************************************************************************************************/
void SendDriveInfo(PCF_IDENTIFY_DATA DeviceInfo)
{
	UART0Write((uint8*)DeviceInfo->ModelNumber,40);//发送设备型号
	UART0Write((uint8*)DeviceInfo->SerialNumber,20);//发送设备序列号
	UART0Write((uint8*)&DeviceInfo->CurrentSectorCapacity,4); //发送设备总扇区数
}

/*********************************************************************************************************
** 函数名称: main
** 功能描述: c语言的主函数,由它启动多任务环境
** 输 入: 无
** 输 出: 无
** 全局变量: 无
********************************************************************************************************/
        int main (void)
{
    OSInit();

    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
    OSStart();
    return 0;
}

/*********************************************************************************************************
** 函数名称: TaskStart
** 功能描述: μCOS-II的第一个任务,通常由它初始化目标板和建立其它任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
********************************************************************************************************/
 uint8	DataBuff[0x1000];	//保存扇区数据缓冲区
        void  TaskStart(void *pdata)
{
	#define	DEVICE0 0
	uint16	SectorCount;	//扇区数
   	uint32	SectorNumber;	//扇区号
	uint32	ReceiveData;	//接收到数据的字节数
	uint16	i;				
	uint8 	RetData,buff[15];
	uint8	CommandCode;
    pdata = pdata;                                                  /* 避免编译警告 */
  
    TargetInit();                              /* 目标板初始化 */
    for (;;)
    {	    	
err:
        while ((UART0Getch() != 'Z'));
       	for(i=0;i<15;i++)buff[i]=UART0Getch();
       	if((buff[0]!='L')||(buff[1]!='G')||(buff[2]!=':'))	goto err;
		
		
		CommandCode =  (ASCII_TO_HEX(buff[3])<<4)|ASCII_TO_HEX(buff[4]); 		//指令代码
	
	   	SectorNumber = (ASCII_TO_HEX(buff[5])<<28)|(ASCII_TO_HEX(buff[6])<<24)|	//扇区号
      				   (ASCII_TO_HEX(buff[7])<<20)|(ASCII_TO_HEX(buff[8])<<16)|
      				   (ASCII_TO_HEX(buff[9])<<12)|(ASCII_TO_HEX(buff[10])<<8)|
      				   (ASCII_TO_HEX(buff[11])<<4)|ASCII_TO_HEX(buff[12]);
      
      	SectorCount =  (ASCII_TO_HEX(buff[13])<<4)|ASCII_TO_HEX(buff[14]);		// 扇区数
       	
       	switch(CommandCode)
        {
        	case 0xE0://立即待机
        		RetData = ATA_StandbyImmediate(DEVICE0);
        		break;
        		
        	case 0xE1://立即空闲
        		RetData = ATA_IdleImmediate(DEVICE0);
        		break;
        		
        	case 0x20://读扇区
        		RetData = ATA_ReadSector(DEVICE0,(uint16*)DataBuff,SectorNumber,SectorCount);//写CF卡或IDE硬盘数扇区数据
        		if(SectorCount==0)
        			SectorCount =256;	//如果扇区数为0,即操作256个扇区
        		ReceiveData = 512*SectorCount;		//传输总字节数
        		UART0Write(DataBuff,ReceiveData);	//传输数据到PC
        		break;
        		
        	case 0x30://写扇区
        		if(SectorCount==0)					//如果扇区号为0即写256个扇区
        			ReceiveData = 512*256;			//需要收到的数据字节总数
        		else
        			ReceiveData = 512*SectorCount;	//需要收到的数据字节总数
				OS_ENTER_CRITICAL();
        		for(i=0;i<ReceiveData;i++)
        		{
        			DataBuff[i]=UART0Getch();		//接收扇区数据
        		}	
				OS_EXIT_CRITICAL();
        		RetData = ATA_WriteSector(DEVICE0,(uint16*)DataBuff,SectorNumber,SectorCount);//写CF卡或IDE硬盘数扇区数据
        		break;
        		
        	case 0xEC://获取设备识别信息
        		RetData = ATA_IdentifyDrive(DEVICE0,DataBuff);	//获取设备识别信息
        		
        		if(RetData)
        			SendDriveInfo((PCF_IDENTIFY_DATA)DataBuff);		//传输数据到PC
        		break;
        		
        	default:
        		RetData = FALSE;
        		break;        
        }
         
        RetStateToPC(RetData);//向PC返回指令执行状态
    } 
}
   
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -