📄 main.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 + -