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

📄 main.c

📁 在ZLG的LPC211X开发板上没有D12 USB驱动的源程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        产品一部 
**
**                                 http://www.zlgmcu.com
**
** 文   件   名: Main.c
** 最后修改日期: 2004年7月2日
** 描        述: PDIUSBD12 设备端驱动程序 演示程序
** 版	     本: V1.0
**********************************************************************************************************/

#include "config.h"							//包含LPC22xx模板的配置头文件
#include "D12Driver.h"						//包含PDIUSBD12驱动程序的头文件

OS_STK  TaskStartStk[128];					//操作系统起动任务堆栈
OS_STK  TaskRec1Stk[400];					//任务1堆栈(400个字)
OS_STK  TaskRec2Stk[400];					//任务2堆栈(400个字)

OS_EVENT *TaskRec1_Sem;						//任务1就绪信号量
OS_EVENT *TaskRec2_Sem;						//任务2就绪信号量

void TaskStart(void *pdata);
void TaskRec1(void *pdata);
void TaskRec2(void *pdata);

extern void Usb_Handler(void);
/************************************************************
** 函数名称: void Init_D12Int(void)
** 功能描述: 初始化D12的中断,设置D12的中服务程序地址
** 输   入: 无
** 输   出: 无
************************************************************/
void Init_D12Int(void)
{
	VICVectCntl1 = (0x20 | 0x0E);			//EINT0通道分配到IRQ slot 1
   	VICVectAddr1 = (INT32U)Usb_Handler;		//设置EINT0向量地址
   	VICIntEnable = 1 << 14;					//允许EINT0
}

/**********************************
			主函数
***********************************/
int main (void)
{
    OSInit();                   			//初始化 uC/OS-II
    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[127], 1);
    									    //创建起动任务
    OSStart();                   			//开始多任务
    
}

/**********************************
*       起动任务,优先级 3
***********************************/
void  TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3      			 /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif
	INT8U Cmd,err;
				 	 
	pdata = pdata;               	 		/* Prevent compiler warning */
    IO0SET = LED;
    TargetInit();          		 			//LPC2200开发板初始化
	
	
	err = Init_D12();			  			//PDIUSBD12初始化
	
	Init_D12Int();					 		//配置PDIUSBD12的中断
    IO0CLR = LED; 
    OSTimeDly(OS_TICKS_PER_SEC);       
    TaskRec1_Sem = OSSemCreate(0);	 		//创建两个信号量,信号量初值为0
	TaskRec2_Sem = OSSemCreate(0);   
	
	if (err == 0)				  			//如果初始化PDIUSBD12成功,才创建控制传输处理任务
  		
  		 OSTaskCreate(TaskSetup,(void *)0, &TaskSetupStk[127], 0);
  		
  		else IO0SET = LED;	
	OSTaskCreate(TaskRec1,(void *)0, &TaskRec1Stk[399], 3);				//创建任务1和任务2
	OSTaskCreate(TaskRec2,(void *)0, &TaskRec2Stk[399], 4);
    	 
    for (;;){
		err = ReadPort1(1,&Cmd,200);		//等待来自PC机的命令
		if (err == OS_NO_ERR){				//接收正确
			if (Cmd == 0x01)				
				OSSemPost(TaskRec1_Sem);	//使任务1就绪
			else
				OSSemPost(TaskRec2_Sem);	//使任务2就绪
		} 		 
    }
}

#define RW_NUMS	1024			 					//任务1和任务2收发数据字节数

/********* 任务 1 ***********/
void  TaskRec1(void *pdata)
{
#if OS_CRITICAL_METHOD == 3       					/* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif
	INT8U Buff[RW_NUMS];		 					//接收及发送缓冲区
	INT8U ack = 0x01; 			 					//应答主机数值
	INT8U err;					 					//函数返回值
	
	pdata = pdata;               					/* Prevent compiler warning */
	
   	for (;;){ 
    	OSSemPend(TaskRec1_Sem,0,&err);				//等待TaskStart的命令
    	err = WritePort1(1,&ack,200);				//应答USB主机
    	if (err == USB_NO_ERR){						//应答正确
    		err = ReadPort2(RW_NUMS,Buff,200);		//接收数据
    		OSTimeDly(1);							//延时一个时钟周期
    		if (err == USB_NO_ERR){					//接收正确
    			Buff[0] = OSPrioCur;				//标识该任务
   	  	 		err = WritePort2(RW_NUMS,Buff,200);	//发送数据
   	  		}
   	  	}
    }
}


/********* 任务 2 ***********/
void  TaskRec2(void *pdata)
{
#if OS_CRITICAL_METHOD == 3       					/* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif
	INT8U Buff[RW_NUMS];		  					//接收及发送缓冲区
	INT8U ack = 0x02;			 					//应答主机数值
	INT8U err;					  					//函数返回值	 
	
	pdata = pdata;               					/* Prevent compiler warning                 */
	
   	for (;;){
    	OSSemPend(TaskRec2_Sem,0,&err);				//等待TaskStart的命令
    	err = WritePort1(1,&ack,200);				//应答USB主机
    	if (err == USB_NO_ERR){						//应答正确	
    		err = ReadPort2(RW_NUMS,Buff,200);		//接收数据
    		if (err == OS_NO_ERR){					//接收正确
    			Buff[0] = 0x02;						//标识该任务	
   	  	 		err = WritePort2(RW_NUMS,Buff,200);	//发送数据
   	  		}
   	  	}
    }
}

/*
    配套书中的D12 PACK原理图有错,正确原理图请见光盘文件的说明: 关于对D12PACK硬件的修改.pdf

	AD0   --  P3.0
	CS_USB--  P3.25
	RD    --  P1.1
	WR    --  P3.27
	RST_USB-  P0.10
	SUSP  --  P0.13
	D0-D7 --  P2.0-P2.7
	VBUS  --  P0.15
	INT_USB-  P0.16
*/

⌨️ 快捷键说明

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