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

📄 main.c

📁 周立功 214x pack 配套光盘
💻 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 "USBConfig.h"							/* 软件包的配置头文件   */
#include "USBDriver.h"							/* 软件包 API 函数头文件  */
#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[512];				 		/* 操作系统起动任务堆栈 */

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);	
extern void Usb_Handler(void);

/*****************************************************************************
** 函数名称: Init_USBInterrupt()
** 功能描述: 设置LPC214x USB 设备控制器的中断向量号以及优先级
******************************************************************************/
void Init_USBInterrupt(void)
{
	VICVectCntl1 = (0x20 | 22);					/* USB 中断通道分配到IRQ slot 0 */
   	VICVectAddr1 = (INT32U)Usb_Handler;			/* 设置 USB 中断向量地址 */
   	VICIntEnable = 1 << 22;						/* 允许 USB 中断 */
}

/************************************************************
			主  函  数
*************************************************************/
int main (void)
{
    OSInit();                               	/* 初始化 uC/OS-II */
    
    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[511], 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, buff[258];
	INT16U reclen,actlen;
	pdata = pdata;               	 			/* Prevent compiler warning */

	TargetInit();          		 	 			/* μC/OS-II定时器及相关中断初始化 */
	I2cInit(30000);				 				/* I2C 控制器初始化	 */
	Init_I2CInt();					 			/* 初始化 I2C 的中断 */
	Init_USBInterrupt();						/* 配置 USB 的中断 */
	err = USB_Initialize();			  			/* USB 初始化 */
	      
	if (err == 0)				  				/* 初始化USB成功,才创建传输控制处理任务 */
  		OSTaskCreate(TaskSetup, (void *)0, &TaskSetupStk[127], 0);
  		
  	for (;;)
  	{
  		err = ReadPort1(1, &cmd, 0);								/* 等待来自 PC 命令 */
		if (err == OS_NO_ERR)
		{															/* 接收正确 */
			if (cmd == CMD_READ_CAT1025)
			{
				reclen = Read_CAT1025(0xA0, 0, 256, &buff[2]);   	/* 读取数据 */  			
    			buff[0] = reclen / 256;
    			buff[1] = reclen % 256;
  	 			WritePort2(258, buff, 200);			    		 	/* 发送读取到的数据 */
			}
						
			if (cmd == CMD_WRITE_CAT1025)
			{
				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);						/* 发送实际写入的字节数 */
       			}
       		}
 
		}//end of if (err == OS_NO_ERR) 	

    }//end of for(;;)  
 
}
 


/********************************************************************************
** 函数名称: 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 + -