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

📄 main.c

📁 基于ucos-ii的Usb_I2C+ucos-i源码
💻 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"						 //包含LPC22xx 模板的配置头文件
#include "D13Driver.h"					 //包含D13 驱动程序的头文件
#include "I2C.h"						 //包含I2C 总线中间件的头文件

#define PAGE_SIZE_CAT1025	 16			 //CAT1025 的页面大小:16字节
#define CMD_READ_CAT1025	 0x01		 //读CAT1025 命令
#define CMD_WRITE_CAT1025	 0x02		 //写CAT1025 命令

OS_STK  TaskStartStk[128];				 //操作系统起动任务堆栈
OS_STK  ReadTaskStk[256];				 //读任务堆栈
OS_STK  WriteTaskStk[256];				 //写任务堆栈

OS_EVENT *Write_Sem;					 //读任务就绪信号量
OS_EVENT *Read_Sem;						 //写任务就绪信号量

void Init_I2CInt(void);					 //I2C中断初始化程序
INT16U Read_CAT1025(INT8U addr,INT8U offset,INT16U len,INT8U *recbuff);
INT16U Write_CAT1025(INT8U addr,INT8U offset,INT16U len,INT8U *sendbuff);

void TaskStart(void *pdata);	
void TaskRead(void *pdata);
void TaskWrite(void *pdata);

extern void Usb_Handler(void);

/************************************************************
** 函数名称: void Init_D13Int(void)
** 功能描述: 初始化D13 的中断,设置 D13 的中服务程序地址
** 输   入: 无
** 输   出: 无
*************************************************************/
void Init_D13Int(void)
{
	VICVectCntl1 = (0x20 | 14);				//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], 3);
    							            //创建起动任务
    OSStart();                              //开始多任务
}

/************************************************************
*         起动任务, 优先级 3
*************************************************************/
void  TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3          		/* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;	
#endif
	INT8U err,cmd;
	pdata = pdata;               	 		/* Prevent compiler warning */

	TargetInit();          		 	 		//μC/OS-II定时器及相关中断初始化
	I2cInit(30000);				 			//I2C控制器初始化	
	Init_I2CInt();					 		//初始化I2C的中断
	Init_D13Int();					 		//配置D13的中断
	err = Init_D13();			  			//D13初始化
	
	Write_Sem = OSSemCreate(0);	 	 		//创建控制读写任务的两个信号量,信号量初值为0
	Read_Sem  = OSSemCreate(0);   
	OSTaskCreate(TaskRead, (void *)0, &ReadTaskStk[255], 1);	   	//创建读任务
	OSTaskCreate(TaskWrite, (void *)0, &WriteTaskStk[255], 2);		//创建写任务
			            
	if (err == 0)				  									//如果初始化D13成功,才创建传输控制处理任务
  		OSTaskCreate(TaskSetup, (void *)0, &TaskSetupStk[127], 0);
  		
  	for (;;)
  	{
  		err = ReadPort1(1, &cmd, 200);								//等待来自 PC 命令
		if (err == OS_NO_ERR)
		{															//接收正确
			if (cmd == CMD_READ_CAT1025)				
				OSSemPost(Read_Sem);								//使读任务就绪
			if (cmd == CMD_WRITE_CAT1025)
				OSSemPost(Write_Sem);								//使写任务就绪
		} 		 
    }  
 }

/************************************************************
** 函数名称: void TaskRead(void *pdata)
** 功能描述: 写 CAT1025 任务,优先级为1
** 输 入:   无
** 输 出:   无
*************************************************************/
void TaskRead(void *pdata)
{
#if OS_CRITICAL_METHOD == 3          						 /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif
	INT8U err,buff[260];			  						 //接收缓冲区
	INT8U ack = 0x01;				  						 //应答字
	INT16U reclen;
	
	for (;;)
	{ 
	   	OSSemPend(Read_Sem, 0, &err);						 //等待TaskStart读命令
    	err = WritePort1(1, &ack, 200);						 //应答PC主机
    	if (err == USB_NO_ERR)
    	{						 							 //应答正确
  	   		reclen = Read_CAT1025(0xA0, 0, 256, &buff[2]);   //读取数据   			
    																	
    		buff[0] = reclen / 256;
    		buff[1] = reclen % 256;
  	 		WritePort2(258, buff, 200);			    		 //发送读取到的数据
   	  	}
    }
}

/************************************************************
** 函数名称: void TaskWrite(void *pdata)
** 功能描述: 写 CAT1025 任务,优先级为2
** 输 入:   无
** 输 出:   无
*************************************************************/
void TaskWrite(void *pdata)
{
#if OS_CRITICAL_METHOD == 3          			    		/* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif
	INT8U err,buff[260];									//发送缓冲区
	INT8U ack = 0x02;										//应答字
	INT16U actlen;
	
	for (;;)
	{ 
	   	OSSemPend(Write_Sem, 0, &err);						//等待TaskStart的命令
        err = WritePort1(1, &ack, 200);						//应答PC机
    	if (err == USB_NO_ERR)
    	{													//应答正确
       		err = ReadPort2(256, buff, 200);				//接收要写入的数据
       		if (err == USB_NO_ERR)
       		{												//接收正确
    			actlen = Write_CAT1025(0xA0, 0, 256, buff); //执行写入  		
    		    		
    			buff[0] = actlen / 256;
    			buff[1] = actlen % 256;
       			WritePort1(2, buff, 200);					//发送实际写入的字节数
       		}
   	  	}
    }
}

/********************************************************************************
** 函数名称: INT16U Read_CAT1025(INT8U addr,INT8U offset,INT16U len,INT8U *recbuff)
** 功能描述: 从CAT1025读取数据
** 输 入:   INT8U  addr:	    CAT1025的 I2C 总线地址
			 INT8U  offset:		偏移地址 
			 INT16U len:		读的长度
			 INT8U  *recbuff:   接收数据指针
** 输 出:   实际读取到的字节数
*********************************************************************************/
INT16U Read_CAT1025(INT8U addr,INT8U offset,INT16U len,INT8U *recbuff)
{
	INT16U actlen = 0;
	
	actlen = I2cRead(addr, recbuff, &offset, 1, len);   		//读取数据并记录读到的字节数
											
	return actlen;												//返回实际读到的字节数
}


/************************************************************************************
** 函数名称: INT16U Write_CAT1025(INT8U addr,INT8U offset,INT16U len,INT8U *sendbuff)
** 功能描述: 向 CAT1025 写入数据
** 输 入:   INT8U  addr:	    CAT1025 I2C 总线地址
			 INT8U  offset:		偏移地址 
			 INT16U len:		读的长度
			 INT8U  *sendbuff:  接收数据指针
** 输 出:   实际写入的字节数
*************************************************************************************/
INT16U Write_CAT1025(INT8U addr,INT8U offset,INT16U len,INT8U *sendbuff)
{
	INT8U pages,nums,i;
	INT8U buff[PAGE_SIZE_CAT1025 + 1];								//写入缓冲区
	INT16U actlen = 0;
	
	pages = len / PAGE_SIZE_CAT1025;								//CAT1025一次只能写一页,一页为16字节?
	nums  = len % PAGE_SIZE_CAT1025;								//不够整数页的字节数
	buff[0] = offset;					    						//buff[0]为写入偏移地址

	for (i = 0; i < pages; i++)
	{
		memcpy(&buff[1], sendbuff, PAGE_SIZE_CAT1025);		  		//将要写入的数据复制到写入缓冲区
		actlen += I2cWrite(addr,buff, PAGE_SIZE_CAT1025 + 1) - 1;   //写入数据并记录已写入的字节数
		OSTimeDly(OS_TICKS_PER_SEC / 100 + 1);		  			    //延时10ms的时间让CAT1025
												  				    //内部执行写操作
   		sendbuff += PAGE_SIZE_CAT1025;
	   	buff[0]  += PAGE_SIZE_CAT1025;
	}

	if (nums > 0)
	{																//下面写不够整数页的字节数
		memcpy(&buff[1], sendbuff, nums);
		actlen += I2cWrite(addr, buff, nums + 1) - 1;
		OSTimeDly(OS_TICKS_PER_SEC / 100 + 1);
 	}
	
	return actlen;													//返回实际写入的字节数
}


/************************************************************************************
** 函数名称: void Init_I2CInt(void)
** 功能描述: 初始化I2C总线控制器的中断
** 输 入:   无
** 输 出:   无
*************************************************************************************/
void Init_I2CInt(void)
{
	extern void I2c_Handler(void);
	
    VICVectAddr12 = (uint32)I2c_Handler;							// 设置I2C中断向量地址
    VICVectCntl12 = (0x20 | 9);										// I2C中断分配到IRQ slot 2
   	//VICIntEnable = 1 << 9;										// 暂时不允许I2C中断
 }   

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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