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

📄 command_unit.c

📁 USBUSB开发资料类
💻 C
📖 第 1 页 / 共 2 页
字号:
//============================================================================================================
//
//
//	本单元的功能描述:
//
//			实现的功能。
//
//
//	输出函数列表:
//			CMD_IdleSetEvent		被	Idle	任务调用,用于当接收到数据时把Command任务从睡眠中唤醒。
//
//===========================================================================================================
//	日期	|	动作	|   	单位       	|	描述	  |联系方式
//===========================================================================================================
//2008-07-28|	创建 	|	 西安达泰电子  	|	创建文件  |029-85272421  http://www.dataie.com
//============================================================================================================

//============================================================================================================
//		引入头文件
//============================================================================================================
#include	"Config.h"
#include	"ClockUnit.h"
#include	"SPI_Unit.h"
#include	"Command_Unit.h"


//============================================================================================================
//定义一些内部的全局变量
volatile	TCMD_CommandBlock	vCMD_CmdStaBuffer;
PCMD_CommandBlock	vCMD_pCommand;
PCMD_StatusBlock	vCMD_pStatus;
//============================================================================================================



//============================================================================================================
//************************************************************************************************************
//*
//*
//*			开始定义	内部函数	函数。
//*
//*
//************************************************************************************************************
//============================================================================================================
//函数名:		CMD_Init
//
//调用关系:	被	Command_Task	函数调用。
//
//功能描述:	初始化本单元。
//
//出口参数:	WriteBuffer		上层程序可用的写文件缓冲区。
//				ReadBuffer		上层程序可用的读文件缓冲区。
//
//返回值:		无。
//============================================================================================================
void	CMD_Init(DWORD*	WriteBuffer,	DWORD*	ReadBuffer)
{
	//根据设置,初始化通讯模块	Mem_AllocateUSBRAM
	SPI_Init();

	vCMD_pCommand	=	(PCMD_CommandBlock)&vCMD_CmdStaBuffer;
	vCMD_pStatus	=	(PCMD_StatusBlock)&vCMD_CmdStaBuffer;

	*WriteBuffer	=	(DWORD)&(vCMD_pCommand->Data[0]);
	*ReadBuffer		=	(DWORD)&(vCMD_pStatus->Data[0]);
}
//============================================================================================================
//函数名:		CMD_DoCommand
//
//调用关系:	被	具体的Command	函数调用。
//
//功能描述:	执行一次命令。
//
//入口参数:	无。
//
//返回值:		是否成功。
//============================================================================================================
BOOL	CMD_DoCommand(DWORD	CommandDataLength,	DWORD	ResDataLength,	DWORD	ResponseCode)
{
	WORD	LastCounter,	ThisCounter;

	vCMD_pCommand->Signature	=	cCMD_Signature;

	//首先,发送命令
	if	(!SPI_Send(vCMD_pCommand,	CommandDataLength))
		return	FALSE;
 	
	//等待命令发送完。
	while	(!SPI_CanSendNextPacket())
	{}

	//然后,启动接收应答的过程
	SPI_StartRead(vCMD_pStatus,	ResDataLength,	ResponseCode);

	//等待接受应答数据成功
	LastCounter	=	0;
	CLK_SetupTimer(cCLK_TimerCommand,	5000,	NULL);
	while	(1)
	{
		ThisCounter	=	SPI_GetReadCounter();
		if	(ThisCounter	>	LastCounter)
		{
			LastCounter	=	ThisCounter;
			CLK_SetupTimer(cCLK_TimerCommand,	500,	NULL);
			//如果读到的数据大于等于需要的应答数据长度,则说明应答成功
			if	(ThisCounter	>=	ResDataLength)
				return	TRUE;
		}
		else
			if	(CLK_OnTimer(cCLK_TimerCommand))
			{
				return	FALSE;
			}
	}
}
//============================================================================================================
//函数名:		CMD_WriteFile
//
//调用关系:	被	外部函数	调用。
//
//功能描述:	写文件。
//
//入口参数:	DataLength	要写的数据长度
//
//返回值:		是否写成功。
//============================================================================================================
BOOL	CMD_WriteFile(	DWORD	DataLength	)
{
	vCMD_pCommand->Parameter[1]	=	DataLength;
	vCMD_pCommand->Parameter[2]	=	DataLength>>8;

	vCMD_pCommand->Command	=	cCMD_CMD_WRITE_FILE;

	if	(!CMD_DoCommand(66+	DataLength,	64,	cCMD_CMD_WRITE_FILE_RSP))
	{	return	FALSE;	}
	else
	{
		return	((vCMD_pStatus->Command	==	cCMD_CMD_WRITE_FILE_RSP)	&&	(vCMD_pStatus->Result));
	}
}
//============================================================================================================
//函数名:		CMD_ReadFile
//
//调用关系:	被	外部函数	调用。
//
//功能描述:	读文件。
//
//入口参数:	DataLength	要读的数据长度
//
//返回值:		是否读成功。
//============================================================================================================
BOOL	CMD_ReadFile(	DWORD*	DataLength	)
{
	WORD	i,	j;

	vCMD_pCommand->Parameter[0]	=	*DataLength;
	vCMD_pCommand->Parameter[1]	=	*DataLength>>8;

	vCMD_pCommand->Command	=	cCMD_CMD_READ_FILE;

	CMD_DoCommand(66,	64	+	*DataLength,	cCMD_CMD_READ_FILE_RSP);
	i	=	SPI_GetReadCounter();
	if	(i	<	63)
	{	return	FALSE;	}
	else
	{
		if	((vCMD_pStatus->Command	==	cCMD_CMD_READ_FILE_RSP)	&&	(vCMD_pStatus->Result))
		{
			j	=	vCMD_pStatus->Parameter[0]	+	vCMD_pStatus->Parameter[1]	*	256;
			if	(i	>=	(j+64))
			{
				*DataLength	=	j;
				return	TRUE;
			}
			else
			{	return	FALSE;	}
		}
		else
		{	return	FALSE;	}
	}
}
//============================================================================================================
//函数名:		CMD_CreateFile
//
//调用关系:	被	外部函数	调用。
//
//功能描述:	创建文件。
//
//入口参数:	pFileName	文件名,必须8个字节
//				pExtName	扩展名,必须3个字节
//
//返回值:		是否创建成功。
//============================================================================================================
BOOL	CMD_CreateFile(	char*	pFileName,	char*	pExtName	)
{
	PFS_DirItem	pItem;
	DWORD	i;

	pItem	=	(PFS_DirItem)&(vCMD_pCommand->Parameter[0]);

	//清空
	for	(i=0;	i<11;	i++)
	{
		vCMD_pCommand->Parameter[i]	=	0x20;
	}
	for	(i=12;	i<63;	i++)
	{
		vCMD_pCommand->Parameter[i]	=	0;
	}

	//复制文件名和扩展名
	for	(i=0;	i<8;	i++)
	{
		if	(pFileName[i]	==	0)
			break;
		pItem->FileName[i]	=	pFileName[i];
	}
	for	(i=0;	i<3;	i++)
	{
		pItem->ExtName[i]	=	pExtName[i];
		if	(pExtName[i]	==	0)
			break;
	}

	pItem->Attribute		=	cFS_ATTR_ARCHIVE;
	pItem->ResForNT			=	0x0;
	pItem->CreateTimeTenth	=	88;
	pItem->CreateTime		=	0x4104;
	pItem->CreateDate		=	0x3908;
	pItem->LastAccDate		=	0x3908;
	pItem->StartClusterHI	=	0;
	pItem->Time				=	0x4104;
	pItem->Data				=	0x3908;
	pItem->StartClusterLO	=	0;
	pItem->FileLength		=	0;


	vCMD_pCommand->Command	=	cCMD_CMD_CREATE_FILE;

	if	(!CMD_DoCommand(66,	64,	cCMD_CMD_CREATE_FILE_RSP))
	{	return	FALSE;	}
	else
	{
		return	((vCMD_pStatus->Command	==	cCMD_CMD_CREATE_FILE_RSP)	&&	(vCMD_pStatus->Result));
	}
}
//============================================================================================================
//函数名:		CMD_OpenFile
//
//调用关系:	被	外部函数	调用。
//
//功能描述:	打开文件。
//
//入口参数:	pFileName	文件名,必须8个字节
//				pExtName	扩展名,必须3个字节
//
//返回值:		是否打开成功。
//============================================================================================================
BOOL	CMD_OpenFile(	char*	pFileName,	char*	pExtName	)
{
	DWORD	i;

	//复制文件名和扩展名
	for	(i=0;	i<8;	i++)
		vCMD_pCommand->Parameter[i]	=	pFileName[i];
	for	(i=0;	i<3;	i++)
		vCMD_pCommand->Parameter[i+8]	=	pExtName[i];

	vCMD_pCommand->Command	=	cCMD_CMD_OPEN_FILE;

	if	(!CMD_DoCommand(66,	64,	cCMD_CMD_OPEN_FILE_RSP))
	{	return	FALSE;	}
	else
	{
		return	((vCMD_pStatus->Command	==	cCMD_CMD_OPEN_FILE_RSP)	&&	(vCMD_pStatus->Result));
	}
}
//============================================================================================================
//函数名:		CMD_SetPointer
//
//调用关系:	被	外部函数	调用。
//
//功能描述:	写文件。
//
//入口参数:	FilePointer	文件指针
//
//返回值:		是否写成功。
//============================================================================================================
BOOL	CMD_SetPointer(	DWORD	FilePointer	)

⌨️ 快捷键说明

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